From 007a8e8a1570ba812f52f0255837572693792fb2 Mon Sep 17 00:00:00 2001 From: Olaf Fricke Date: Sat, 1 May 2021 21:11:53 +0200 Subject: [PATCH 001/154] Issue 1635: Decypting PDF ebboks fixed --- DeDRM_plugin/ineptpdf.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 9eb2154a..e8385fe8 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1204,7 +1204,7 @@ def decode(self): for i in range(0, len(data), columns+1): pred = data[i] ent1 = data[i+1:i+1+columns] - if pred == b'\x02': + if pred == 2: ent1 = b''.join(bytes([(a+b) & 255]) \ for (a,b) in zip(ent0,ent1)) buf += ent1 @@ -1349,8 +1349,8 @@ def load(self, parser, debug=0): raise PDFNoValidXRef('Invalid PDF stream spec.') size = stream.dic['Size'] index = stream.dic.get('Index', (0,size)) - self.index = zip(itertools.islice(index, 0, None, 2), - itertools.islice(index, 1, None, 2)) + self.index = list(zip(itertools.islice(index, 0, None, 2), + itertools.islice(index, 1, None, 2))) (self.fl1, self.fl2, self.fl3) = stream.dic['W'] self.data = stream.get_data() self.entlen = self.fl1+self.fl2+self.fl3 From 8e10b090a2b198f10e188018760256f9f6bbe4d4 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 08:40:18 +0100 Subject: [PATCH 002/154] More PDF fixes --- DeDRM_plugin/ineptpdf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index e8385fe8..110edae8 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -442,7 +442,7 @@ def nunpack(s, default=0): elif l == 2: return struct.unpack('>H', s)[0] elif l == 3: - return struct.unpack('>L', b'\x00'+s)[0] + return struct.unpack('>L', bytes([0]) + s)[0] elif l == 4: return struct.unpack('>L', s)[0] else: From 0005bba3c3767f32759dd237a09053de2ae55b1e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 09:43:12 +0100 Subject: [PATCH 003/154] Remove broken CI --- .github/workflows/Format.yaml | 39 ----------------------------------- .github/workflows/Lint.yaml | 26 ----------------------- 2 files changed, 65 deletions(-) delete mode 100644 .github/workflows/Format.yaml delete mode 100644 .github/workflows/Lint.yaml diff --git a/.github/workflows/Format.yaml b/.github/workflows/Format.yaml deleted file mode 100644 index 32f0226f..00000000 --- a/.github/workflows/Format.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: Python code format -on: - push: - branches: master -jobs: - Format: - if: "contains(github.event.head_commit.message, '!format')" - runs-on: ubuntu-20.04 - strategy: - fail-fast: false - steps: - - uses: actions/checkout@main - - name: Set up Python - uses: actions/setup-python@main - with: - python-version: 3.x - - uses: actions/cache@main - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-format - restore-keys: | - ${{ runner.os }}-pip-format - - name: Install dependencies - run: | - python -m pip install --upgrade pip - python -m pip install autopep8 pycodestyle - - name: Format by autopep8 then Push - env: - GIT_EMAIL: github-actions[bot]@users.noreply.github.com - GIT_ACTOR: github-actions[bot] - run: | - export HASH_SHORT=$(git rev-parse --short HEAD) - git checkout -b format--${HASH_SHORT} - git config --global user.email $GIT_EMAIL - git config --global user.name $GIT_ACTOR - python -m autopep8 --in-place --aggressive --aggressive --experimental -r ./ - git add -A - git commit -m 'Format by autopep8' -m From: -m $(git rev-parse HEAD) - git push --set-upstream origin format--${HASH_SHORT} diff --git a/.github/workflows/Lint.yaml b/.github/workflows/Lint.yaml deleted file mode 100644 index aae3e055..00000000 --- a/.github/workflows/Lint.yaml +++ /dev/null @@ -1,26 +0,0 @@ -name: Python code review -on: [push, pull_request] -jobs: - Test: - runs-on: ubuntu-20.04 - strategy: - fail-fast: false - steps: - - uses: actions/checkout@main - - name: Set up Python - uses: actions/setup-python@main - with: - python-version: 3.x - - uses: actions/cache@main - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-lint - restore-keys: | - ${{ runner.os }}-pip-lint - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install flake8 - - name: Lint with flake8 - run: | - python -m flake8 . --builtins=_,I --ignore=E501 --count --benchmark --show-source --statistics From 14947cd10cd502e21f21a5b144d9a185f8ba9f3a Mon Sep 17 00:00:00 2001 From: journeyman88 <36702557+journeyman88@users.noreply.github.com> Date: Mon, 26 Apr 2021 12:24:57 +0200 Subject: [PATCH 004/154] Update obok.py Changed MAC address fetching code to address possibile regression --- Obok_plugin/obok/obok.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index ba480ec3..00f2207c 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -471,11 +471,18 @@ def __getmacaddrs (self): macaddrs = [] if sys.platform.startswith('win'): c = re.compile('\s?(' + '[0-9a-f]{2}[:\-]' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) - output = subprocess.Popen('wmic nic where PhysicalAdapter=True get MACAddress', shell=True, stdout=subprocess.PIPE, text=True).stdout - for line in output: - m = c.search(line) - if m: - macaddrs.append(re.sub("-", ":", m.group(1)).upper()) + try: + output = subprocess.Popen('ipconfig /all', shell=True, stdout=subprocess.PIPE, text=True).stdout + for line in output: + m = c.search(line) + if m: + macaddrs.append(re.sub("-", ":", m.group(1)).upper()) + except: + output = subprocess.Popen('wmic nic where PhysicalAdapter=True get MACAddress', shell=True, stdout=subprocess.PIPE, text=True).stdout + for line in output: + m = c.search(line) + if m: + macaddrs.append(re.sub("-", ":", m.group(1)).upper()) elif sys.platform.startswith('darwin'): c = re.compile('\s(' + '[0-9a-f]{2}:' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) output = subprocess.check_output('/sbin/ifconfig -a', shell=True, encoding='utf-8') From 066e613ceeb4cf569b2b2a832a95b86213d6382c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 10:47:09 +0100 Subject: [PATCH 005/154] Add UUID to adobekey DER file names --- DeDRM_plugin/__init__.py | 20 ++++++++++++++------ DeDRM_plugin/adobekey.py | 39 +++++++++++++++++++++++++++++---------- DeDRM_plugin/wineutils.py | 4 +++- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 8af84b19..44378628 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -355,12 +355,12 @@ def ePubDecrypt(self,path_to_ebook): if iswindows or isosx: from calibre_plugins.dedrm.adobekey import adeptkeys - defaultkeys = adeptkeys() + defaultkeys, defaultnames = adeptkeys() else: # linux from .wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"adobekey.py") - defaultkeys = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) self.default_key = defaultkeys[0] except: @@ -369,9 +369,13 @@ def ePubDecrypt(self,path_to_ebook): self.default_key = "" newkeys = [] + newnames = [] + idx = 0 for keyvalue in defaultkeys: if codecs.encode(keyvalue, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): newkeys.append(keyvalue) + newnames.append(defaultnames[idx]) + idx += 1 if len(newkeys) > 0: try: @@ -394,7 +398,7 @@ def ePubDecrypt(self,path_to_ebook): # Store the new successful key in the defaults print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) try: - dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key',codecs.encode(keyvalue, 'hex').decode('ascii')) + dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key_uuid_' + newnames[i], codecs.encode(userkey, 'hex').decode('ascii')) dedrmprefs.writeprefs() print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except: @@ -458,12 +462,12 @@ def PDFDecrypt(self,path_to_ebook): if iswindows or isosx: from calibre_plugins.dedrm.adobekey import adeptkeys - defaultkeys = adeptkeys() + defaultkeys, defaultnames = adeptkeys() else: # linux from .wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"adobekey.py") - defaultkeys = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) self.default_key = defaultkeys[0] except: @@ -472,9 +476,13 @@ def PDFDecrypt(self,path_to_ebook): self.default_key = "" newkeys = [] + newnames = [] + idx = 0 for keyvalue in defaultkeys: if codecs.encode(keyvalue,'hex') not in dedrmprefs['adeptkeys'].values(): newkeys.append(keyvalue) + newnames.append(defaultnames[idx]) + idx += 1 if len(newkeys) > 0: try: @@ -497,7 +505,7 @@ def PDFDecrypt(self,path_to_ebook): # Store the new successful key in the defaults print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) try: - dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key',codecs.encode(keyvalue,'hex')) + dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key_uuid_' + newnames[i], codecs.encode(userkey,'hex').decode('ascii')) dedrmprefs.writeprefs() print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except: diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 489c5950..5412b865 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -362,6 +362,7 @@ def adeptkeys(): keykey = CryptUnprotectData(device, entropy) userkey = None keys = [] + names = [] try: plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) except WindowsError: @@ -374,12 +375,15 @@ def adeptkeys(): ktype = winreg.QueryValueEx(plkparent, None)[0] if ktype != 'credentials': continue + uuid_name = "Unknown" for j in range(0, 16): try: plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) except WindowsError: break ktype = winreg.QueryValueEx(plkkey, None)[0] + if ktype == 'user': + uuid_name = winreg.QueryValueEx(plkkey, 'value')[0] if ktype != 'privateLicenseKey': continue userkey = winreg.QueryValueEx(plkkey, 'value')[0] @@ -387,12 +391,13 @@ def adeptkeys(): aes = AES(keykey) userkey = aes.decrypt(userkey) userkey = userkey[26:-ord(userkey[-1:])] - #print "found key:",userkey.encode('hex') + # print ("found " + uuid_name + " key: " + str(userkey)) keys.append(userkey) + names.append(uuid_name[9:]) if len(keys) == 0: raise ADEPTError('Could not locate privateLicenseKey') print("Found {0:d} keys".format(len(keys))) - return keys + return keys, names elif isosx: @@ -431,19 +436,25 @@ def adeptkeys(): tree = etree.parse(actpath) adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey')) + exprUUID = '//%s/%s' % (adept('credentials'), adept('user')) userkey = tree.findtext(expr) + userUUID = "Unknown" + try: + userUUID = tree.findtext(exprUUID) + except: + pass userkey = b64decode(userkey) userkey = userkey[26:] - return [userkey] + return [userkey], [userUUID[9:]] else: def adeptkeys(): raise ADEPTError("This script only supports Windows and Mac OS X.") - return [] + return [], [] # interface for Python DeDRM def getkey(outpath): - keys = adeptkeys() + keys, names = adeptkeys() if len(keys) > 0: if not os.path.isdir(outpath): outfile = outpath @@ -452,15 +463,17 @@ def getkey(outpath): print("Saved a key to {0}".format(outfile)) else: keycount = 0 + name_index = 0 for key in keys: while True: keycount += 1 - outfile = os.path.join(outpath,"adobekey_{0:d}.der".format(keycount)) + outfile = os.path.join(outpath,"adobekey{0:d}_uuid_{1}.der".format(keycount, names[name_index])) if not os.path.exists(outfile): break with open(outfile, 'wb') as keyfileout: keyfileout.write(key) print("Saved a key to {0}".format(outfile)) + name_index += 1 return True return False @@ -506,7 +519,7 @@ def cli_main(): # make sure the outpath is the outpath = os.path.realpath(os.path.normpath(outpath)) - keys = adeptkeys() + keys, names = adeptkeys() if len(keys) > 0: if not os.path.isdir(outpath): outfile = outpath @@ -515,15 +528,17 @@ def cli_main(): print("Saved a key to {0}".format(outfile)) else: keycount = 0 + name_index = 0 for key in keys: while True: keycount += 1 - outfile = os.path.join(outpath,"adobekey_{0:d}.der".format(keycount)) + outfile = os.path.join(outpath,"adobekey{0:d}_uuid_{1}.der".format(keycount, names[name_index])) if not os.path.exists(outfile): break with open(outfile, 'wb') as keyfileout: keyfileout.write(key) print("Saved a key to {0}".format(outfile)) + name_index += 1 else: print("Could not retrieve Adobe Adept key.") return 0 @@ -556,12 +571,15 @@ def __init__(self, root, text): progpath, progname = os.path.split(argv[0]) success = False try: - keys = adeptkeys() + keys, names = adeptkeys() + print(keys) + print(names) keycount = 0 + name_index = 0 for key in keys: while True: keycount += 1 - outfile = os.path.join(progpath,"adobekey_{0:d}.der".format(keycount)) + outfile = os.path.join(progpath,"adobekey{0:d}_uuid_{1}.der".format(keycount, names[name_index])) if not os.path.exists(outfile): break @@ -569,6 +587,7 @@ def __init__(self, root, text): keyfileout.write(key) success = True tkinter.messagebox.showinfo(progname, "Key successfully retrieved to {0}".format(outfile)) + name_index += 1 except ADEPTError as e: tkinter.messagebox.showerror(progname, "Error: {0}".format(str(e))) except Exception: diff --git a/DeDRM_plugin/wineutils.py b/DeDRM_plugin/wineutils.py index f48f4b19..071e0da1 100644 --- a/DeDRM_plugin/wineutils.py +++ b/DeDRM_plugin/wineutils.py @@ -93,6 +93,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): # try finding winekeys anyway, even if above code errored winekeys = [] + winekey_names = [] # get any files with extension in the output dir files = [f for f in os.listdir(outdirpath) if f.endswith(extension)] for filename in files: @@ -104,9 +105,10 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): else: new_key_value = keyfile.read() winekeys.append(new_key_value) + winekey_names.append(filename) except: print("{0} v{1}: Error loading file {2}".format(PLUGIN_NAME, PLUGIN_VERSION, filename)) traceback.print_exc() os.remove(fpath) print("{0} v{1}: Found and decrypted {2} {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(winekeys), "key file" if len(winekeys) == 1 else "key files")) - return winekeys + return winekeys, winekey_names From 0313088c15faac2679776d236cc1cf0141cb505e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 10:56:26 +0100 Subject: [PATCH 006/154] Make keys fit into listbox --- DeDRM_plugin/config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 3d0f321a..22eeb947 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -290,6 +290,8 @@ def populate_list(self): for key in self.plugin_keys: self.listy.addItem(QListWidgetItem(key)) + self.listy.setMinimumWidth(self.listy.sizeHintForColumn(0) + 20) + def add_key(self): d = self.create_key(self) d.exec_() From 95fc924d1a4e4ca77c39ceaa0255166229ba838f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 11:00:06 +0100 Subject: [PATCH 007/154] Update Readme --- DeDRM_plugin/__init__.py | 3 ++- README.md | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 44378628..67c888d2 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -3,6 +3,7 @@ # __init__.py for DeDRM_plugin # Copyright © 2008-2020 Apprentice Harper et al. +# Copyright © 2021 NoDRM __license__ = 'GPL v3' __version__ = '7.2.1' @@ -129,7 +130,7 @@ class DeDRM(FileTypePlugin): name = PLUGIN_NAME description = "Removes DRM from Amazon Kindle, Adobe Adept (including Kobo), Barnes & Noble, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." supported_platforms = ['linux', 'osx', 'windows'] - author = "Apprentice Alf, Aprentice Harper, The Dark Reverser and i♥cabbages" + author = "Apprentice Alf, Apprentice Harper, NoDRM, The Dark Reverser and i♥cabbages" version = PLUGIN_VERSION_TUPLE minimum_calibre_version = (5, 0, 0) # Python 3. file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','azw8','tpz','kfx','kfx-zip']) diff --git a/README.md b/README.md index 5461e584..c587f7e5 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ Refer to [Wiki Page](https://github.com/apprenticeharper/DeDRM_tools/wiki/Exactl # DeDRM_tools DeDRM tools for ebooks +This is a fork of Apprentice Harper's version of the DeDRM tools. I've added some of the PRs that still haven't been merged, as well as added some more features / bugfixes myself. + +# Original README from Apprentice Harper + This is a repository that tracks all the scripts and other tools for removing DRM from ebooks that I could find, committed in date order as best as I could manage. (Except for the Requiem tools for Apple's iBooks, and Convert LIT for Microsoft's .lit ebooks.) This includes the tools from a time before Apprentice Alf had a blog, and continues through to when Apprentice Harper (with help) took over maintenance of the tools. The individual scripts are now released as two plugins for calibre: DeDRM and Obok. From 969fe52e13aa600bdd5d20f5a2304ca8e7a1b05c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 11:59:56 +0100 Subject: [PATCH 008/154] Improve key detection --- DeDRM_plugin/__init__.py | 46 ++++++++++++++++++++++++++++++++++++--- DeDRM_plugin/ineptepub.py | 38 +++++++++++++++++++++++++++++++- DeDRM_plugin/ineptpdf.py | 28 +++++++++++++++++++++--- 3 files changed, 105 insertions(+), 7 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 67c888d2..db31d4ed 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -317,7 +317,41 @@ def ePubDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.ineptepub as ineptepub if ineptepub.adeptBook(inf.name): - print("{0} v{1}: {2} is a secure Adobe Adept ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + book_uuid = None + try: + # This tries to figure out which Adobe account UUID the book is licensed for. + # If we know that we can directly use the correct key instead of having to + # try them all. + book_uuid = ineptepub.adeptGetUserUUID(inf.name) + except: + pass + + if book_uuid is None: + print("{0} v{1}: {2} is a secure Adobe Adept ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + else: + print("{0} v{1}: {2} is a secure Adobe Adept ePub for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) + + + if book_uuid is not None: + # Check if we have a key with that UUID in its name: + for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): + if not book_uuid.lower() in keyname.lower(): + continue + + # Found matching key + userkey = codecs.decode(userkeyhex, 'hex') + print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) + of = self.temporary_file(".epub") + try: + result = ineptepub.decryptBook(userkey, inf.name, of.name) + of.close() + if result == 0: + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + return of.name + except: + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): @@ -363,7 +397,10 @@ def ePubDecrypt(self,path_to_ebook): scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) - self.default_key = defaultkeys[0] + try: + self.default_key = defaultkeys[0] + except: + print("{0} v{1}: No ADE key found".format(PLUGIN_NAME, PLUGIN_VERSION)) except: print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -470,7 +507,10 @@ def PDFDecrypt(self,path_to_ebook): scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) - self.default_key = defaultkeys[0] + try: + self.default_key = defaultkeys[0] + except: + print("{0} v{1}: No ADE key found".format(PLUGIN_NAME, PLUGIN_VERSION)) except: print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 8bab7170..fe6fde22 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -393,6 +393,42 @@ def adeptBook(inpath): return True return False +# Checks the license file and returns the UUID the book is licensed for. +# This is used so that the Calibre plugin can pick the correct decryption key +# first try without having to loop through all possible keys. +def adeptGetUserUUID(inpath): + with closing(ZipFile(open(inpath, 'rb'))) as inf: + try: + rights = etree.fromstring(inf.read('META-INF/rights.xml')) + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + expr = './/%s' % (adept('user'),) + user_uuid = ''.join(rights.findtext(expr)) + if user_uuid[:9] != "urn:uuid:": + return None + return user_uuid[9:] + except: + return None + +def verify_book_key(bookkey): + if bookkey[-17] != '\x00' and bookkey[-17] != 0: + # Byte not null, invalid result + return False + + if ((bookkey[0] != '\x02' and bookkey[0] != 2) and + ((bookkey[0] != '\x00' and bookkey[0] != 0) or + (bookkey[1] != '\x02' and bookkey[1] != 2))): + # Key not starting with "00 02" or "02" -> error + return False + + keylen = len(bookkey) - 17 + for i in range(1, keylen): + if bookkey[i] == 0 or bookkey[i] == '\x00': + # Padding data contains a space - that's not allowed. + # Probably bad decryption. + return False + + return True + def decryptBook(userkey, inpath, outpath): if AES is None: raise ADEPTError("PyCrypto or OpenSSL must be installed.") @@ -416,7 +452,7 @@ def decryptBook(userkey, inpath, outpath): bookkey = rsa.decrypt(codecs.decode(bookkey.encode('ascii'), 'base64')) # Padded as per RSAES-PKCS1-v1_5 if len(bookkey) > 16: - if bookkey[-17] == '\x00' or bookkey[-17] == 0: + if verify_book_key(bookkey): bookkey = bookkey[-16:] else: print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 110edae8..85a0c2f5 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1587,6 +1587,26 @@ def initialize_standard(self, password, docid, param): self.ready = True return + def verify_book_key(self, bookkey): + if bookkey[-17] != '\x00' and bookkey[-17] != 0: + # Byte not null, invalid result + return False + + if ((bookkey[0] != '\x02' and bookkey[0] != 2) and + ((bookkey[0] != '\x00' and bookkey[0] != 0) or + (bookkey[1] != '\x02' and bookkey[1] != 2))): + # Key not starting with "00 02" or "02" -> error + return False + + keylen = len(bookkey) - 17 + for i in range(1, keylen): + if bookkey[i] == 0 or bookkey[i] == '\x00': + # Padding data contains a space - that's not allowed. + # Probably bad decryption. + return False + + return True + def initialize_ebx(self, password, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True rsa = RSA(password) @@ -1597,12 +1617,14 @@ def initialize_ebx(self, password, docid, param): expr = './/{http://ns.adobe.com/adept}encryptedKey' bookkey = codecs.decode(''.join(rights.findtext(expr)).encode('utf-8'),'base64') bookkey = rsa.decrypt(bookkey) - #if bookkey[0] != 2: - # raise ADEPTError('error decrypting book session key') + if len(bookkey) > 16: - if bookkey[-17] == '\x00' or bookkey[-17] == 0: + if (self.verify_book_key(bookkey)): bookkey = bookkey[-16:] length = 16 + else: + raise ADEPTError('error decrypting book session key') + ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) # added because of improper booktype / decryption book session key errors From cc17d9cc59b5ea339db2b31998b9da87804f0453 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 13:38:39 +0100 Subject: [PATCH 009/154] Improve key detection for PDFs, too --- DeDRM_plugin/__init__.py | 46 +++++++++++++++++++++++++++++++++++----- DeDRM_plugin/ineptpdf.py | 26 +++++++++++++++++++++++ 2 files changed, 67 insertions(+), 5 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index db31d4ed..bf2741f3 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -463,14 +463,49 @@ def ePubDecrypt(self,path_to_ebook): def PDFDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.ineptpdf - + import calibre_plugins.dedrm.ineptpdf as ineptpdf dedrmprefs = prefs.DeDRM_Prefs() - # Attempt to decrypt epub with each encryption key (generated or provided). - print("{0} v{1}: {2} is a PDF ebook".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + + book_uuid = None + try: + # Try to figure out which Adobe account this book is licensed for. + book_uuid = ineptpdf.adeptGetUserUUID(path_to_ebook) + except: + pass + + if book_uuid is None: + print("{0} v{1}: {2} is a PDF ebook".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + else: + print("{0} v{1}: {2} is a PDF ebook for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) + + if book_uuid is not None: + # Check if we have a key for that UUID + for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): + if not book_uuid.lower() in keyname.lower(): + continue + + # Found matching key + userkey = codecs.decode(userkeyhex, 'hex') + print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) + of = self.temporary_file(".pdf") + + try: + result = ineptpdf.decryptBook(userkey, path_to_ebook, of.name) + of.close() + if result == 0: + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + return of.name + except: + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + + + # If we end up here, we didn't find a key with a matching UUID, so lets just try all of them. + + # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): userkey = codecs.decode(userkeyhex,'hex') - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) + print("{0} v{1}: Trying encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".pdf") # Give the user key, ebook and TemporaryPersistent file to the decryption function. @@ -486,6 +521,7 @@ def PDFDecrypt(self,path_to_ebook): if result == 0: # Decryption was successful. # Return the modified PersistentTemporary file to calibre. + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) return of.name print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 85a0c2f5..2be0fbfd 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1992,6 +1992,32 @@ def do_keyword(self, pos, token): self.push((pos, token)) return + +# Takes a PDF file name as input, and if this is an ADE-protected PDF, +# returns the UUID of the user that's licensed to open this file. +def adeptGetUserUUID(inf): + try: + doc = PDFDocument() + pars = PDFParser(doc, inf) + + (docid, param) = doc.encryption + type = literal_name(param['Filter']) + if type != 'EBX_HANDLER': + # No EBX_HANDLER, no idea which user key can decrypt this. + return None + + rights = codecs.decode(param.get('ADEPT_LICENSE'), 'base64') + rights = zlib.decompress(rights, -15) + rights = etree.fromstring(rights) + expr = './/{http://ns.adobe.com/adept}user' + user_uuid = ''.join(rights.findtext(expr)) + if user_uuid[:9] != "urn:uuid:": + return None + return user_uuid[9:] + + except: + return None + ### ### My own code, for which there is none else to blame From 8cd3523a1767ec6a4072270afb514c55b7163d04 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 13:59:20 +0100 Subject: [PATCH 010/154] Remove library book block --- DeDRM_plugin/kfxdedrm.py | 6 ++++-- DeDRM_plugin/mobidedrm.py | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/DeDRM_plugin/kfxdedrm.py b/DeDRM_plugin/kfxdedrm.py index 67b10f8c..23e46dc7 100644 --- a/DeDRM_plugin/kfxdedrm.py +++ b/DeDRM_plugin/kfxdedrm.py @@ -92,8 +92,10 @@ def decrypt_voucher(self, totalpids): license_type = voucher.getlicensetype() if license_type != "Purchase": - raise Exception(("This book is licensed as {0}. " - 'These tools are intended for use on purchased books.').format(license_type)) + #raise Exception(("This book is licensed as {0}. " + # 'These tools are intended for use on purchased books.').format(license_type)) + print("Warning: This book is licensed as {0}. " + "These tools are intended for use on purchased books. Continuing ...".format(license_type)) self.voucher = voucher diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 79cd7204..8f1d79d3 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -446,7 +446,8 @@ def processBook(self, pidlist): data406 = self.meta_array[406] val406, = struct.unpack('>Q',data406) if val406 != 0: - raise DrmException("Cannot decode library or rented ebooks.") + print("Warning: This is a library or rented ebook ({1}). Continuing ...".format(val406)) + #raise DrmException("Cannot decode library or rented ebooks.") goodpids = [] # print("DEBUG ==== pidlist = ", pidlist) From 7058fbeb98bfbf0684888b8f136bd5c928870c9a Mon Sep 17 00:00:00 2001 From: matimatik Date: Thu, 30 Apr 2015 01:24:00 -0500 Subject: [PATCH 011/154] Added a code to remove Kindle watermark. https://github.com/matimatik/DeDRM_tools/commit/f3fbc3573eadc4b505ed296176f35cd5a917cdbf --- DeDRM_plugin/mobidedrm.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 8f1d79d3..844c3626 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -320,6 +320,9 @@ def __init__(self, infile): elif type == 404 and size == 9: # make sure text to speech is enabled self.patchSection(0, b'\0', 16 + self.mobi_length + pos + 8) + elif type == 208 and size == 219: + # remove watermark (atv:kin: stuff) + self.patchSection(0, '\0'*211, 16 + self.mobi_length + pos + 8) # print type, size, content, content.encode('hex') pos += size except Exception as e: From eae512da8cfd3737ea2bec44dcc51460fdaedb95 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 14:14:36 +0100 Subject: [PATCH 012/154] Remove library flag from MOBI book --- DeDRM_plugin/mobidedrm.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 844c3626..e5a212b0 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -320,9 +320,15 @@ def __init__(self, infile): elif type == 404 and size == 9: # make sure text to speech is enabled self.patchSection(0, b'\0', 16 + self.mobi_length + pos + 8) - elif type == 208 and size == 219: + elif type == 405 and size == 9: + # remove rented book flag + self.patchSection(0, b'\0', 16 + self.mobi_length + pos + 8) + elif type == 406 and size == 16: + # remove rental due date + self.patchSection(0, b'\0'*8, 16 + self.mobi_length + pos + 8) + elif type == 208: # remove watermark (atv:kin: stuff) - self.patchSection(0, '\0'*211, 16 + self.mobi_length + pos + 8) + self.patchSection(0, b'\0'*(size-8), 16 + self.mobi_length + pos + 8) # print type, size, content, content.encode('hex') pos += size except Exception as e: From 4a58f7017ce343184134d4469dd4d00166122552 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 14:30:32 +0100 Subject: [PATCH 013/154] Add old B&N algorihm (optional) just in case it's needed --- DeDRM_plugin/config.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 22eeb947..0b7b2570 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -10,7 +10,8 @@ from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, - QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl) + QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, + QCheckBox) from PyQt5 import Qt as QtGui from zipfile import ZipFile @@ -562,6 +563,11 @@ def __init__(self, parent=None,): data_group_box_layout.addWidget(ccn_disclaimer_label) layout.addSpacing(10) + self.chkOldAlgo = QCheckBox(_("Try to use the old algorithm")) + self.chkOldAlgo.setToolTip(_("Leave this off if you're unsure.")) + data_group_box_layout.addWidget(self.chkOldAlgo) + layout.addSpacing(10) + key_group = QHBoxLayout() data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Retrieved key:", self)) @@ -599,13 +605,25 @@ def cc_number(self): return str(self.cc_ledit.text()).strip() def retrieve_key(self): - from calibre_plugins.dedrm.ignoblekeyfetch import fetch_key as fetch_bandn_key - fetched_key = fetch_bandn_key(self.user_name,self.cc_number) - if fetched_key == "": - errmsg = "Could not retrieve key. Check username, password and intenet connectivity and try again." - error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - else: - self.key_display.setText(fetched_key) + + if self.chkOldAlgo.isChecked(): + # old method, try to generate + from calibre_plugins.dedrm.ignoblekeygen import generate_key as generate_bandn_key + generated_key = generate_bandn_key(self.user_name, self.cc_number) + if generated_key == "": + errmsg = "Could not generate key." + error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + else: + self.key_display.setText(generated_key.decode("latin-1")) + else: + # New method, try to connect to server + from calibre_plugins.dedrm.ignoblekeyfetch import fetch_key as fetch_bandn_key + fetched_key = fetch_bandn_key(self.user_name,self. cc_number) + if fetched_key == "": + errmsg = "Could not retrieve key. Check username, password and intenet connectivity and try again." + error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + else: + self.key_display.setText(fetched_key) def accept(self): if len(self.key_name) == 0 or len(self.user_name) == 0 or len(self.cc_number) == 0 or self.key_name.isspace() or self.user_name.isspace() or self.cc_number.isspace(): From be57bcca7da79c455aea2eed562d4e96ba6a09fe Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 14:39:48 +0100 Subject: [PATCH 014/154] Enable issue forms --- .github/ISSUE_TEMPLATE/QUESTION.md | 33 ----------------------- .github/ISSUE_TEMPLATE/QUESTION.yml | 41 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 33 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/QUESTION.md create mode 100644 .github/ISSUE_TEMPLATE/QUESTION.yml diff --git a/.github/ISSUE_TEMPLATE/QUESTION.md b/.github/ISSUE_TEMPLATE/QUESTION.md deleted file mode 100644 index cf79687f..00000000 --- a/.github/ISSUE_TEMPLATE/QUESTION.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: Question -about: Questions for DeDRM Project -title: "[QUESTION] Title" -labels: Question ---- - -## CheckList - -- [ ] `The Title` and The `Log Title` are setted correctly. -- [ ] Clarified about `my environment`. -- [ ] Code block is used for `the log`. - - - - ---- - -## Title - - -## My Environment -### Calibre: `Version` -### Kindle: `Version` -### DeDRM: `Version` - -## Log -
Log Title - -```log -PUT YOUR LOG -``` -
diff --git a/.github/ISSUE_TEMPLATE/QUESTION.yml b/.github/ISSUE_TEMPLATE/QUESTION.yml new file mode 100644 index 00000000..c6c63021 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/QUESTION.yml @@ -0,0 +1,41 @@ +name: Question +description: Questions for DeDRM Project +body: + - type: textarea + id: question + attributes: + label: Question / bug report + description: Please enter your question / your bug report. + - type: input + id: calibre-version + attributes: + label: Which version of Calibre are you running? + description: "Example: 5.30" + placeholder: "5.30" + validations: + required: true + - type: input + id: plugin-version + attributes: + label: Which version of the DeDRM plugin are you running? + description: "Example: v7.2.1" + placeholder: "v7.2.1" + validations: + required: true + - type: input + id: kindle-version + attributes: + label: If applicable, which version of the Kindle software are you running? + description: "Example: 1.24" + placeholder: "Leave empty if unrelated to Kindle books" + validations: + required: false + - type: textarea + id: log + attributes: + label: Log output + description: If applicable, please post your log output here - into the code block. + value: | + ```log + Paste log output here. + ``` \ No newline at end of file From 77dcc462aa7b568a2ca106bc18a6e016c32794ea Mon Sep 17 00:00:00 2001 From: Aldo Bleeker Date: Mon, 28 Jun 2021 16:59:15 +0200 Subject: [PATCH 015/154] Fix for decryption check --- Obok_plugin/action.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Obok_plugin/action.py b/Obok_plugin/action.py index 1a4515b4..fb8f26ef 100644 --- a/Obok_plugin/action.py +++ b/Obok_plugin/action.py @@ -375,7 +375,6 @@ def decryptBook(self, book): #print ('Kobo library filename: {0}'.format(book.filename)) for userkey in self.userkeys: print (_('Trying key: '), codecs.encode(userkey, 'hex')) - check = True try: fileout = PersistentTemporaryFile('.epub', dir=self.tdir) #print ('Temp file: {0}'.format(fileout.name)) @@ -396,8 +395,7 @@ def decryptBook(self, book): file = book.encryptedfiles[filename] contents = file.decrypt(userkey, contents) # Parse failures mean the key is probably wrong. - if check: - check = not file.check(contents) + file.check(contents) zout.writestr(filename, contents) zout.close() zin.close() From 30425c1ec813cce99693944fb2d9cdcb264eb1bd Mon Sep 17 00:00:00 2001 From: John Belmonte Date: Sun, 16 May 2021 13:07:54 +0900 Subject: [PATCH 016/154] FAQ: note that Kindle 1.17 on Mac is 32-bit --- FAQs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQs.md b/FAQs.md index 09bf19cb..609d0779 100644 --- a/FAQs.md +++ b/FAQs.md @@ -21,7 +21,7 @@ But otherwise, if your ebook is from Amazon, Kobo, Barnes & Noble or any of the ### Recent Changes to Kindle for PC/Kindle for Mac Starting with version 1.19, Kindle for PC/Mac uses Amazon's new KFX format which isn't quite as good a source for conversion to ePub as the older KF8 (& MOBI) formats. There are two options to get the older formats. Either stick with version 1.17 or earlier, or modify the executable by changing a file name (PC) or disabling a component of the application (Mac). -Version 1.17 of Kindle is no longer available directly from Amazon, so you will need to search for the proper file name and find it on a third party site. The name is `KindleForPC-installer-1.17.44170.exe` for PC and `KindleForMac-44182.dmg` for Mac. +Version 1.17 of Kindle is no longer available directly from Amazon, so you will need to search for the proper file name and find it on a third party site. The name is `KindleForPC-installer-1.17.44170.exe` for PC and `KindleForMac-44182.dmg` for Mac. (Note that this is a 32-bit application on the Mac, so will not work on Catalina and newer versions of macOS.) Verify the one of the following cryptographic hash values, using software of your choice, before installing the downloaded file in order to avoid viruses. If the hash does not match, delete the downloaded file and try again from another site. #### Kindle for PC `KindleForPC-installer-1.17.44170.exe`: From 17ccc4d1b94ad033e34a80d95d3d7c69e6a7aaff Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 17:59:48 +0100 Subject: [PATCH 017/154] Add IETF and Adobe font deobfuscation code --- DeDRM_plugin/__init__.py | 42 ++++- DeDRM_plugin/config.py | 9 +- DeDRM_plugin/epubfontdecrypt.py | 313 ++++++++++++++++++++++++++++++++ DeDRM_plugin/prefs.py | 1 + 4 files changed, 356 insertions(+), 9 deletions(-) create mode 100644 DeDRM_plugin/epubfontdecrypt.py diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index bf2741f3..892e4645 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -200,6 +200,31 @@ def initialize(self): traceback.print_exc() raise + def checkFonts(self, path_to_ebook): + # This is called after the normal DRM removal is done. + # It checks if there's fonts that need to be deobfuscated + + import calibre_plugins.dedrm.prefs as prefs + dedrmprefs = prefs.DeDRM_Prefs() + + if dedrmprefs["deobfuscate_fonts"] is True: + import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt + + output = self.temporary_file(".epub").name + ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) + + if (ret == 0): + print("Font deobfuscation successful") + return output + elif (ret == 1): + print("No font obfuscation found") + return path_to_ebook + else: + print("Errors during font deobfuscation!") + raise DeDRMError("Font deobfuscation failed") + else: + return path_to_ebook + def ePubDecrypt(self,path_to_ebook): # Create a TemporaryPersistent file to work with. # Check original epub archive for zip errors. @@ -245,7 +270,7 @@ def ePubDecrypt(self,path_to_ebook): if result == 0: # Decryption was successful. # Return the modified PersistentTemporary file to calibre. - return of.name + return self.checkFonts(of.name) print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) @@ -304,7 +329,7 @@ def ePubDecrypt(self,path_to_ebook): print("{0} v{1}: Exception saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() # Return the modified PersistentTemporary file to calibre. - return of.name + return self.checkFonts(of.name) print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except Exception as e: @@ -347,7 +372,7 @@ def ePubDecrypt(self,path_to_ebook): of.close() if result == 0: print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return of.name + return self.checkFonts(of.name) except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -376,7 +401,7 @@ def ePubDecrypt(self,path_to_ebook): # Decryption was successful. # Return the modified PersistentTemporary file to calibre. print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return of.name + return self.checkFonts(of.name) print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) @@ -444,7 +469,7 @@ def ePubDecrypt(self,path_to_ebook): traceback.print_exc() print("{0} v{1}: Decrypted with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) # Return the modified PersistentTemporary file to calibre. - return of.name + return self.checkFonts(of.name) print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except Exception as e: @@ -457,9 +482,10 @@ def ePubDecrypt(self,path_to_ebook): raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) # Not a Barnes & Noble nor an Adobe Adept - # Import the fixed epub. + # Probably a DRM-free EPUB, but we should still check for fonts. print("{0} v{1}: “{2}” is neither an Adobe Adept nor a Barnes & Noble encrypted ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + return self.checkFonts(inf.name) + #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) def PDFDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs @@ -501,7 +527,7 @@ def PDFDecrypt(self,path_to_ebook): # If we end up here, we didn't find a key with a matching UUID, so lets just try all of them. - + # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): userkey = codecs.decode(userkeyhex,'hex') diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 0b7b2570..73df7591 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -9,7 +9,7 @@ import os, traceback, json, codecs from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, - QGroupBox, QPushButton, QListWidget, QListWidgetItem, + QGroupBox, QPushButton, QListWidget, QListWidgetItem, QCheckBox, QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, QCheckBox) @@ -51,6 +51,7 @@ def __init__(self, plugin_path, alfdir): self.tempdedrmprefs['serials'] = list(self.dedrmprefs['serials']) self.tempdedrmprefs['adobewineprefix'] = self.dedrmprefs['adobewineprefix'] self.tempdedrmprefs['kindlewineprefix'] = self.dedrmprefs['kindlewineprefix'] + self.tempdedrmprefs['deobfuscate_fonts'] = self.dedrmprefs['deobfuscate_fonts'] # Start Qt Gui dialog layout layout = QVBoxLayout(self) @@ -109,6 +110,11 @@ def __init__(self, plugin_path, alfdir): button_layout.addWidget(self.adept_button) button_layout.addWidget(self.kindle_key_button) + self.chkFontObfuscation = QtGui.QCheckBox(_("Deobfuscate EPUB fonts")) + self.chkFontObfuscation.setToolTip("Deobfuscates fonts in EPUB files after DRM removal") + self.chkFontObfuscation.setChecked(self.tempdedrmprefs["deobfuscate_fonts"]) + button_layout.addWidget(self.chkFontObfuscation) + self.resize(self.sizeHint()) def kindle_serials(self): @@ -171,6 +177,7 @@ def save_settings(self): self.dedrmprefs.set('adobewineprefix', self.tempdedrmprefs['adobewineprefix']) self.dedrmprefs.set('kindlewineprefix', self.tempdedrmprefs['kindlewineprefix']) self.dedrmprefs.set('configured', True) + self.dedrmprefs.set('deobfuscate_fonts', self.chkFontObfuscation.isChecked()) self.dedrmprefs.writeprefs() def load_resource(self, name): diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py new file mode 100644 index 00000000..6ddaa874 --- /dev/null +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# epubfontdecrypt.py +# Copyright © 2021 by noDRM + +# Released under the terms of the GNU General Public Licence, version 3 +# + + +# Revision history: +# 1 - Initial release + +""" +Decrypts / deobfuscates font files in EPUB files +""" + +__license__ = 'GPL v3' +__version__ = "1" + +import os +import traceback +import zlib +import zipfile +from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from contextlib import closing +import xml.etree.ElementTree as etree +import itertools +import hashlib +import binascii + + +class Decryptor(object): + def __init__(self, obfuscationkeyIETF, obfuscationkeyAdobe, encryption): + enc = lambda tag: '{%s}%s' % ('http://www.w3.org/2001/04/xmlenc#', tag) + dsig = lambda tag: '{%s}%s' % ('http://www.w3.org/2000/09/xmldsig#', tag) + self.obfuscation_key_Adobe = obfuscationkeyAdobe + self.obfuscation_key_IETF = obfuscationkeyIETF + + self._encryption = etree.fromstring(encryption) + # This loops through all entries in the "encryption.xml" file + # to figure out which files need to be decrypted. + self._obfuscatedIETF = obfuscatedIETF = set() + self._obfuscatedAdobe = obfuscatedAdobe = set() + self._other = other = set() + + self._json_elements_to_remove = json_elements_to_remove = set() + self._has_remaining_xml = False + expr = './%s/%s/%s' % (enc('EncryptedData'), enc('CipherData'), + enc('CipherReference')) + for elem in self._encryption.findall(expr): + path = elem.get('URI', None) + encryption_type_url = (elem.getparent().getparent().find("./%s" % (enc('EncryptionMethod'))).get('Algorithm', None)) + if path is not None: + + if encryption_type_url == "http://www.idpf.org/2008/embedding": + # Font files obfuscated with the IETF algorithm + path = path.encode('utf-8') + obfuscatedIETF.add(path) + if (self.obfuscation_key_IETF is None): + self._has_remaining_xml = True + else: + json_elements_to_remove.add(elem.getparent().getparent()) + + elif encryption_type_url == "http://ns.adobe.com/pdf/enc#RC": + # Font files obfuscated with the Adobe algorithm. + path = path.encode('utf-8') + obfuscatedAdobe.add(path) + if (self.obfuscation_key_Adobe is None): + self._has_remaining_xml = True + else: + json_elements_to_remove.add(elem.getparent().getparent()) + + else: + path = path.encode('utf-8') + other.add(path) + self._has_remaining_xml = True + # Other unsupported type. + + for elem in json_elements_to_remove: + elem.getparent().remove(elem) + + def check_if_remaining(self): + return self._has_remaining_xml + + def get_xml(self): + return "\n" + etree.tostring(self._encryption, encoding="utf-8", pretty_print=True, xml_declaration=False).decode("utf-8") + + def decompress(self, bytes): + dc = zlib.decompressobj(-15) + try: + decompressed_bytes = dc.decompress(bytes) + ex = dc.decompress(b'Z') + dc.flush() + if ex: + decompressed_bytes = decompressed_bytes + ex + except: + # possibly not compressed by zip - just return bytes + return bytes, False + return decompressed_bytes , True + + def decrypt(self, path, data): + if path.encode('utf-8') in self._obfuscatedIETF and self.obfuscation_key_IETF is not None: + # de-obfuscate according to the IETF standard + data, was_decomp = self.decompress(data) + + if len(data) <= 1040: + # de-obfuscate whole file + out = self.deobfuscate_single_data(self.obfuscation_key_IETF, data) + else: + out = self.deobfuscate_single_data(self.obfuscation_key_IETF, data[:1040]) + data[1040:] + + if (not was_decomp): + out, was_decomp = self.decompress(out) + return out + + elif path.encode('utf-8') in self._obfuscatedAdobe and self.obfuscation_key_Adobe is not None: + # de-obfuscate according to the Adobe standard + data, was_decomp = self.decompress(data) + + if len(data) <= 1024: + # de-obfuscate whole file + out = self.deobfuscate_single_data(self.obfuscation_key_Adobe, data) + else: + out = self.deobfuscate_single_data(self.obfuscation_key_Adobe, data[:1024]) + data[1024:] + + if (not was_decomp): + out, was_decomp = self.decompress(out) + return out + + else: + # Not encrypted or obfuscated + return data + + def deobfuscate_single_data(self, key, data): + msg = bytes([c^k for c,k in zip(data, itertools.cycle(key))]) + return msg + + + +def decryptFontsBook(inpath, outpath): + + with closing(ZipFile(open(inpath, 'rb'))) as inf: + namelist = set(inf.namelist()) + if 'META-INF/encryption.xml' not in namelist: + print("{0:s} has no obfuscated fonts".format(os.path.basename(inpath))) + return 1 + + # Font key handling: + + font_master_key = None + adobe_master_encryption_key = None + + contNS = lambda tag: '{%s}%s' % ('urn:oasis:names:tc:opendocument:xmlns:container', tag) + path = None + + try: + container = etree.fromstring(inf.read("META-INF/container.xml")) + rootfiles = container.find(contNS("rootfiles")).findall(contNS("rootfile")) + for rootfile in rootfiles: + path = rootfile.get("full-path", None) + if (path is not None): + break + except: + pass + + # If path is None, we didn't find an OPF, so we probably don't have a font key. + # If path is set, it's the path to the main content OPF file. + + if (path is None): + print("No OPF for font obfuscation found") + return 1 + else: + packageNS = lambda tag: '{%s}%s' % ('http://www.idpf.org/2007/opf', tag) + metadataDCNS = lambda tag: '{%s}%s' % ('http://purl.org/dc/elements/1.1/', tag) + + try: + container = etree.fromstring(inf.read(path)) + except: + container = [] + + ## IETF font key algorithm: + print("Checking {0} for IETF font obfuscation keys ... ".format(path), end='') + secret_key_name = None + try: + secret_key_name = container.get("unique-identifier") + except: + pass + + try: + identify_element = container.find(packageNS("metadata")).find(metadataDCNS("identifier")) + if (secret_key_name is None or secret_key_name == identify_element.get("id")): + font_master_key = identify_element.text + except: + pass + + if (font_master_key is not None): + if (secret_key_name is None): + print("found '%s'" % (font_master_key)) + else: + print("found '%s' (%s)" % (font_master_key, secret_key_name)) + + # Trim / remove forbidden characters from the key, then hash it: + font_master_key = font_master_key.replace(' ', '') + font_master_key = font_master_key.replace('\t', '') + font_master_key = font_master_key.replace('\r', '') + font_master_key = font_master_key.replace('\n', '') + font_master_key = font_master_key.encode('utf-8') + font_master_key = hashlib.sha1(font_master_key).digest() + else: + print("not found") + + ## Adobe font key algorithm + print("Checking {0} for Adobe font obfuscation keys ... ".format(path), end='') + + try: + metadata = container.find(packageNS("metadata")) + identifiers = metadata.findall(metadataDCNS("identifier")) + + uid = None + uidMalformed = False + + for identifier in identifiers: + if identifier.get(packageNS("scheme")) == "UUID": + if identifier.text[:9] == "urn:uuid:": + uid = identifier.text[9:] + else: + uid = identifier.text + break + if identifier.text[:9] == "urn:uuid:": + uid = identifier.text[9:] + break + + + if uid is not None: + uid = uid.replace(chr(0x20),'').replace(chr(0x09),'') + uid = uid.replace(chr(0x0D),'').replace(chr(0x0A),'').replace('-','') + + if len(uid) < 16: + uidMalformed = True + if not all(c in "0123456789abcdefABCDEF" for c in uid): + uidMalformed = True + + + if not uidMalformed: + print("found '{0}'".format(uid)) + uid = uid + uid + adobe_master_encryption_key = binascii.unhexlify(uid[:32]) + + if adobe_master_encryption_key is None: + print("not found") + + except: + print("exception") + pass + + # Begin decrypting. + + try: + encryption = inf.read('META-INF/encryption.xml') + decryptor = Decryptor(font_master_key, adobe_master_encryption_key, encryption) + kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) + with closing(ZipFile(open(outpath, 'wb'), 'w', **kwds)) as outf: + + # Mimetype needs to be the first entry, so remove it from the list + # whereever it is, then add it at the beginning. + namelist.remove("mimetype") + + for path in (["mimetype"] + namelist): + data = inf.read(path) + zi = ZipInfo(path) + zi.compress_type=ZIP_DEFLATED + + if path == "mimetype": + # mimetype must not be compressed + zi.compress_type = ZIP_STORED + + elif path == "META-INF/encryption.xml": + # Check if there's still other entries not related to fonts + if (decryptor.check_if_remaining()): + data = decryptor.get_xml() + print("There's remaining entries in encryption.xml, adding file ...") + else: + # No remaining entries, no need for that file. + continue + + try: + # get the file info, including time-stamp + oldzi = inf.getinfo(path) + # copy across useful fields + zi.date_time = oldzi.date_time + zi.comment = oldzi.comment + zi.extra = oldzi.extra + zi.internal_attr = oldzi.internal_attr + # external attributes are dependent on the create system, so copy both. + zi.external_attr = oldzi.external_attr + zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 + except: + pass + + if path == "mimetype": + outf.writestr(zi, inf.read('mimetype')) + elif path == "META-INF/encryption.xml": + outf.writestr(zi, data) + else: + outf.writestr(zi, decryptor.decrypt(path, data)) + except: + print("Could not decrypt fonts in {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) + return 2 + return 0 + diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index 3e8d78bb..e1d8cc65 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -19,6 +19,7 @@ def __init__(self): self.dedrmprefs = JSONConfig(JSON_PATH) self.dedrmprefs.defaults['configured'] = False + self.dedrmprefs.defaults['deobfuscate_fonts'] = True self.dedrmprefs.defaults['bandnkeys'] = {} self.dedrmprefs.defaults['adeptkeys'] = {} self.dedrmprefs.defaults['ereaderkeys'] = {} From 40a8e4360bf921fa24320307e269dc08091f05d5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 18:38:34 +0100 Subject: [PATCH 018/154] No longer break obfuscated fonts on DRM removal --- DeDRM_plugin/epubfontdecrypt.py | 4 +- DeDRM_plugin/ineptepub.py | 73 ++++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py index 6ddaa874..858f25e6 100644 --- a/DeDRM_plugin/epubfontdecrypt.py +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -24,7 +24,7 @@ import zipfile from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED from contextlib import closing -import xml.etree.ElementTree as etree +from lxml import etree import itertools import hashlib import binascii @@ -140,7 +140,7 @@ def deobfuscate_single_data(self, key, data): def decryptFontsBook(inpath, outpath): with closing(ZipFile(open(inpath, 'rb'))) as inf: - namelist = set(inf.namelist()) + namelist = inf.namelist() if 'META-INF/encryption.xml' not in namelist: print("{0:s} has no obfuscated fonts".format(os.path.basename(inpath))) return 1 diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index fe6fde22..ad745d86 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -46,7 +46,7 @@ import zipfile from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED from contextlib import closing -import xml.etree.ElementTree as etree +from lxml import etree # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get @@ -333,7 +333,7 @@ def _load_crypto(): AES, RSA = _load_crypto() -META_NAMES = ('mimetype', 'META-INF/rights.xml', 'META-INF/encryption.xml') +META_NAMES = ('mimetype', 'META-INF/rights.xml') NSMAP = {'adept': 'http://ns.adobe.com/adept', 'enc': 'http://www.w3.org/2001/04/xmlenc#'} @@ -343,13 +343,35 @@ def __init__(self, bookkey, encryption): self._aes = AES(bookkey) encryption = etree.fromstring(encryption) self._encrypted = encrypted = set() + self._otherData = otherData = set() + + self._json_elements_to_remove = json_elements_to_remove = set() + self._has_remaining_xml = False expr = './%s/%s/%s' % (enc('EncryptedData'), enc('CipherData'), enc('CipherReference')) for elem in encryption.findall(expr): path = elem.get('URI', None) + encryption_type_url = (elem.getparent().getparent().find("./%s" % (enc('EncryptionMethod'))).get('Algorithm', None)) if path is not None: - path = path.encode('utf-8') - encrypted.add(path) + if (encryption_type_url == "http://www.w3.org/2001/04/xmlenc#aes128-cbc"): + # Adobe + path = path.encode('utf-8') + encrypted.add(path) + json_elements_to_remove.add(elem.getparent().getparent()) + else: + path = path.encode('utf-8') + otherData.add(path) + self._has_remaining_xml = True + + for elem in json_elements_to_remove: + elem.getparent().remove(elem) + + def check_if_remaining(self): + return self._has_remaining_xml + + def get_xml(self): + return "\n" + etree.tostring(self._encryption, encoding="utf-8", pretty_print=True, xml_declaration=False).decode("utf-8") + def decompress(self, bytes): dc = zlib.decompressobj(-15) @@ -434,7 +456,7 @@ def decryptBook(userkey, inpath, outpath): raise ADEPTError("PyCrypto or OpenSSL must be installed.") rsa = RSA(userkey) with closing(ZipFile(open(inpath, 'rb'))) as inf: - namelist = set(inf.namelist()) + namelist = inf.namelist() if 'META-INF/rights.xml' not in namelist or \ 'META-INF/encryption.xml' not in namelist: print("{0:s} is DRM-free.".format(os.path.basename(inpath))) @@ -461,26 +483,25 @@ def decryptBook(userkey, inpath, outpath): decryptor = Decryptor(bookkey, encryption) kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) with closing(ZipFile(open(outpath, 'wb'), 'w', **kwds)) as outf: - zi = ZipInfo('mimetype') - zi.compress_type=ZIP_STORED - try: - # if the mimetype is present, get its info, including time-stamp - oldzi = inf.getinfo('mimetype') - # copy across fields to be preserved - zi.date_time = oldzi.date_time - zi.comment = oldzi.comment - zi.extra = oldzi.extra - zi.internal_attr = oldzi.internal_attr - # external attributes are dependent on the create system, so copy both. - zi.external_attr = oldzi.external_attr - zi.create_system = oldzi.create_system - except: - pass - outf.writestr(zi, inf.read('mimetype')) - for path in namelist: + + for path in (["mimetype"] + namelist): data = inf.read(path) zi = ZipInfo(path) zi.compress_type=ZIP_DEFLATED + + if path == "mimetype": + zi.compress_type = ZIP_STORED + + elif path == "META-INF/encryption.xml": + # Check if there's still something in there + if (decryptor.check_if_remaining()): + data = decryptor.get_xml() + print("Adding encryption.xml for the remaining embedded files.") + # We removed DRM, but there's still stuff like obfuscated fonts. + else: + continue + + try: # get the file info, including time-stamp oldzi = inf.getinfo(path) @@ -492,9 +513,15 @@ def decryptBook(userkey, inpath, outpath): # external attributes are dependent on the create system, so copy both. zi.external_attr = oldzi.external_attr zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 except: pass - outf.writestr(zi, decryptor.decrypt(path, data)) + if path == "META-INF/encryption.xml": + outf.writestr(zi, data) + else: + outf.writestr(zi, decryptor.decrypt(path, data)) except: print("Could not decrypt {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) return 2 From 88dd1350c0e626626dd37e4a1264d2e13194794c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 15 Nov 2021 19:51:36 +0100 Subject: [PATCH 019/154] Add useful error message for the new, uncracked ADEPT DRM --- DeDRM_plugin/__init__.py | 14 ++++++++++++++ DeDRM_plugin/ineptepub.py | 9 +++++++++ DeDRM_plugin/ineptpdf.py | 14 +++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 892e4645..8bdf1d2e 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -373,6 +373,10 @@ def ePubDecrypt(self,path_to_ebook): if result == 0: print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) return self.checkFonts(of.name) + except ineptepub.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return path_to_ebook + except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -387,6 +391,9 @@ def ePubDecrypt(self,path_to_ebook): # Give the user key, ebook and TemporaryPersistent file to the decryption function. try: result = ineptepub.decryptBook(userkey, inf.name, of.name) + except ineptepub.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return path_to_ebook except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -521,6 +528,10 @@ def PDFDecrypt(self,path_to_ebook): if result == 0: print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) return of.name + + except ineptpdf.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return path_to_ebook except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -537,6 +548,9 @@ def PDFDecrypt(self,path_to_ebook): # Give the user key, ebook and TemporaryPersistent file to the decryption function. try: result = ineptpdf.decryptBook(userkey, path_to_ebook, of.name) + except ineptpdf.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return path_to_ebook except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index ad745d86..3f01a7cc 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -110,6 +110,9 @@ def unicode_argv(): class ADEPTError(Exception): pass +class ADEPTNewVersionError(Exception): + pass + def _load_crypto_libcrypto(): from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ Structure, c_ulong, create_string_buffer, cast @@ -468,6 +471,12 @@ def decryptBook(userkey, inpath, outpath): adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = './/%s' % (adept('encryptedKey'),) bookkey = ''.join(rights.findtext(expr)) + if len(bookkey) == 192: + print("{0:s} seems to be an Adobe ADEPT ePub with Adobe's new DRM".format(os.path.basename(inpath))) + print("This DRM cannot be removed yet. ") + print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") + print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") + raise ADEPTNewVersionError("Book uses new ADEPT encryption") if len(bookkey) != 172: print("{0:s} is not a secure Adobe Adept ePub.".format(os.path.basename(inpath))) return 1 diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 2be0fbfd..7dc6e837 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -125,6 +125,9 @@ def unicode_argv(): class ADEPTError(Exception): pass +class ADEPTNewVersionError(Exception): + pass + import hashlib @@ -1615,7 +1618,16 @@ def initialize_ebx(self, password, docid, param): rights = zlib.decompress(rights, -15) rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}encryptedKey' - bookkey = codecs.decode(''.join(rights.findtext(expr)).encode('utf-8'),'base64') + bookkey = ''.join(rights.findtext(expr)) + + if len(bookkey) == 192: + print("This seems to be an Adobe ADEPT PDF with Adobe's new DRM") + print("This DRM cannot be removed yet. ") + print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") + print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") + raise ADEPTNewVersionError("Book uses new ADEPT encryption") + + bookkey = codecs.decode(bookkey.encode('utf-8'),'base64') bookkey = rsa.decrypt(bookkey) if len(bookkey) > 16: From 90910ab106d9a06659240c2dbbb6aeacf65dcb0d Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 11:09:03 +0100 Subject: [PATCH 020/154] Add back Python2 support (ADEPT) --- DeDRM_plugin/__init__.py | 17 +- DeDRM_plugin/adobekey.py | 16 +- DeDRM_plugin/androidkindlekey.py | 16 +- DeDRM_plugin/argv_utils.py | 2 +- DeDRM_plugin/convert2xml.py | 14 +- DeDRM_plugin/epubtest.py | 16 +- DeDRM_plugin/erdr2pml.py | 15 +- DeDRM_plugin/genbook.py | 14 +- DeDRM_plugin/ignobleepub.py | 15 +- DeDRM_plugin/ignoblekey.py | 16 +- DeDRM_plugin/ignoblekeyfetch.py | 16 +- DeDRM_plugin/ignoblekeygen.py | 16 +- DeDRM_plugin/ignoblepdf.py | 424 +++++++++++++++++-------------- DeDRM_plugin/ineptepub.py | 16 +- DeDRM_plugin/ineptpdf.py | 94 ++++--- DeDRM_plugin/k4mobidedrm.py | 16 +- DeDRM_plugin/kindlekey.py | 16 +- DeDRM_plugin/kindlepid.py | 16 +- DeDRM_plugin/mobidedrm.py | 16 +- DeDRM_plugin/topazextract.py | 16 +- DeDRM_plugin/zipfilerugged.py | 4 +- 21 files changed, 481 insertions(+), 310 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 8bdf1d2e..9ee3a39f 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -115,14 +115,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") try: - self.stream.buffer.write(data) - self.stream.buffer.flush() + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() except: # We can do nothing if a write fails - pass + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -132,7 +135,8 @@ class DeDRM(FileTypePlugin): supported_platforms = ['linux', 'osx', 'windows'] author = "Apprentice Alf, Apprentice Harper, NoDRM, The Dark Reverser and i♥cabbages" version = PLUGIN_VERSION_TUPLE - minimum_calibre_version = (5, 0, 0) # Python 3. + #minimum_calibre_version = (5, 0, 0) # Python 3. + minimum_calibre_version = (2, 0, 0) # Needs Calibre 1.0 minimum. 1.X untested. file_types = set(['epub','pdf','pdb','prc','mobi','pobi','azw','azw1','azw3','azw4','azw8','tpz','kfx','kfx-zip']) on_import = True on_preprocess = True @@ -151,6 +155,7 @@ def initialize(self): The extraction only happens once per version of the plugin Also perform upgrade of preferences once per version """ + try: self.pluginsdir = os.path.join(config_dir,"plugins") if not os.path.exists(self.pluginsdir): @@ -237,7 +242,7 @@ def ePubDecrypt(self,path_to_ebook): fr.fix() except Exception as e: print("{0} v{1}: Error \'{2}\' when checking zip archive".format(PLUGIN_NAME, PLUGIN_VERSION, e.args[0])) - raise Exception(e) + raise # import the decryption keys import calibre_plugins.dedrm.prefs as prefs diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 5412b865..fea25336 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -51,11 +51,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -99,7 +105,7 @@ def unicode_argv(): return ["adobekey.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class ADEPTError(Exception): pass diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index e4b6cbec..da34c1d3 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -45,11 +45,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -93,7 +99,7 @@ def unicode_argv(): return ["kindlekey.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class DrmException(Exception): pass diff --git a/DeDRM_plugin/argv_utils.py b/DeDRM_plugin/argv_utils.py index fd4e03ba..37bfb896 100644 --- a/DeDRM_plugin/argv_utils.py +++ b/DeDRM_plugin/argv_utils.py @@ -41,7 +41,7 @@ def unicode_argv(): return ["DeDRM.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] def add_cp65001_codec(): diff --git a/DeDRM_plugin/convert2xml.py b/DeDRM_plugin/convert2xml.py index abdaeb32..fe33ecab 100644 --- a/DeDRM_plugin/convert2xml.py +++ b/DeDRM_plugin/convert2xml.py @@ -15,11 +15,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index ebae4fbd..561b053f 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -66,11 +66,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -114,7 +120,7 @@ def unicode_argv(): return ["epubtest.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index a7ad95e5..c32431a6 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -85,10 +85,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -129,7 +136,7 @@ def unicode_argv(): return ["mobidedrm.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] Des = None if iswindows: diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index 915bd308..6f3f57d1 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -14,11 +14,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) diff --git a/DeDRM_plugin/ignobleepub.py b/DeDRM_plugin/ignobleepub.py index 72e22f9b..e1cd88fa 100644 --- a/DeDRM_plugin/ignobleepub.py +++ b/DeDRM_plugin/ignobleepub.py @@ -52,10 +52,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -97,7 +104,7 @@ def unicode_argv(): return ["ineptepub.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class IGNOBLEError(Exception): diff --git a/DeDRM_plugin/ignoblekey.py b/DeDRM_plugin/ignoblekey.py index 5e33e335..0c3662e5 100644 --- a/DeDRM_plugin/ignoblekey.py +++ b/DeDRM_plugin/ignoblekey.py @@ -37,11 +37,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -85,7 +91,7 @@ def unicode_argv(): return ["ignoblekey.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class DrmException(Exception): pass diff --git a/DeDRM_plugin/ignoblekeyfetch.py b/DeDRM_plugin/ignoblekeyfetch.py index a0375f90..25c18f62 100644 --- a/DeDRM_plugin/ignoblekeyfetch.py +++ b/DeDRM_plugin/ignoblekeyfetch.py @@ -44,11 +44,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -92,7 +98,7 @@ def unicode_argv(): return ["ignoblekeyfetch.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class IGNOBLEError(Exception): diff --git a/DeDRM_plugin/ignoblekeygen.py b/DeDRM_plugin/ignoblekeygen.py index 07bfb51b..58935536 100644 --- a/DeDRM_plugin/ignoblekeygen.py +++ b/DeDRM_plugin/ignoblekeygen.py @@ -54,11 +54,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -102,7 +108,7 @@ def unicode_argv(): return ["ignoblekeygen.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class IGNOBLEError(Exception): diff --git a/DeDRM_plugin/ignoblepdf.py b/DeDRM_plugin/ignoblepdf.py index 365eae28..9f2c4dba 100644 --- a/DeDRM_plugin/ignoblepdf.py +++ b/DeDRM_plugin/ignoblepdf.py @@ -14,6 +14,7 @@ # Revision history: # 0.1 - Initial alpha testing release 2020 by Pu D. Pud # 0.2 - Python 3 for calibre 5.0 (in testing) +# 0.3 - More Python3 fixes """ @@ -21,7 +22,7 @@ """ __license__ = 'GPL v3' -__version__ = "0.2" +__version__ = "0.3" import sys import os @@ -29,8 +30,9 @@ import zlib import struct import hashlib -from decimal import * -from itertools import chain, islice +from io import BytesIO +from decimal import Decimal +import itertools import xml.etree.ElementTree as etree # Wrap a stream so that output gets flushed immediately @@ -43,11 +45,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -86,7 +94,7 @@ def unicode_argv(): return ["ignoblepdf.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class IGNOBLEError(Exception): @@ -236,7 +244,6 @@ def _load_crypto(): ARC4, AES = _load_crypto() -from io import BytesIO # Do we generate cross reference streams on output? @@ -273,7 +280,7 @@ def nunpack(s, default=0): elif l == 2: return struct.unpack('>H', s)[0] elif l == 3: - return struct.unpack('>L', '\x00'+s)[0] + return struct.unpack('>L', bytes([0]) + s)[0] elif l == 4: return struct.unpack('>L', s)[0] else: @@ -324,7 +331,7 @@ class PSKeyword(PSObject): Use PSKeywordTable.intern() instead. ''' def __init__(self, name): - self.name = name + self.name = name.decode('utf-8') return def __repr__(self): @@ -354,12 +361,12 @@ def intern(self, name): PSKeywordTable = PSSymbolTable(PSKeyword) LIT = PSLiteralTable.intern KWD = PSKeywordTable.intern -KEYWORD_BRACE_BEGIN = KWD('{') -KEYWORD_BRACE_END = KWD('}') -KEYWORD_ARRAY_BEGIN = KWD('[') -KEYWORD_ARRAY_END = KWD(']') -KEYWORD_DICT_BEGIN = KWD('<<') -KEYWORD_DICT_END = KWD('>>') +KEYWORD_BRACE_BEGIN = KWD(b'{') +KEYWORD_BRACE_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): @@ -381,18 +388,18 @@ def keyword_name(x): ## PSBaseParser ## -EOL = re.compile(r'[\r\n]') -SPC = re.compile(r'\s') -NONSPC = re.compile(r'\S') -HEX = re.compile(r'[0-9a-fA-F]') -END_LITERAL = re.compile(r'[#/%\[\]()<>{}\s]') -END_HEX_STRING = re.compile(r'[^\s0-9a-fA-F]') -HEX_PAIR = re.compile(r'[0-9a-fA-F]{2}|.') -END_NUMBER = re.compile(r'[^0-9]') -END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]') -END_STRING = re.compile(r'[()\134]') -OCT_STRING = re.compile(r'[0-7]') -ESC_STRING = { 'b':8, 't':9, 'n':10, 'f':12, 'r':13, '(':40, ')':41, '\\':92 } +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'[()\\]') +OCT_STRING = re.compile(br'[0-7]') +ESC_STRING = { b'b':8, b't':9, b'n':10, b'f':12, b'r':13, b'(':40, b')':41, b'\\':92 } class PSBaseParser(object): @@ -435,7 +442,7 @@ def seek(self, pos): self.fp.seek(pos) # reset the status for nextline() self.bufpos = pos - self.buf = '' + self.buf = b'' self.charpos = 0 # reset the status for nexttoken() self.parse1 = self.parse_main @@ -457,32 +464,37 @@ def parse_main(self, s, i): if not m: return (self.parse_main, len(s)) j = m.start(0) - c = s[j] + if isinstance(s[j], str): + # Python 2 + c = s[j] + else: + # Python 3 + c = bytes([s[j]]) self.tokenstart = self.bufpos+j - if c == '%': - self.token = '%' + if c == b'%': + self.token = c return (self.parse_comment, j+1) - if c == '/': - self.token = '' + if c == b'/': + self.token = b'' return (self.parse_literal, j+1) - if c in '-+' or c.isdigit(): + if c in b'-+' or c.isdigit(): self.token = c return (self.parse_number, j+1) - if c == '.': + if c == b'.': self.token = c return (self.parse_decimal, j+1) if c.isalpha(): self.token = c return (self.parse_keyword, j+1) - if c == '(': - self.token = '' + if c == b'(': + self.token = b'' self.paren = 1 return (self.parse_string, j+1) - if c == '<': - self.token = '' + if c == b'<': + self.token = b'' return (self.parse_wopen, j+1) - if c == '>': - self.token = '' + if c == b'>': + self.token = b'' return (self.parse_wclose, j+1) self.add_token(KWD(c)) return (self.parse_main, j+1) @@ -509,20 +521,26 @@ def parse_literal(self, s, i): return (self.parse_literal, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '#': - self.hex = '' + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'#': + self.hex = b'' return (self.parse_literal_hex, j+1) - self.add_token(LIT(self.token)) + self.add_token(PSLiteralTable.intern(self.token)) return (self.parse_main, j) def parse_literal_hex(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if HEX.match(c) and len(self.hex) < 2: self.hex += c return (self.parse_literal_hex, i+1) if self.hex: - self.token += chr(int(self.hex, 16)) + self.token += bytes([int(self.hex, 16)]) return (self.parse_literal, i) def parse_number(self, s, i): @@ -532,8 +550,11 @@ def parse_number(self, s, i): return (self.parse_number, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '.': + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'.': self.token += c return (self.parse_decimal, j+1) try: @@ -549,7 +570,7 @@ def parse_decimal(self, s, i): return (self.parse_decimal, len(s)) j = m.start(0) self.token += s[i:j] - self.add_token(Decimal(self.token)) + self.add_token(Decimal(self.token.decode('utf-8'))) return (self.parse_main, j) def parse_keyword(self, s, i): @@ -575,15 +596,18 @@ def parse_string(self, s, i): return (self.parse_string, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '\\': + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'\\': self.oct = '' return (self.parse_string_1, j+1) - if c == '(': + if c == b'(': self.paren += 1 self.token += c return (self.parse_string, j+1) - if c == ')': + if c == b')': self.paren -= 1 if self.paren: self.token += c @@ -591,42 +615,51 @@ def parse_string(self, s, i): self.add_token(self.token) return (self.parse_main, j+1) def parse_string_1(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if OCT_STRING.match(c) and len(self.oct) < 3: self.oct += c return (self.parse_string_1, i+1) if self.oct: - self.token += chr(int(self.oct, 8)) + self.token += bytes([int(self.oct, 8)]) return (self.parse_string, i) if c in ESC_STRING: - self.token += chr(ESC_STRING[c]) + self.token += bytes([ESC_STRING[c]]) return (self.parse_string, i+1) def parse_wopen(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if c.isspace() or HEX.match(c): return (self.parse_hexstring, i) - if c == '<': + if c == b'<': self.add_token(KEYWORD_DICT_BEGIN) i += 1 return (self.parse_main, i) def parse_wclose(self, s, i): - c = s[i] - if c == '>': + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) + if c == b'>': self.add_token(KEYWORD_DICT_END) i += 1 return (self.parse_main, i) def parse_hexstring(self, s, i): - m = END_HEX_STRING.search(s, i) - if not m: + m1 = END_HEX_STRING.search(s, i) + if not m1: self.token += s[i:] return (self.parse_hexstring, len(s)) - j = m.start(0) + j = m1.start(0) self.token += s[i:j] - token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)), - SPC.sub('', self.token)) + token = HEX_PAIR.sub(lambda m2: bytes([int(m2.group(0), 16)]), + SPC.sub(b'', self.token)) self.add_token(token) return (self.parse_main, j) @@ -641,15 +674,15 @@ def nextline(self): ''' Fetches a next line that ends either with \\r or \\n. ''' - linebuf = '' + linebuf = b'' linepos = self.bufpos + self.charpos eol = False while 1: self.fillbuf() if eol: - c = self.buf[self.charpos] + c = bytes([self.buf[self.charpos]]) # handle '\r\n' - if c == '\n': + if c == b'\n': linebuf += c self.charpos += 1 break @@ -657,7 +690,7 @@ def nextline(self): if m: linebuf += self.buf[self.charpos:m.end(0)] self.charpos = m.end(0) - if linebuf[-1] == '\r': + if bytes([linebuf[-1]]) == b'\r': eol = True else: break @@ -673,7 +706,7 @@ def revreadlines(self): ''' self.fp.seek(0, 2) pos = self.fp.tell() - buf = '' + buf = b'' while 0 < pos: prevpos = pos pos = max(0, pos-self.BUFSIZ) @@ -681,13 +714,13 @@ def revreadlines(self): s = self.fp.read(prevpos-pos) if not s: break while 1: - n = max(s.rfind('\r'), s.rfind('\n')) + 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 = '' + buf = b'' return @@ -743,7 +776,7 @@ def do_keyword(self, pos, token): def nextobject(self, direct=False): ''' - Yields a list of objects: keywords, literals, strings, + Yields a list of objects: keywords, literals, strings (byte arrays), numbers, arrays and dictionaries. Arrays and dictionaries are represented as Python sequence and dictionaries. ''' @@ -753,6 +786,8 @@ def nextobject(self, direct=False): if (isinstance(token, int) or isinstance(token, Decimal) or isinstance(token, bool) or + isinstance(token, bytearray) or + isinstance(token, bytes) or isinstance(token, str) or isinstance(token, PSLiteral)): # normal token @@ -796,10 +831,10 @@ def nextobject(self, direct=False): return obj -LITERAL_CRYPT = PSLiteralTable.intern('Crypt') -LITERALS_FLATE_DECODE = (PSLiteralTable.intern('FlateDecode'), PSLiteralTable.intern('Fl')) -LITERALS_LZW_DECODE = (PSLiteralTable.intern('LZWDecode'), PSLiteralTable.intern('LZW')) -LITERALS_ASCII85_DECODE = (PSLiteralTable.intern('ASCII85Decode'), PSLiteralTable.intern('A85')) +LITERAL_CRYPT = PSLiteralTable.intern(b'Crypt') +LITERALS_FLATE_DECODE = (PSLiteralTable.intern(b'FlateDecode'), PSLiteralTable.intern(b'Fl')) +LITERALS_LZW_DECODE = (PSLiteralTable.intern(b'LZWDecode'), PSLiteralTable.intern(b'LZW')) +LITERALS_ASCII85_DECODE = (PSLiteralTable.intern(b'ASCII85Decode'), PSLiteralTable.intern(b'A85')) ## PDF Objects @@ -853,7 +888,7 @@ def resolve_all(x): if isinstance(x, list): x = [ resolve_all(v) for v in x ] elif isinstance(x, dict): - for (k,v) in x.iteritems(): + for (k,v) in iter(x.items()): x[k] = resolve_all(v) return x @@ -861,13 +896,13 @@ def decipher_all(decipher, objid, genno, x): ''' Recursively decipher X. ''' - if isinstance(x, str): + if isinstance(x, bytearray) or isinstance(x,bytes) or isinstance(x,str): return decipher(objid, genno, x) decf = lambda v: decipher_all(decipher, objid, genno, v) if isinstance(x, list): x = [decf(v) for v in x] elif isinstance(x, dict): - x = dict((k, decf(v)) for (k, v) in x.iteritems()) + x = dict((k, decf(v)) for (k, v) in iter(x.items())) return x @@ -898,7 +933,7 @@ def num_value(x): def str_value(x): x = resolve1(x) - if not isinstance(x, str): + if not (isinstance(x, bytearray) or isinstance(x, bytes) or isinstance(x, str)): if STRICT: raise PDFTypeError('String required: %r' % x) return '' @@ -931,18 +966,18 @@ def stream_value(x): # ascii85decode(data) def ascii85decode(data): n = b = 0 - out = '' + out = b'' for c in data: - if '!' <= c and c <= 'u': + if b'!' <= c and c <= b'u': n += 1 - b = b*85+(ord(c)-33) + b = b*85+(c-33) if n == 5: out += struct.pack('>L',b) n = b = 0 - elif c == 'z': + elif c == b'z': assert n == 0 - out += '\0\0\0\0' - elif c == '~': + out += b'\0\0\0\0' + elif c == b'~': if n: for _ in range(5-n): b = b*85+84 @@ -963,7 +998,7 @@ def __init__(self, dic, rawdata, decipher=None): cutdiv = len(rawdata) // 16 rawdata = rawdata[:16*cutdiv] else: - if eol in ('\r', '\n', '\r\n'): + if eol in (b'\r', b'\n', b'\r\n'): rawdata = rawdata[:length] self.dic = dic @@ -1009,7 +1044,7 @@ def decode(self): # will get errors if the document is encrypted. data = zlib.decompress(data) elif f in LITERALS_LZW_DECODE: - data = ''.join(LZWDecoder(BytesIO(data)).run()) + data = b''.join(LZWDecoder(BytesIO(data)).run()) elif f in LITERALS_ASCII85_DECODE: data = ascii85decode(data) elif f == LITERAL_CRYPT: @@ -1031,14 +1066,14 @@ def decode(self): raise PDFValueError( 'Columns undefined for predictor=12') columns = int_value(params['Columns']) - buf = '' - ent0 = '\x00' * columns + buf = b'' + ent0 = b'\x00' * columns for i in range(0, len(data), columns+1): pred = data[i] ent1 = data[i+1:i+1+columns] - if pred == '\x02': - ent1 = ''.join(chr((ord(a)+ord(b)) & 255) \ - for (a,b) in zip(ent0,ent1)) + if pred == 2: + ent1 = b''.join(bytes([(a+b) & 255]) \ + for (a,b) in zip(ent0,ent1)) buf += ent1 ent0 = ent1 data = buf @@ -1072,11 +1107,11 @@ class PDFEncryptionError(PDFException): pass class PDFPasswordIncorrect(PDFEncryptionError): pass # some predefined literals and keywords. -LITERAL_OBJSTM = PSLiteralTable.intern('ObjStm') -LITERAL_XREF = PSLiteralTable.intern('XRef') -LITERAL_PAGE = PSLiteralTable.intern('Page') -LITERAL_PAGES = PSLiteralTable.intern('Pages') -LITERAL_CATALOG = PSLiteralTable.intern('Catalog') +LITERAL_OBJSTM = PSLiteralTable.intern(b'ObjStm') +LITERAL_XREF = PSLiteralTable.intern(b'XRef') +LITERAL_PAGE = PSLiteralTable.intern(b'Page') +LITERAL_PAGES = PSLiteralTable.intern(b'Pages') +LITERAL_CATALOG = PSLiteralTable.intern(b'Catalog') ## XRefs @@ -1094,7 +1129,7 @@ def __repr__(self): return '' % len(self.offsets) def objids(self): - return self.offsets.iterkeys() + return iter(self.offsets.keys()) def load(self, parser): self.offsets = {} @@ -1105,10 +1140,10 @@ def load(self, parser): raise PDFNoValidXRef('Unexpected EOF - file corrupted?') if not line: raise PDFNoValidXRef('Premature eof: %r' % parser) - if line.startswith('trailer'): + if line.startswith(b'trailer'): parser.seek(pos) break - f = line.strip().split(' ') + f = line.strip().split(b' ') if len(f) != 2: raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) try: @@ -1120,16 +1155,17 @@ def load(self, parser): (_, line) = parser.nextline() except PSEOF: raise PDFNoValidXRef('Unexpected EOF - file corrupted?') - f = line.strip().split(' ') + f = line.strip().split(b' ') 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)) + if use != b'n': + continue + self.offsets[objid] = (int(genno.decode('utf-8')), int(pos.decode('utf-8'))) self.load_trailer(parser) return - KEYWORD_TRAILER = PSKeywordTable.intern('trailer') + KEYWORD_TRAILER = PSKeywordTable.intern(b'trailer') def load_trailer(self, parser): try: (_,kwd) = parser.nexttoken() @@ -1180,8 +1216,8 @@ def load(self, parser, debug=0): raise PDFNoValidXRef('Invalid PDF stream spec.') size = stream.dic['Size'] index = stream.dic.get('Index', (0,size)) - self.index = zip(islice(index, 0, None, 2), - islice(index, 1, None, 2)) + self.index = list(zip(itertools.islice(index, 0, None, 2), + itertools.islice(index, 1, None, 2))) (self.fl1, self.fl2, self.fl3) = stream.dic['W'] self.data = stream.get_data() self.entlen = self.fl1+self.fl2+self.fl3 @@ -1234,7 +1270,8 @@ def __init__(self): # set_parser(parser) # Associates the document with an (already initialized) parser object. def set_parser(self, parser): - if self.parser: return + if self.parser: + return self.parser = parser # The document is set to be temporarily ready during collecting # all the basic information about the document, e.g. @@ -1256,13 +1293,13 @@ def set_parser(self, parser): dict_value(trailer['Encrypt'])) # fix for bad files except: - self.encryption = ('ffffffffffffffffffffffffffffffffffff', + self.encryption = (b'ffffffffffffffffffffffffffffffffffff', dict_value(trailer['Encrypt'])) if 'Root' in trailer: self.set_root(dict_value(trailer['Root'])) break - else: - raise PDFSyntaxError('No /Root object! - Is this really a PDF?') + else: + raise PDFSyntaxError('No /Root object! - Is this really a PDF?') # The document is set to be non-ready again, until all the # proper initialization (asking the password key and # verifying the access permission, so on) is finished. @@ -1283,7 +1320,7 @@ def set_root(self, root): # Perform the initialization with a given password. # This step is mandatory even if there's no password associated # with the document. - def initialize(self, password=''): + def initialize(self, password=b''): if not self.encryption: self.is_printable = self.is_modifiable = self.is_extractable = True self.ready = True @@ -1310,14 +1347,14 @@ def initialize_adobe_ps(self, password, docid, param): def genkey_adobe_ps(self, param): # nice little offline principal keys dictionary # global static principal key for German Onleihe / Bibliothek Digital - principalkeys = { 'bibliothek-digital.de': 'rRwGv2tbpKov1krvv7PO0ws9S436/lArPlfipz5Pqhw='.decode('base64')} + principalkeys = { b'bibliothek-digital.de': codecs.decode(b'rRwGv2tbpKov1krvv7PO0ws9S436/lArPlfipz5Pqhw=','base64')} self.is_printable = self.is_modifiable = self.is_extractable = True - length = int_value(param.get('Length', 0)) / 8 + length = int_value(param.get('Length', 0)) // 8 edcdata = str_value(param.get('EDCData')).decode('base64') pdrllic = str_value(param.get('PDRLLic')).decode('base64') pdrlpol = str_value(param.get('PDRLPol')).decode('base64') edclist = [] - for pair in edcdata.split('\n'): + for pair in edcdata.split(b'\n'): edclist.append(pair) # principal key request for key in principalkeys: @@ -1326,20 +1363,20 @@ def genkey_adobe_ps(self, param): else: raise IGNOBLEError('Cannot find principal key for this pdf') shakey = SHA256(principalkey) - ivector = 16 * chr(0) + ivector = bytes(16) plaintext = AES.new(shakey,AES.MODE_CBC,ivector).decrypt(edclist[9].decode('base64')) - if plaintext[-16:] != 16 * chr(16): + if plaintext[-16:] != bytearray(b'\0x10')*16: raise IGNOBLEError('Offlinekey cannot be decrypted, aborting ...') pdrlpol = AES.new(plaintext[16:32],AES.MODE_CBC,edclist[2].decode('base64')).decrypt(pdrlpol) - if ord(pdrlpol[-1]) < 1 or ord(pdrlpol[-1]) > 16: + if pdrlpol[-1] < 1 or pdrlpol[-1] > 16: raise IGNOBLEError('Could not decrypt PDRLPol, aborting ...') else: - cutter = -1 * ord(pdrlpol[-1]) + cutter = -1 * pdrlpol[-1] pdrlpol = pdrlpol[:cutter] return plaintext[:16] - PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ - '\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' + PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ + b'\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' # experimental aes pw support def initialize_standard(self, password, docid, param): # copy from a global variable @@ -1356,7 +1393,7 @@ def initialize_standard(self, password, docid, param): try: EncMetadata = str_value(param['EncryptMetadata']) except: - EncMetadata = 'True' + EncMetadata = b'True' self.is_printable = bool(P & 4) self.is_modifiable = bool(P & 8) self.is_extractable = bool(P & 16) @@ -1373,12 +1410,12 @@ def initialize_standard(self, password, docid, param): hash.update(docid[0]) # 5 # aes special handling if metadata isn't encrypted if EncMetadata == ('False' or 'false'): - hash.update('ffffffff'.decode('hex')) + hash.update(codecs.decode(b'ffffffff','hex')) if 5 <= R: # 8 for _ in range(50): - hash = hashlib.md5(hash.digest()[:length/8]) - key = hash.digest()[:length/8] + hash = hashlib.md5(hash.digest()[:length//8]) + key = hash.digest()[:length//8] if R == 2: # Algorithm 3.4 u1 = ARC4.new(key).decrypt(password) @@ -1388,7 +1425,7 @@ def initialize_standard(self, password, docid, param): hash.update(docid[0]) # 3 x = ARC4.new(key).decrypt(hash.digest()[:16]) # 4 for i in range(1,19+1): - k = ''.join( chr(ord(c) ^ i) for c in key ) + k = b''.join(bytes([c ^ i]) for c in key ) x = ARC4.new(k).decrypt(x) u1 = x+x # 32bytes total if R == 2: @@ -1410,9 +1447,9 @@ def initialize_standard(self, password, docid, param): if V != 4: self.decipher = self.decipher_rc4 # XXX may be AES # aes - elif V == 4 and Length == 128: + elif V == 4 and length == 128: elf.decipher = self.decipher_aes - elif V == 4 and Length == 256: + elif V == 4 and length == 256: raise PDFNotImplementedError('AES256 encryption is currently unsupported') self.ready = True return @@ -1429,6 +1466,9 @@ def initialize_ebx(self, keyb64, docid, param): bookkey = ''.join(rights.findtext(expr)).decode('base64') bookkey = aes.decrypt(bookkey) bookkey = bookkey[:-ord(bookkey[-1])] + # todo: Take a look at this. + # This seems to be the only function that's different between ignoblepdf and ineptpdf. + # A ton of useless duplicated code ..... bookkey = bookkey[-16:] ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) @@ -1440,12 +1480,12 @@ def initialize_ebx(self, keyb64, docid, param): else: V = 2 elif len(bookkey) == length + 1: - V = ord(bookkey[0]) + V = bookkey[0] bookkey = bookkey[1:] else: print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % ord(bookkey[0])) + print("bookkey[0] is %d" % bookkey[0]) raise IGNOBLEError('error decrypting book session key - mismatched length') else: # proper length unknown try with whatever you have @@ -1475,7 +1515,7 @@ def genkey_v3(self, objid, genno): objid = struct.pack('' - KEYWORD_R = PSKeywordTable.intern('R') - KEYWORD_ENDOBJ = PSKeywordTable.intern('endobj') - KEYWORD_STREAM = PSKeywordTable.intern('stream') - KEYWORD_XREF = PSKeywordTable.intern('xref') - KEYWORD_STARTXREF = PSKeywordTable.intern('startxref') + KEYWORD_R = PSKeywordTable.intern(b'R') + KEYWORD_ENDOBJ = PSKeywordTable.intern(b'endobj') + KEYWORD_STREAM = PSKeywordTable.intern(b'stream') + KEYWORD_XREF = PSKeywordTable.intern(b'xref') + KEYWORD_STARTXREF = PSKeywordTable.intern(b'startxref') def do_keyword(self, pos, token): if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): self.add_results(*self.pop(1)) @@ -1675,8 +1713,8 @@ def do_keyword(self, pos, token): if STRICT: raise PDFSyntaxError('Unexpected EOF') break - if 'endstream' in line: - i = line.index('endstream') + if b'endstream' in line: + i = line.index(b'endstream') objlen += i data += line[:i] break @@ -1696,7 +1734,7 @@ def find_xref(self): prev = None for line in self.revreadlines(): line = line.strip() - if line == 'startxref': break + if line == b'startxref': break if line: prev = line else: @@ -1748,7 +1786,7 @@ def read_xref(self): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') + pat = re.compile(b'^(\\d+)\\s+(\\d+)\\s+obj\\b') offsets = {} xref = PDFXRef() while 1: @@ -1756,7 +1794,7 @@ def read_xref(self): (pos, line) = self.nextline() except PSEOF: break - if line.startswith('trailer'): + if line.startswith(b'trailer'): trailerpos = pos # remember last trailer m = pat.match(line) if not m: continue @@ -1783,7 +1821,7 @@ def flush(self): self.add_results(*self.popall()) return - KEYWORD_R = KWD('R') + KEYWORD_R = KWD(b'R') def do_keyword(self, pos, token): if token is self.KEYWORD_R: # reference to indirect object @@ -1826,7 +1864,7 @@ def __init__(self, inf, userkey): def dump(self, outf): self.outf = outf self.write(self.version) - self.write('\n%\xe2\xe3\xcf\xd3\n') + self.write(b'\n%\xe2\xe3\xcf\xd3\n') doc = self.doc objids = self.objids xrefs = {} @@ -1848,18 +1886,18 @@ def dump(self, outf): startxref = self.tell() if not gen_xref_stm: - self.write('xref\n') - self.write('0 %d\n' % (maxobj + 1,)) + self.write(b'xref\n') + self.write(b'0 %d\n' % (maxobj + 1,)) for objid in range(0, maxobj + 1): if objid in xrefs: # force the genno to be 0 - self.write("%010d 00000 n \n" % xrefs[objid][0]) + self.write(b"%010d 00000 n \n" % xrefs[objid][0]) else: - self.write("%010d %05d f \n" % (0, 65535)) + self.write(b"%010d %05d f \n" % (0, 65535)) - self.write('trailer\n') + self.write(b'trailer\n') self.serialize_object(trailer) - self.write('\nstartxref\n%d\n%%%%EOF' % startxref) + self.write(b'\nstartxref\n%d\n%%%%EOF' % startxref) else: # Generate crossref stream. @@ -1908,7 +1946,7 @@ def dump(self, outf): data.append(struct.pack('>L', f2)[-fl2:]) data.append(struct.pack('>L', f3)[-fl3:]) index.extend((first, prev - first + 1)) - data = zlib.compress(''.join(data)) + data = zlib.compress(b''.join(data)) dic = {'Type': LITERAL_XREF, 'Size': prev + 1, 'Index': index, 'W': [1, fl2, fl3], 'Length': len(data), 'Filter': LITERALS_FLATE_DECODE[0], @@ -1917,7 +1955,7 @@ def dump(self, outf): dic['Info'] = trailer['Info'] xrefstm = PDFStream(dic, data) self.serialize_indirect(maxobj, xrefstm) - self.write('startxref\n%d\n%%%%EOF' % startxref) + self.write(b'startxref\n%d\n%%%%EOF' % startxref) def write(self, data): self.outf.write(data) self.last = data[-1:] @@ -1926,13 +1964,10 @@ def tell(self): return self.outf.tell() def escape_string(self, string): - string = string.replace('\\', '\\\\') - string = string.replace('\n', r'\n') - string = string.replace('(', r'\(') - string = string.replace(')', r'\)') - # get rid of ciando id - regularexp = re.compile(r'http://www.ciando.com/index.cfm/intRefererID/\d{5}') - if regularexp.match(string): return ('http://www.ciando.com') + string = string.replace(b'\\', b'\\\\') + string = string.replace(b'\n', b'\\n') + string = string.replace(b'(', b'\\(') + string = string.replace(b')', b'\\)') return string def serialize_object(self, obj): @@ -1943,34 +1978,38 @@ def serialize_object(self, obj): obj['Subtype'] = obj['Type'] del obj['Type'] # end - hope this doesn't have bad effects - self.write('<<') + self.write(b'<<') for key, val in obj.items(): - self.write('/%s' % key) + self.write(str(PSLiteralTable.intern(key.encode('utf-8'))).encode('utf-8')) self.serialize_object(val) - self.write('>>') + self.write(b'>>') elif isinstance(obj, list): - self.write('[') + self.write(b'[') for val in obj: self.serialize_object(val) - self.write(']') + self.write(b']') + elif isinstance(obj, bytearray): + self.write(b'(%s)' % self.escape_string(obj)) + elif isinstance(obj, bytes): + self.write(b'(%s)' % self.escape_string(obj)) elif isinstance(obj, str): - self.write('(%s)' % self.escape_string(obj)) + self.write(b'(%s)' % self.escape_string(obj.encode('utf-8'))) elif isinstance(obj, bool): if self.last.isalnum(): - self.write(' ') - self.write(str(obj).lower()) + self.write(b' ') + self.write(str(obj).lower().encode('utf-8')) elif isinstance(obj, (int, long)): if self.last.isalnum(): - self.write(' ') - self.write(str(obj)) + self.write(b' ') + self.write(str(obj).encode('utf-8')) elif isinstance(obj, Decimal): if self.last.isalnum(): - self.write(' ') - self.write(str(obj)) + self.write(b' ') + self.write(str(obj).encode('utf-8')) elif isinstance(obj, PDFObjRef): if self.last.isalnum(): - self.write(' ') - self.write('%d %d R' % (obj.objid, 0)) + self.write(b' ') + self.write(b'%d %d R' % (obj.objid, 0)) elif isinstance(obj, PDFStream): ### If we don't generate cross ref streams the object streams ### are no longer useful, as we have extracted all objects from @@ -1980,21 +2019,21 @@ def serialize_object(self, obj): else: data = obj.get_decdata() self.serialize_object(obj.dic) - self.write('stream\n') + self.write(b'stream\n') self.write(data) - self.write('\nendstream') + self.write(b'\nendstream') else: - data = str(obj) - if data[0].isalnum() and self.last.isalnum(): - self.write(' ') + data = str(obj).encode('utf-8') + if bytes([data[0]]).isalnum() and self.last.isalnum(): + self.write(b' ') self.write(data) def serialize_indirect(self, objid, obj): - self.write('%d 0 obj' % (objid,)) + self.write(b'%d 0 obj' % (objid,)) self.serialize_object(obj) if self.last.isalnum(): - self.write('\n') - self.write('endobj\n') + self.write(b'\n') + self.write(b'endobj\n') @@ -2003,12 +2042,7 @@ def decryptBook(userkey, inpath, outpath): if AES is None: raise IGNOBLEError("PyCrypto or OpenSSL must be installed.") with open(inpath, 'rb') as inf: - #try: serializer = PDFSerializer(inf, userkey) - #except: - # print("Error serializing pdf {0}. Probably wrong key.".format(os.path.basename(inpath))) - # return 2 - # hope this will fix the 'bad file descriptor' problem with open(outpath, 'wb') as outf: # help construct to make sure the method runs to the end try: diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 3f01a7cc..759a6061 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -58,11 +58,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -104,7 +110,7 @@ def unicode_argv(): return ["ineptepub.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class ADEPTError(Exception): diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 7dc6e837..f8a55923 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -76,11 +76,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -119,7 +125,7 @@ def unicode_argv(): return ["ineptpdf.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class ADEPTError(Exception): @@ -553,17 +559,17 @@ def keyword_name(x): ## PSBaseParser ## -EOL = re.compile(rb'[\r\n]') -SPC = re.compile(rb'\s') -NONSPC = re.compile(rb'\S') -HEX = re.compile(rb'[0-9a-fA-F]') -END_LITERAL = re.compile(rb'[#/%\[\]()<>{}\s]') -END_HEX_STRING = re.compile(rb'[^\s0-9a-fA-F]') -HEX_PAIR = re.compile(rb'[0-9a-fA-F]{2}|.') -END_NUMBER = re.compile(rb'[^0-9]') -END_KEYWORD = re.compile(rb'[#/%\[\]()<>{}\s]') -END_STRING = re.compile(rb'[()\\]') -OCT_STRING = re.compile(rb'[0-7]') +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'[()\\]') +OCT_STRING = re.compile(br'[0-7]') ESC_STRING = { b'b':8, b't':9, b'n':10, b'f':12, b'r':13, b'(':40, b')':41, b'\\':92 } class PSBaseParser(object): @@ -628,7 +634,12 @@ def parse_main(self, s, i): if not m: return (self.parse_main, len(s)) j = m.start(0) - c = bytes([s[j]]) + if isinstance(s[j], str): + # Python 2 + c = s[j] + else: + # Python 3 + c = bytes([s[j]]) self.tokenstart = self.bufpos+j if c == b'%': self.token = c @@ -680,7 +691,10 @@ def parse_literal(self, s, i): return (self.parse_literal, len(s)) j = m.start(0) self.token += s[i:j] - c = bytes([s[j]]) + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) if c == b'#': self.hex = b'' return (self.parse_literal_hex, j+1) @@ -688,7 +702,10 @@ def parse_literal(self, s, i): return (self.parse_main, j) def parse_literal_hex(self, s, i): - c = bytes([s[i]]) + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if HEX.match(c) and len(self.hex) < 2: self.hex += c return (self.parse_literal_hex, i+1) @@ -703,7 +720,10 @@ def parse_number(self, s, i): return (self.parse_number, len(s)) j = m.start(0) self.token += s[i:j] - c = bytes([s[j]]) + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) if c == b'.': self.token += c return (self.parse_decimal, j+1) @@ -746,7 +766,10 @@ def parse_string(self, s, i): return (self.parse_string, len(s)) j = m.start(0) self.token += s[i:j] - c = bytes([s[j]]) + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) if c == b'\\': self.oct = '' return (self.parse_string_1, j+1) @@ -763,7 +786,10 @@ def parse_string(self, s, i): return (self.parse_main, j+1) def parse_string_1(self, s, i): - c = bytes([s[i]]) + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if OCT_STRING.match(c) and len(self.oct) < 3: self.oct += c return (self.parse_string_1, i+1) @@ -775,7 +801,10 @@ def parse_string_1(self, s, i): return (self.parse_string, i+1) def parse_wopen(self, s, i): - c = bytes([s[i]]) + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if c.isspace() or HEX.match(c): return (self.parse_hexstring, i) if c == b'<': @@ -784,7 +813,10 @@ def parse_wopen(self, s, i): return (self.parse_main, i) def parse_wclose(self, s, i): - c = bytes([s[i]]) + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if c == b'>': self.add_token(KEYWORD_DICT_END) i += 1 @@ -926,6 +958,7 @@ def nextobject(self, direct=False): isinstance(token, bool) or isinstance(token, bytearray) or isinstance(token, bytes) or + isinstance(token, str) or isinstance(token, PSLiteral)): # normal token self.push((pos, token)) @@ -1033,7 +1066,7 @@ def decipher_all(decipher, objid, genno, x): ''' Recursively decipher X. ''' - if isinstance(x, bytearray) or isinstance(x,bytes): + if isinstance(x, bytearray) or isinstance(x,bytes) or isinstance(x,str): return decipher(objid, genno, x) decf = lambda v: decipher_all(decipher, objid, genno, v) if isinstance(x, list): @@ -1070,7 +1103,7 @@ def num_value(x): def str_value(x): x = resolve1(x) - if not (isinstance(x, bytearray) or isinstance(x, bytes)): + if not (isinstance(x, bytearray) or isinstance(x, bytes) or isinstance(x, str)): if STRICT: raise PDFTypeError('String required: %r' % x) return '' @@ -1420,7 +1453,6 @@ def set_parser(self, parser): for xref in self.xrefs: trailer = xref.trailer if not trailer: continue - # If there's an encryption info, remember it. if 'Encrypt' in trailer: #assert not self.encryption @@ -1953,7 +1985,7 @@ def read_xref(self): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(rb'^(\d+)\s+(\d+)\s+obj\b') + pat = re.compile(b'^(\\d+)\\s+(\\d+)\\s+obj\\b') offsets = {} xref = PDFXRef() while 1: @@ -2158,9 +2190,9 @@ def tell(self): def escape_string(self, string): string = string.replace(b'\\', b'\\\\') - string = string.replace(b'\n', rb'\n') - string = string.replace(b'(', rb'\(') - string = string.replace(b')', rb'\)') + string = string.replace(b'\n', b'\\n') + string = string.replace(b'(', b'\\(') + string = string.replace(b')', b'\\)') return string def serialize_object(self, obj): diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index cede191e..4a305359 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -103,11 +103,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -148,7 +154,7 @@ def unicode_argv(): return ["mobidedrm.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] # cleanup unicode filenames # borrowed from calibre from calibre/src/calibre/__init__.py diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 35baa462..68cea6bf 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -61,11 +61,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -109,7 +115,7 @@ def unicode_argv(): return ["kindlekey.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class DrmException(Exception): pass diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index d6403069..ba80e9b6 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -26,11 +26,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -71,7 +77,7 @@ def unicode_argv(): return ["kindlepid.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] letters = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index e5a212b0..ec03fdb8 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -94,11 +94,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -139,7 +145,7 @@ def unicode_argv(): return ["mobidedrm.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class DrmException(Exception): diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 5125d623..98db615c 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -32,11 +32,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data, str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() - + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) @@ -77,7 +83,7 @@ def unicode_argv(): return ["mobidedrm.py"] else: argvencoding = sys.stdin.encoding or "utf-8" - return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv] + return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] #global switch debug = False diff --git a/DeDRM_plugin/zipfilerugged.py b/DeDRM_plugin/zipfilerugged.py index b2f37626..aef9ea3f 100755 --- a/DeDRM_plugin/zipfilerugged.py +++ b/DeDRM_plugin/zipfilerugged.py @@ -209,6 +209,7 @@ def _EndRecData(fpin): fpin.seek(-sizeEndCentDir, 2) except IOError: return None + data = fpin.read() if data[0:4] == stringEndArchive and data[-2:] == "\000\000": # the signature is correct and there's no comment, unpack structure @@ -662,7 +663,8 @@ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False): self.comment = b'' # Check if we were passed a file-like object - if isinstance(file, str): + # "str" is python3, "unicode" is python2 + if isinstance(file, str) or isinstance(file, unicode): self._filePassed = 0 self.filename = file modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'} From b4c0e33b8ba8a00e7f6b8857c9d7db54164f342b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 11:21:03 +0100 Subject: [PATCH 021/154] Fix ADE key import through plugin settings --- DeDRM_plugin/config.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 73df7591..cf9cf421 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -736,21 +736,24 @@ def __init__(self, parent=None,): if iswindows or isosx: from calibre_plugins.dedrm.adobekey import adeptkeys - defaultkeys = adeptkeys() + defaultkeys, defaultnames = adeptkeys() else: # linux from .wineutils import WineGetKeys scriptpath = os.path.join(parent.parent.alfdir,"adobekey.py") - defaultkeys = WineGetKeys(scriptpath, ".der",parent.getwineprefix()) + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",parent.getwineprefix()) self.default_key = defaultkeys[0] + self.default_name_A = defaultnames[0] except: traceback.print_exc() self.default_key = "" - self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + if len(self.default_key)>0: + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + data_group_box = QGroupBox("", self) layout.addWidget(data_group_box) data_group_box_layout = QVBoxLayout() @@ -759,12 +762,14 @@ def __init__(self, parent=None,): key_group = QHBoxLayout() data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Unique Key Name:", self)) - self.key_ledit = QLineEdit("default_key", self) + self.key_ledit = QLineEdit(self.default_name_A, self) self.key_ledit.setToolTip("

Enter an identifying name for the current default Adobe Digital Editions key.") key_group.addWidget(self.key_ledit) self.button_box.accepted.connect(self.accept) else: + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok) + default_key_error = QLabel("The default encryption key for Adobe Digital Editions could not be found.", self) default_key_error.setAlignment(Qt.AlignHCenter) layout.addWidget(default_key_error) From 9c41716e5ef3812807859fc91497fe158796fb3f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 11:48:53 +0100 Subject: [PATCH 022/154] Add B&N PDF DeDRM (untested), match UUID for Adobe PDFs --- DeDRM_plugin/__init__.py | 32 +++++++++++++++++- DeDRM_plugin/ignoblepdf.py | 7 ++-- DeDRM_plugin/ineptpdf.py | 68 +++++++++++++++++++++++++++++++++----- 3 files changed, 95 insertions(+), 12 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 9ee3a39f..6fc4594f 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -544,7 +544,7 @@ def PDFDecrypt(self,path_to_ebook): # If we end up here, we didn't find a key with a matching UUID, so lets just try all of them. - # Attempt to decrypt epub with each encryption key (generated or provided). + # Attempt to decrypt PDF with each encryption key (generated or provided). for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): userkey = codecs.decode(userkeyhex,'hex') print("{0} v{1}: Trying encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) @@ -640,6 +640,36 @@ def PDFDecrypt(self,path_to_ebook): except Exception as e: pass + + # Unable to decrypt the PDF with any of the existing keys. Is it a B&N PDF? + # Attempt to decrypt PDF with each encryption key (generated or provided). + for keyname, userkey in dedrmprefs['bandnkeys'].items(): + keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) + of = self.temporary_file(".pdf") + + # Give the user key, ebook and TemporaryPersistent file to the decryption function. + try: + result = ineptpdf.decryptBook(userkey, path_to_ebook, of.name, False) + except ineptpdf.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return path_to_ebook + except: + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + result = 1 + + of.close() + + if result == 0: + # Decryption was successful. + # Return the modified PersistentTemporary file to calibre. + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + return of.name + + print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + + # Something went wrong with decryption. print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) diff --git a/DeDRM_plugin/ignoblepdf.py b/DeDRM_plugin/ignoblepdf.py index 9f2c4dba..1e6d66ae 100644 --- a/DeDRM_plugin/ignoblepdf.py +++ b/DeDRM_plugin/ignoblepdf.py @@ -24,6 +24,7 @@ __license__ = 'GPL v3' __version__ = "0.3" +import codecs import sys import os import re @@ -312,7 +313,7 @@ class PSLiteral(PSObject): Use PSLiteralTable.intern() instead. ''' def __init__(self, name): - self.name = name + self.name = name.decode('utf-8') return def __repr__(self): @@ -1448,7 +1449,7 @@ def initialize_standard(self, password, docid, param): self.decipher = self.decipher_rc4 # XXX may be AES # aes elif V == 4 and length == 128: - elf.decipher = self.decipher_aes + self.decipher = self.decipher_aes elif V == 4 and length == 256: raise PDFNotImplementedError('AES256 encryption is currently unsupported') self.ready = True @@ -1491,7 +1492,7 @@ def initialize_ebx(self, keyb64, docid, param): # proper length unknown try with whatever you have print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % ord(bookkey[0])) + print("bookkey[0] is %d" % bookkey[0]) if ebx_V == 3: V = 3 else: diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index f8a55923..51ca17e3 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1488,7 +1488,7 @@ def set_root(self, root): # Perform the initialization with a given password. # This step is mandatory even if there's no password associated # with the document. - def initialize(self, password=b''): + def initialize(self, password=b'', inept=True): if not self.encryption: self.is_printable = self.is_modifiable = self.is_extractable = True self.ready = True @@ -1500,8 +1500,11 @@ def initialize(self, password=b''): return self.initialize_adobe_ps(password, docid, param) if type == 'Standard': return self.initialize_standard(password, docid, param) - if type == 'EBX_HANDLER': - return self.initialize_ebx(password, docid, param) + if type == 'EBX_HANDLER' and inept is True: + return self.initialize_ebx_inept(password, docid, param) + if type == 'EBX_HANDLER' and inept is False: + return self.initialize_ebx_ignoble(password, docid, param) + raise PDFEncryptionError('Unknown filter: param=%r' % param) def initialize_adobe_ps(self, password, docid, param): @@ -1642,7 +1645,52 @@ def verify_book_key(self, bookkey): return True - def initialize_ebx(self, password, docid, param): + def initialize_ebx_ignoble(self, keyb64, docid, param): + self.is_printable = self.is_modifiable = self.is_extractable = True + key = keyb64.decode('base64')[:16] + aes = AES.new(key,AES.MODE_CBC,"\x00" * len(key)) + length = int_value(param.get('Length', 0)) / 8 + rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') + rights = zlib.decompress(rights, -15) + rights = etree.fromstring(rights) + expr = './/{http://ns.adobe.com/adept}encryptedKey' + bookkey = ''.join(rights.findtext(expr)).decode('base64') + bookkey = aes.decrypt(bookkey) + bookkey = bookkey[:-ord(bookkey[-1])] + bookkey = bookkey[-16:] + ebx_V = int_value(param.get('V', 4)) + ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) + # added because of improper booktype / decryption book session key errors + if length > 0: + if len(bookkey) == length: + if ebx_V == 3: + V = 3 + else: + V = 2 + elif len(bookkey) == length + 1: + V = bookkey[0] + bookkey = bookkey[1:] + else: + print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) + print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) + print("bookkey[0] is %d" % bookkey[0]) + raise ADEPTError('error decrypting book session key - mismatched length') + else: + # proper length unknown try with whatever you have + print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) + print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) + print("bookkey[0] is %d" % ord(bookkey[0])) + if ebx_V == 3: + V = 3 + else: + V = 2 + self.decrypt_key = bookkey + self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 + self.decipher = self.decrypt_rc4 + self.ready = True + return + + def initialize_ebx_inept(self, password, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True rsa = RSA(password) length = int_value(param.get('Length', 0)) // 8 @@ -2042,15 +2090,19 @@ def do_keyword(self, pos, token): def adeptGetUserUUID(inf): try: doc = PDFDocument() + inf = open(inf, 'rb') pars = PDFParser(doc, inf) (docid, param) = doc.encryption type = literal_name(param['Filter']) if type != 'EBX_HANDLER': # No EBX_HANDLER, no idea which user key can decrypt this. + inf.close() return None rights = codecs.decode(param.get('ADEPT_LICENSE'), 'base64') + inf.close() + rights = zlib.decompress(rights, -15) rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}user' @@ -2066,14 +2118,14 @@ def adeptGetUserUUID(inf): ### My own code, for which there is none else to blame class PDFSerializer(object): - def __init__(self, inf, userkey): + def __init__(self, inf, userkey, inept=True): global GEN_XREF_STM, gen_xref_stm gen_xref_stm = GEN_XREF_STM > 1 self.version = inf.read(8) inf.seek(0) self.doc = doc = PDFDocument() parser = PDFParser(doc, inf) - doc.initialize(userkey) + doc.initialize(userkey, inept) self.objids = objids = set() for xref in reversed(doc.xrefs): trailer = xref.trailer @@ -2263,11 +2315,11 @@ def serialize_indirect(self, objid, obj): -def decryptBook(userkey, inpath, outpath): +def decryptBook(userkey, inpath, outpath, inept=True): if RSA is None: raise ADEPTError("PyCryptodome or OpenSSL must be installed.") with open(inpath, 'rb') as inf: - serializer = PDFSerializer(inf, userkey) + serializer = PDFSerializer(inf, userkey, inept) with open(outpath, 'wb') as outf: # help construct to make sure the method runs to the end try: From 39f8595139a122d2d15159f10f1196076f8790ee Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 15:23:54 +0100 Subject: [PATCH 023/154] Remove CDP watermark from EPUBs --- DeDRM_plugin/__init__.py | 109 ++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 25 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 6fc4594f..6e9dc9b6 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -94,7 +94,9 @@ import time import zipfile import traceback -from zipfile import ZipFile +from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from contextlib import closing + class DeDRMError(Exception): pass @@ -205,35 +207,92 @@ def initialize(self): traceback.print_exc() raise + def postProcessEPUB(self, path_to_ebook): + # This is called after the DRM is removed (or if no DRM was present) + # It does stuff like de-obfuscating fonts (by calling checkFonts) + # or removing watermarks. + path_to_ebook = self.checkFonts(path_to_ebook) + path_to_ebook = self.removeCDPwatermarkFromEPUB(path_to_ebook) + + return path_to_ebook + + def removeCDPwatermarkFromEPUB(self, path_to_ebook): + # "META-INF/cdp.info" is a watermark file used by some Tolino vendors. + # We don't want that in our eBooks, so lets remove that file. + try: + infile = ZipFile(open(path_to_ebook, 'rb')) + namelist = infile.namelist() + if 'META-INF/cdp.info' not in namelist: + return path_to_ebook + + namelist.remove("mimetype") + namelist.remove("META-INF/cdp.info") + + output = self.temporary_file(".epub").name + + kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) + with closing(ZipFile(open(output, 'wb'), 'w', **kwds)) as outf: + for path in (["mimetype"] + namelist): + + data = infile.read(path) + + zi = ZipInfo(path) + oldzi = infile.getinfo(path) + try: + zi.compress_type = oldzi.compress_type + if path == "mimetype": + zi.compress_type = ZIP_STORED + zi.date_time = oldzi.date_time + zi.comment = oldzi.comment + zi.extra = oldzi.extra + zi.internal_attr = oldzi.internal_attr + zi.external_attr = oldzi.external_attr + zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 + except: + pass + + outf.writestr(zi, data) + + print("{0} v{1}: Successfully removed cdp.info watermark".format(PLUGIN_NAME, PLUGIN_VERSION)) + return output + + except: + return path_to_ebook + def checkFonts(self, path_to_ebook): # This is called after the normal DRM removal is done. # It checks if there's fonts that need to be deobfuscated - import calibre_plugins.dedrm.prefs as prefs - dedrmprefs = prefs.DeDRM_Prefs() + try: + import calibre_plugins.dedrm.prefs as prefs + dedrmprefs = prefs.DeDRM_Prefs() - if dedrmprefs["deobfuscate_fonts"] is True: - import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt + if dedrmprefs["deobfuscate_fonts"] is True: + import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt - output = self.temporary_file(".epub").name - ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) + output = self.temporary_file(".epub").name + ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) - if (ret == 0): - print("Font deobfuscation successful") - return output - elif (ret == 1): - print("No font obfuscation found") + if (ret == 0): + return output + elif (ret == 1): + return path_to_ebook + else: + print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) + raise DeDRMError("Font deobfuscation failed") + else: return path_to_ebook - else: - print("Errors during font deobfuscation!") - raise DeDRMError("Font deobfuscation failed") - else: + except: + print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) return path_to_ebook def ePubDecrypt(self,path_to_ebook): # Create a TemporaryPersistent file to work with. # Check original epub archive for zip errors. - import calibre_plugins.dedrm.zipfix + import calibre_plugins.dedrm.zipfix as zipfix inf = self.temporary_file(".epub") try: @@ -275,7 +334,7 @@ def ePubDecrypt(self,path_to_ebook): if result == 0: # Decryption was successful. # Return the modified PersistentTemporary file to calibre. - return self.checkFonts(of.name) + return self.postProcessEPUB(of.name) print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) @@ -334,7 +393,7 @@ def ePubDecrypt(self,path_to_ebook): print("{0} v{1}: Exception saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() # Return the modified PersistentTemporary file to calibre. - return self.checkFonts(of.name) + return self.postProcessEPUB(of.name) print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except Exception as e: @@ -377,10 +436,10 @@ def ePubDecrypt(self,path_to_ebook): of.close() if result == 0: print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return self.checkFonts(of.name) + return self.postProcessEPUB(of.name) except ineptepub.ADEPTNewVersionError: print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - return path_to_ebook + return self.postProcessEPUB(path_to_ebook) except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) @@ -398,7 +457,7 @@ def ePubDecrypt(self,path_to_ebook): result = ineptepub.decryptBook(userkey, inf.name, of.name) except ineptepub.ADEPTNewVersionError: print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - return path_to_ebook + return self.postProcessEPUB(path_to_ebook) except: print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -413,7 +472,7 @@ def ePubDecrypt(self,path_to_ebook): # Decryption was successful. # Return the modified PersistentTemporary file to calibre. print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return self.checkFonts(of.name) + return self.postProcessEPUB(of.name) print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) @@ -481,7 +540,7 @@ def ePubDecrypt(self,path_to_ebook): traceback.print_exc() print("{0} v{1}: Decrypted with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) # Return the modified PersistentTemporary file to calibre. - return self.checkFonts(of.name) + return self.postProcessEPUB(of.name) print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except Exception as e: @@ -496,7 +555,7 @@ def ePubDecrypt(self,path_to_ebook): # Not a Barnes & Noble nor an Adobe Adept # Probably a DRM-free EPUB, but we should still check for fonts. print("{0} v{1}: “{2}” is neither an Adobe Adept nor a Barnes & Noble encrypted ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - return self.checkFonts(inf.name) + return self.postProcessEPUB(inf.name) #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) def PDFDecrypt(self,path_to_ebook): From f20bede24283bc9392ee557855a9b403dc140cc1 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 17:14:03 +0100 Subject: [PATCH 024/154] Auto-import keys from DeACSM plugin --- DeDRM_plugin/__init__.py | 37 ++++++++++++++++--- DeDRM_plugin/config.py | 78 +++++++++++++++++++++++++++++++++------- 2 files changed, 99 insertions(+), 16 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 6e9dc9b6..515c356f 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -508,9 +508,24 @@ def ePubDecrypt(self,path_to_ebook): for keyvalue in defaultkeys: if codecs.encode(keyvalue, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): newkeys.append(keyvalue) - newnames.append(defaultnames[idx]) + newnames.append("default_ade_key_uuid_" + defaultnames[idx]) idx += 1 + # Check for DeACSM keys: + try: + from calibre_plugins.dedrm.config import checkForDeACSMkeys + + newkey, newname = checkForDeACSMkeys() + + if newkey is not None: + if codecs.encode(newkey, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): + print("{0} v{1}: Found new key '{2}' in DeACSM plugin".format(PLUGIN_NAME, PLUGIN_VERSION, newname)) + newkeys.append(newkey) + newnames.append(newname) + except: + traceback.print_exc() + pass + if len(newkeys) > 0: try: for i,userkey in enumerate(newkeys): @@ -532,7 +547,7 @@ def ePubDecrypt(self,path_to_ebook): # Store the new successful key in the defaults print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) try: - dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key_uuid_' + newnames[i], codecs.encode(userkey, 'hex').decode('ascii')) + dedrmprefs.addnamedvaluetoprefs('adeptkeys', newnames[i], codecs.encode(userkey, 'hex').decode('ascii')) dedrmprefs.writeprefs() print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except: @@ -662,9 +677,23 @@ def PDFDecrypt(self,path_to_ebook): for keyvalue in defaultkeys: if codecs.encode(keyvalue,'hex') not in dedrmprefs['adeptkeys'].values(): newkeys.append(keyvalue) - newnames.append(defaultnames[idx]) + newnames.append("default_ade_key_uuid_" + defaultnames[idx]) idx += 1 + # Check for DeACSM keys: + try: + from calibre_plugins.dedrm.config import checkForDeACSMkeys + + newkey, newname = checkForDeACSMkeys() + + if newkey is not None: + if codecs.encode(newkey, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): + print("{0} v{1}: Found new key '{2}' in DeACSM plugin".format(PLUGIN_NAME, PLUGIN_VERSION, newname)) + newkeys.append(keyvalue) + newnames.append(newname) + except: + pass + if len(newkeys) > 0: try: for i,userkey in enumerate(newkeys): @@ -686,7 +715,7 @@ def PDFDecrypt(self,path_to_ebook): # Store the new successful key in the defaults print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) try: - dedrmprefs.addnamedvaluetoprefs('adeptkeys','default_key_uuid_' + newnames[i], codecs.encode(userkey,'hex').decode('ascii')) + dedrmprefs.addnamedvaluetoprefs('adeptkeys', newnames[i], codecs.encode(userkey,'hex').decode('ascii')) dedrmprefs.writeprefs() print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except: diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index cf9cf421..fe2e443d 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -30,6 +30,37 @@ import calibre_plugins.dedrm.prefs as prefs import calibre_plugins.dedrm.androidkindlekey as androidkindlekey +def checkForDeACSMkeys(): + try: + from calibre_plugins.deacsm.libadobeAccount import exportAccountEncryptionKeyDER, getAccountUUID + from calibre.ptempfile import TemporaryFile + + + acc_uuid = getAccountUUID() + if acc_uuid is None: + return None, None + + name = "DeACSM_uuid_" + getAccountUUID() + + # Unfortunately, the DeACSM plugin only has code to export to a file, not to return raw key bytes. + # Make a temporary file, have the plugin write to that, then read (& delete) that file. + + with TemporaryFile(suffix='.der') as tmp_key_file: + export_result = exportAccountEncryptionKeyDER(tmp_key_file) + + if (export_result is False): + return None, None + + # Read key file + with open(tmp_key_file,'rb') as keyfile: + new_key_value = keyfile.read() + + return new_key_value, name + except: + traceback.print_exc() + return None, None + + class ConfigWidget(QWidget): def __init__(self, plugin_path, alfdir): QWidget.__init__(self) @@ -461,7 +492,6 @@ def export_key(self): class RenameKeyDialog(QDialog): def __init__(self, parent=None,): - print(repr(self), repr(parent)) QDialog.__init__(self, parent) self.parent = parent self.setWindowTitle("{0} {1}: Rename {0}".format(PLUGIN_NAME, PLUGIN_VERSION, parent.key_type_name)) @@ -512,12 +542,6 @@ def key_name(self): return str(self.key_ledit.text()).strip() - - - - - - class AddBandNKeyDialog(QDialog): def __init__(self, parent=None,): QDialog.__init__(self, parent) @@ -745,10 +769,38 @@ def __init__(self, parent=None,): self.default_key = defaultkeys[0] self.default_name_A = defaultnames[0] + + for key in self.parent.plugin_keys.values(): + if key == codecs.encode(self.default_key,'hex').decode("utf-8"): + # We already have the ADE key imported into the plugin. + # Set it back to "" as if we had not found anything, + # so the next code path searches more places for potential keys. + print("Found key '{0}' in ADE - already present, skipping.".format(self.default_name_A)) + self.default_key = "" + break + except: - traceback.print_exc() self.default_key = "" + self.foundInPlugin = False + + + if len(self.default_key) == 0: + # No (new) key found in ADE. Check the DeACSM calibre plugin instead. + key, name = checkForDeACSMkeys() + + if key is not None: + self.default_key = key + self.default_name_A = name + + for key in self.parent.plugin_keys.values(): + if key == codecs.encode(self.default_key,'hex').decode("utf-8"): + # We already have the ADE key imported into the plugin. + # Set it back to "" as if we had not found anything, + # so the next code path searches more places for potential keys. + print("Found key '{0}' in DeACSM - already present, skipping.".format(self.default_name_A)) + self.default_key = "" + break if len(self.default_key)>0: @@ -763,14 +815,16 @@ def __init__(self, parent=None,): data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Unique Key Name:", self)) self.key_ledit = QLineEdit(self.default_name_A, self) - self.key_ledit.setToolTip("

Enter an identifying name for the current default Adobe Digital Editions key.") + self.key_ledit.setToolTip("

Enter an identifying name for the current Adobe key. Note that it's recommended to leave the UUID (the random-looking digits and letters) as it is.") key_group.addWidget(self.key_ledit) self.button_box.accepted.connect(self.accept) - else: + else: + # No new key found - neither in ADE nor in the DeACSM plugin + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok) - default_key_error = QLabel("The default encryption key for Adobe Digital Editions could not be found.", self) + default_key_error = QLabel("No new ADE key could be found. Either ADE is not installed, or the key is already present in the plugin.", self) default_key_error.setAlignment(Qt.AlignHCenter) layout.addWidget(default_key_error) # if no default, bot buttons do the same @@ -787,7 +841,7 @@ def key_name(self): @property def key_value(self): - return codecs.encode(self.default_key,'hex') + return codecs.encode(self.default_key,'hex').decode("utf-8") def accept(self): From 5d10420422addaeeb20556c13d45d0285b1d7f43 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 20:09:24 +0100 Subject: [PATCH 025/154] Fix font deobfuscation for Python 2 --- DeDRM_plugin/epubfontdecrypt.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py index 858f25e6..de40b526 100644 --- a/DeDRM_plugin/epubfontdecrypt.py +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -15,6 +15,8 @@ Decrypts / deobfuscates font files in EPUB files """ +from __future__ import print_function + __license__ = 'GPL v3' __version__ = "1" @@ -132,7 +134,11 @@ def decrypt(self, path, data): return data def deobfuscate_single_data(self, key, data): - msg = bytes([c^k for c,k in zip(data, itertools.cycle(key))]) + try: + msg = bytes([c^k for c,k in zip(data, itertools.cycle(key))]) + except TypeError: + # Python 2 + msg = ''.join(chr(ord(c)^ord(k)) for c,k in itertools.izip(data, itertools.cycle(key))) return msg @@ -308,6 +314,7 @@ def decryptFontsBook(inpath, outpath): outf.writestr(zi, decryptor.decrypt(path, data)) except: print("Could not decrypt fonts in {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) + traceback.print_exc() return 2 return 0 From d9353bdd9372f607d9ab8a8059ee4469541406a8 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 16 Nov 2021 21:22:09 +0100 Subject: [PATCH 026/154] Obok plugin cleanup --- Obok_plugin/__init__.py | 4 ++-- Obok_plugin/config.py | 2 +- Obok_plugin/obok/obok.py | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Obok_plugin/__init__.py b/Obok_plugin/__init__.py index 60daad37..2ecc16a9 100644 --- a/Obok_plugin/__init__.py +++ b/Obok_plugin/__init__.py @@ -3,7 +3,7 @@ print_function) __license__ = 'GPL v3' -__version__ = '7.2.1' +__version__ = '10.0.0' __docformat__ = 'restructuredtext en' ##################################################################### @@ -20,7 +20,7 @@ PLUGIN_NAME = 'Obok DeDRM' PLUGIN_SAFE_NAME = PLUGIN_NAME.strip().lower().replace(' ', '_') PLUGIN_DESCRIPTION = _('Removes DRM from Kobo kepubs and adds them to the library.') -PLUGIN_VERSION_TUPLE = (7, 2, 1) +PLUGIN_VERSION_TUPLE = (10, 0, 0) PLUGIN_VERSION = '.'.join([str(x) for x in PLUGIN_VERSION_TUPLE]) HELPFILE_NAME = PLUGIN_SAFE_NAME + '_Help.htm' PLUGIN_AUTHORS = 'Anon' diff --git a/Obok_plugin/config.py b/Obok_plugin/config.py index 2830dad2..deb29f9b 100644 --- a/Obok_plugin/config.py +++ b/Obok_plugin/config.py @@ -204,7 +204,7 @@ def key_value(self): def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): - errmsg = "Please enter an eInk Kindle Serial Number or click Cancel in the dialog." + errmsg = "Please enter an eInk Kobo Serial Number or click Cancel in the dialog." return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) if len(self.key_name) != 13: errmsg = "EInk Kobo Serial Numbers must be 13 characters long. This is {0:d} characters long.".format(len(self.key_name)) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index 00f2207c..ae8ff899 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -1,9 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# Version 10.0.0 November 2021 +# Merge https://github.com/apprenticeharper/DeDRM_tools/pull/1691 to fix +# key fetch issues on some machines. +# # Version 4.1.0 February 2021 # Add detection for Kobo directory location on Linux - +# # Version 4.0.0 September 2020 # Python 3.0 # From 1545d76803da31873e3dd956b34776ca37874c36 Mon Sep 17 00:00:00 2001 From: Derek Tracy Date: Wed, 24 Feb 2021 20:54:39 -0500 Subject: [PATCH 027/154] Support Python 2.7 and Python 3 winreg imports on Windows --- DeDRM_plugin/adobekey.py | 5 ++++- DeDRM_plugin/ignoblekey.py | 5 ++++- DeDRM_plugin/kindlekey.py | 6 +++++- DeDRM_plugin/simpleprefs.py | 5 ++++- Obok_plugin/obok/legacy_obok.py | 5 ++++- Obok_plugin/obok/obok.py | 5 ++++- .../DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw | 5 ++++- .../DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw | 5 ++++- .../DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw | 5 ++++- Other_Tools/Kobo/obok.py | 5 ++++- 10 files changed, 41 insertions(+), 10 deletions(-) diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index fea25336..3565cf66 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -117,7 +117,10 @@ class ADEPTError(Exception): c_long, c_ulong from ctypes.wintypes import LPVOID, DWORD, BOOL - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg def _load_crypto_libcrypto(): from ctypes.util import find_library diff --git a/DeDRM_plugin/ignoblekey.py b/DeDRM_plugin/ignoblekey.py index 0c3662e5..ea9785a1 100644 --- a/DeDRM_plugin/ignoblekey.py +++ b/DeDRM_plugin/ignoblekey.py @@ -101,7 +101,10 @@ def getNookLogFiles(): logFiles = [] found = False if iswindows: - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg # some 64 bit machines do not have the proper registry key for some reason # or the python interface to the 32 vs 64 bit registry is broken diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 68cea6bf..8321923e 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -195,7 +195,11 @@ def decode(data,map): create_unicode_buffer, create_string_buffer, CFUNCTYPE, addressof, \ string_at, Structure, c_void_p, cast - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg + MAX_PATH = 255 kernel32 = windll.kernel32 advapi32 = windll.advapi32 diff --git a/DeDRM_plugin/simpleprefs.py b/DeDRM_plugin/simpleprefs.py index 65f2b59e..bf8c5d46 100644 --- a/DeDRM_plugin/simpleprefs.py +++ b/DeDRM_plugin/simpleprefs.py @@ -20,7 +20,10 @@ def __init__(self, target, description): self.file2key[filename] = key self.target = target + 'Prefs' if sys.platform.startswith('win'): - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") path = winreg.QueryValueEx(regkey, 'Local AppData')[0] prefdir = path + os.sep + self.target diff --git a/Obok_plugin/obok/legacy_obok.py b/Obok_plugin/obok/legacy_obok.py index caf24f2a..9a9ae5dc 100644 --- a/Obok_plugin/obok/legacy_obok.py +++ b/Obok_plugin/obok/legacy_obok.py @@ -42,7 +42,10 @@ def __oldcookiedeviceid(self): pwsdid = '' try: if sys.platform.startswith('win'): - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg regkey_browser = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Software\\Kobo\\Kobo Desktop Edition\\Browser') cookies = winreg.QueryValueEx(regkey_browser, 'cookies') bytearrays = cookies[0] diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index ae8ff899..f680341f 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -360,7 +360,10 @@ def __init__ (self, serials = [], device_path = None, desktopkobodir = u""): if (self.kobodir == u""): if sys.platform.startswith('win'): - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg if sys.getwindowsversion().major > 5: if 'LOCALAPPDATA' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x diff --git a/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw b/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw index bc335675..cbc30389 100644 --- a/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw @@ -129,7 +129,10 @@ if iswindows: c_long, c_ulong from ctypes.wintypes import LPVOID, DWORD, BOOL - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg def _load_crypto_libcrypto(): from ctypes.util import find_library diff --git a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw index 7365c94c..f6a93ebf 100644 --- a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw @@ -98,7 +98,10 @@ def getNookLogFiles(): logFiles = [] found = False if iswindows: - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg # some 64 bit machines do not have the proper registry key for some reason # or the python interface to the 32 vs 64 bit registry is broken diff --git a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw index 4837627a..99b8d227 100644 --- a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw @@ -177,7 +177,10 @@ if iswindows: create_unicode_buffer, create_string_buffer, CFUNCTYPE, addressof, \ string_at, Structure, c_void_p, cast - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg MAX_PATH = 255 kernel32 = windll.kernel32 advapi32 = windll.advapi32 diff --git a/Other_Tools/Kobo/obok.py b/Other_Tools/Kobo/obok.py index 98608c5c..6f871149 100644 --- a/Other_Tools/Kobo/obok.py +++ b/Other_Tools/Kobo/obok.py @@ -346,7 +346,10 @@ def __init__ (self, serials = [], device_path = None): if (self.kobodir == u""): # step 4. we haven't found a device with serials, so try desktop apps if sys.platform.startswith('win'): - import winreg + try: + import winreg + except ImportError: + import _winreg as winreg if sys.getwindowsversion().major > 5: if 'LOCALAPPDATA' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x From 1b391da815cff190a86da497fc9c0991022c55df Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 17 Nov 2021 16:17:30 +0100 Subject: [PATCH 028/154] Add some more watermark removal code --- DeDRM_plugin/__init__.py | 67 +++------- DeDRM_plugin/config.py | 7 + DeDRM_plugin/epubwatermark.py | 244 ++++++++++++++++++++++++++++++++++ DeDRM_plugin/prefs.py | 1 + 4 files changed, 270 insertions(+), 49 deletions(-) create mode 100644 DeDRM_plugin/epubwatermark.py diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 515c356f..e2f34645 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -90,12 +90,9 @@ RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' import codecs -import sys, os, re +import sys, os import time -import zipfile import traceback -from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED -from contextlib import closing class DeDRMError(Exception): @@ -211,55 +208,31 @@ def postProcessEPUB(self, path_to_ebook): # This is called after the DRM is removed (or if no DRM was present) # It does stuff like de-obfuscating fonts (by calling checkFonts) # or removing watermarks. - path_to_ebook = self.checkFonts(path_to_ebook) - path_to_ebook = self.removeCDPwatermarkFromEPUB(path_to_ebook) - return path_to_ebook - - def removeCDPwatermarkFromEPUB(self, path_to_ebook): - # "META-INF/cdp.info" is a watermark file used by some Tolino vendors. - # We don't want that in our eBooks, so lets remove that file. try: - infile = ZipFile(open(path_to_ebook, 'rb')) - namelist = infile.namelist() - if 'META-INF/cdp.info' not in namelist: - return path_to_ebook + import calibre_plugins.dedrm.prefs as prefs + dedrmprefs = prefs.DeDRM_Prefs() - namelist.remove("mimetype") - namelist.remove("META-INF/cdp.info") + if dedrmprefs["deobfuscate_fonts"] is True: + # Deobfuscate fonts + path_to_ebook = self.checkFonts(path_to_ebook) or path_to_ebook - output = self.temporary_file(".epub").name + if dedrmprefs["remove_watermarks"] is True: + import calibre_plugins.dedrm.epubwatermark as watermark - kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) - with closing(ZipFile(open(output, 'wb'), 'w', **kwds)) as outf: - for path in (["mimetype"] + namelist): + # Remove Tolino's CDP watermark file + path_to_ebook = watermark.removeCDPwatermark(self, path_to_ebook) or path_to_ebook - data = infile.read(path) + # Remove watermarks (currently just Amazon) from the OPF file + path_to_ebook = watermark.removeOPFwatermarks(self, path_to_ebook) or path_to_ebook - zi = ZipInfo(path) - oldzi = infile.getinfo(path) - try: - zi.compress_type = oldzi.compress_type - if path == "mimetype": - zi.compress_type = ZIP_STORED - zi.date_time = oldzi.date_time - zi.comment = oldzi.comment - zi.extra = oldzi.extra - zi.internal_attr = oldzi.internal_attr - zi.external_attr = oldzi.external_attr - zi.create_system = oldzi.create_system - if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): - # If the file name or the comment contains any non-ASCII char, set the UTF8-flag - zi.flag_bits |= 0x800 - except: - pass - - outf.writestr(zi, data) + # Remove watermarks (currently just Adobe's resource ID) from all HTML and XHTML files + path_to_ebook = watermark.removeHTMLwatermarks(self, path_to_ebook) or path_to_ebook - print("{0} v{1}: Successfully removed cdp.info watermark".format(PLUGIN_NAME, PLUGIN_VERSION)) - return output + return path_to_ebook except: + print("Error while checking settings") return path_to_ebook def checkFonts(self, path_to_ebook): @@ -267,10 +240,6 @@ def checkFonts(self, path_to_ebook): # It checks if there's fonts that need to be deobfuscated try: - import calibre_plugins.dedrm.prefs as prefs - dedrmprefs = prefs.DeDRM_Prefs() - - if dedrmprefs["deobfuscate_fonts"] is True: import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt output = self.temporary_file(".epub").name @@ -283,10 +252,10 @@ def checkFonts(self, path_to_ebook): else: print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) raise DeDRMError("Font deobfuscation failed") - else: - return path_to_ebook + except: print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) + traceback.print_exc() return path_to_ebook def ePubDecrypt(self,path_to_ebook): diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index fe2e443d..7429a2ab 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -83,6 +83,7 @@ def __init__(self, plugin_path, alfdir): self.tempdedrmprefs['adobewineprefix'] = self.dedrmprefs['adobewineprefix'] self.tempdedrmprefs['kindlewineprefix'] = self.dedrmprefs['kindlewineprefix'] self.tempdedrmprefs['deobfuscate_fonts'] = self.dedrmprefs['deobfuscate_fonts'] + self.tempdedrmprefs['remove_watermarks'] = self.dedrmprefs['remove_watermarks'] # Start Qt Gui dialog layout layout = QVBoxLayout(self) @@ -146,6 +147,11 @@ def __init__(self, plugin_path, alfdir): self.chkFontObfuscation.setChecked(self.tempdedrmprefs["deobfuscate_fonts"]) button_layout.addWidget(self.chkFontObfuscation) + self.chkRemoveWatermarks = QtGui.QCheckBox(_("Remove watermarks")) + self.chkRemoveWatermarks.setToolTip("Tries to remove watermarks from files") + self.chkRemoveWatermarks.setChecked(self.tempdedrmprefs["remove_watermarks"]) + button_layout.addWidget(self.chkRemoveWatermarks) + self.resize(self.sizeHint()) def kindle_serials(self): @@ -209,6 +215,7 @@ def save_settings(self): self.dedrmprefs.set('kindlewineprefix', self.tempdedrmprefs['kindlewineprefix']) self.dedrmprefs.set('configured', True) self.dedrmprefs.set('deobfuscate_fonts', self.chkFontObfuscation.isChecked()) + self.dedrmprefs.set('remove_watermarks', self.chkRemoveWatermarks.isChecked()) self.dedrmprefs.writeprefs() def load_resource(self, name): diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py new file mode 100644 index 00000000..d84d95f9 --- /dev/null +++ b/DeDRM_plugin/epubwatermark.py @@ -0,0 +1,244 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# epubwatermark.py +# Copyright © 2021 NoDRM + +# Revision history: +# 1.0 - Initial version + +# Released under the terms of the GNU General Public Licence, version 3 +# + +""" +Removes various watermarks from EPUB files +""" + +import traceback +from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from contextlib import closing +from lxml import etree +import re + +# Runs a RegEx over all HTML/XHTML files to remove watermakrs. +def removeHTMLwatermarks(object, path_to_ebook): + try: + inf = ZipFile(open(path_to_ebook, 'rb')) + namelist = inf.namelist() + + modded_names = [] + modded_contents = [] + + for file in namelist: + if not (file.endswith('.html') or file.endswith('.xhtml')): + continue + + try: + file_str = inf.read(file).decode("utf-8") + str_new = file_str + + # Remove Adobe ADEPT watermarks + # Match optional newline at the beginning, then a "meta" tag with name = "Adept.expected.resource" or "Adept.resource" + # and either a "value" or a "content" element with an Adobe UUID + str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', str_new) + str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', str_new) + except: + traceback.print_exc() + continue + + if (file_str == str_new): + continue + + modded_names.append(file) + modded_contents.append(str_new) + + if len(modded_names) == 0: + # No file modified, return original + return path_to_ebook + + if len(modded_names) != len(modded_contents): + # Something went terribly wrong, return original + print("Watermark: Error during ADEPT watermark removal") + return path_to_ebook + + # Re-package with modified files: + namelist.remove("mimetype") + + try: + output = object.temporary_file(".epub").name + kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) + with closing(ZipFile(open(output, 'wb'), 'w', **kwds)) as outf: + for path in (["mimetype"] + namelist): + + data = inf.read(path) + + try: + modded_index = None + modded_index = modded_names.index(path) + except: + pass + + if modded_index is not None: + # Found modified file - replace contents + data = modded_contents[modded_index] + + zi = ZipInfo(path) + oldzi = inf.getinfo(path) + try: + zi.compress_type = oldzi.compress_type + if path == "mimetype": + zi.compress_type = ZIP_STORED + zi.date_time = oldzi.date_time + zi.comment = oldzi.comment + zi.extra = oldzi.extra + zi.internal_attr = oldzi.internal_attr + zi.external_attr = oldzi.external_attr + zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 + except: + pass + + outf.writestr(zi, data) + except: + traceback.print_exc() + return path_to_ebook + + except: + traceback.print_exc() + return path_to_ebook + + print("Watermark: Successfully stripped {0} ADEPT watermark(s) from ebook.".format(len(modded_names))) + return output + + +# Finds the main OPF file, then uses RegEx to remove watermarks +def removeOPFwatermarks(object, path_to_ebook): + contNS = lambda tag: '{%s}%s' % ('urn:oasis:names:tc:opendocument:xmlns:container', tag) + opf_path = None + + try: + inf = ZipFile(open(path_to_ebook, 'rb')) + container = etree.fromstring(inf.read("META-INF/container.xml")) + rootfiles = container.find(contNS("rootfiles")).findall(contNS("rootfile")) + for rootfile in rootfiles: + opf_path = rootfile.get("full-path", None) + if (opf_path is not None): + break + except: + traceback.print_exc() + return path_to_ebook + + # If path is None, we didn't find an OPF, so we probably don't have a font key. + # If path is set, it's the path to the main content OPF file. + + if (opf_path is None): + # No OPF found - no watermark + return path_to_ebook + else: + try: + container_str = inf.read(opf_path).decode("utf-8") + container_str_new = container_str + + # Remove Amazon hex watermarks + # Match optional newline at the beginning, then spaces, then a "meta" tag with name = "Watermark" or "Watermark_(hex)" and a "content" element. + container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) + container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) + except: + traceback.print_exc() + return path_to_ebook + + if (container_str == container_str_new): + # container didn't change - no watermark + return path_to_ebook + + # Re-package without watermark + namelist = inf.namelist() + namelist.remove("mimetype") + + try: + output = object.temporary_file(".epub").name + kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) + with closing(ZipFile(open(output, 'wb'), 'w', **kwds)) as outf: + for path in (["mimetype"] + namelist): + + data = inf.read(path) + if path == opf_path: + # Found OPF, replacing ... + data = container_str_new + + zi = ZipInfo(path) + oldzi = inf.getinfo(path) + try: + zi.compress_type = oldzi.compress_type + if path == "mimetype": + zi.compress_type = ZIP_STORED + zi.date_time = oldzi.date_time + zi.comment = oldzi.comment + zi.extra = oldzi.extra + zi.internal_attr = oldzi.internal_attr + zi.external_attr = oldzi.external_attr + zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 + except: + pass + + outf.writestr(zi, data) + except: + traceback.print_exc() + return path_to_ebook + + print("Watermark: Successfully stripped Amazon watermark from OPF file.") + return output + + + +def removeCDPwatermark(object, path_to_ebook): + # "META-INF/cdp.info" is a watermark file used by some Tolino vendors. + # We don't want that in our eBooks, so lets remove that file. + try: + infile = ZipFile(open(path_to_ebook, 'rb')) + namelist = infile.namelist() + if 'META-INF/cdp.info' not in namelist: + return path_to_ebook + + namelist.remove("mimetype") + namelist.remove("META-INF/cdp.info") + + output = object.temporary_file(".epub").name + + kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) + with closing(ZipFile(open(output, 'wb'), 'w', **kwds)) as outf: + for path in (["mimetype"] + namelist): + + data = infile.read(path) + + zi = ZipInfo(path) + oldzi = infile.getinfo(path) + try: + zi.compress_type = oldzi.compress_type + if path == "mimetype": + zi.compress_type = ZIP_STORED + zi.date_time = oldzi.date_time + zi.comment = oldzi.comment + zi.extra = oldzi.extra + zi.internal_attr = oldzi.internal_attr + zi.external_attr = oldzi.external_attr + zi.create_system = oldzi.create_system + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): + # If the file name or the comment contains any non-ASCII char, set the UTF8-flag + zi.flag_bits |= 0x800 + except: + pass + + outf.writestr(zi, data) + + print("Watermark: Successfully removed cdp.info watermark") + return output + + except: + traceback.print_exc() + return path_to_ebook \ No newline at end of file diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index e1d8cc65..ebfb6b2c 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -20,6 +20,7 @@ def __init__(self): self.dedrmprefs.defaults['configured'] = False self.dedrmprefs.defaults['deobfuscate_fonts'] = True + self.dedrmprefs.defaults['remove_watermarks'] = False self.dedrmprefs.defaults['bandnkeys'] = {} self.dedrmprefs.defaults['adeptkeys'] = {} self.dedrmprefs.defaults['ereaderkeys'] = {} From 05e0d0bedbe0bedaba3b4d1bb693952b6fbc016e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 17 Nov 2021 21:38:08 +0100 Subject: [PATCH 029/154] Make CI auto-package the plugin --- .github/workflows/main.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 00000000..707a5dea --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,19 @@ +name: Package plugin +on: + push: + branches: [ master ] + +jobs: + package: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Package + run: python3 make_release.py 10.0.0 + - name: Upload + uses: actions/upload-artifact@v2 + with: + name: plugin + path: | + DeDRM_tools_*.zip From a44b50d1d876efe18816b21666b55d087f01cdde Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 17 Nov 2021 21:53:24 +0100 Subject: [PATCH 030/154] LCP support --- .github/ISSUE_TEMPLATE/QUESTION.yml | 8 +-- CHANGELOG.md | 23 ++++++++ DeDRM_plugin/DeDRM_Help.htm | 14 +++-- DeDRM_plugin/DeDRM_Mobipocket PID_Help.htm | 2 +- .../DeDRM_Readium LCP passphrase_Help.htm | 41 +++++++++++++ DeDRM_plugin/__init__.py | 58 ++++++++++++++----- DeDRM_plugin/config.py | 51 ++++++++++++++++ DeDRM_plugin/epubfontdecrypt.py | 11 ++-- DeDRM_plugin/epubtest.py | 13 ++++- DeDRM_plugin/epubwatermark.py | 2 +- DeDRM_plugin/prefs.py | 3 + DeDRM_plugin_ReadMe.txt | 6 +- FAQs.md | 29 +++++----- Obok_plugin/obok_dedrm_Help.htm | 4 +- README.md | 7 ++- ReadMe_Overview.txt | 1 + 16 files changed, 218 insertions(+), 55 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm diff --git a/.github/ISSUE_TEMPLATE/QUESTION.yml b/.github/ISSUE_TEMPLATE/QUESTION.yml index c6c63021..d738b2c3 100644 --- a/.github/ISSUE_TEMPLATE/QUESTION.yml +++ b/.github/ISSUE_TEMPLATE/QUESTION.yml @@ -10,16 +10,16 @@ body: id: calibre-version attributes: label: Which version of Calibre are you running? - description: "Example: 5.30" - placeholder: "5.30" + description: "Example: 5.32" + placeholder: "5.32" validations: required: true - type: input id: plugin-version attributes: label: Which version of the DeDRM plugin are you running? - description: "Example: v7.2.1" - placeholder: "v7.2.1" + description: "Example: v10.0.0" + placeholder: "v10.0.0" validations: required: true - type: input diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..bbb1f72a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog + +List of changes since the fork of Apprentice Harper's repository: + +- CI testing / linting removed as that always failed anyways. The CI now "just" packages the plugin. +- Support for the Readium LCP DRM (also known as "CARE DRM" or "TEA DRM"). This supports EPUB and PDF files. It does not yet support Readium LCPDF/LPF/LCPA/LCPAU/LCPDI files, as I don't have access to any of these. If you have an LCP-protected file in one of these formats that this plugin does not work with, please open [an issue](https://github.com/noDRM/DeDRM_tools/issues) and attach the file to the report. +- Add new Github issue report form which forces the user to include stuff like their Calibre version to hopefully increase the quality of bug reports. +- Issues with PDF files in Calibre 5 should be fixed (merged [apprenticeharper/DeDRM_tools#1689](https://github.com/apprenticeharper/DeDRM_tools/pull/1689) ). +- Fixed tons of issues with the B&N PDF DRM removal script ignoblepdf.py. It looks like that has never been tested since the move to Python3. I have integrated the B&N-specific code into ineptpdf.py, the original ignoblepdf.py is now unused. Fairly untested as I don't have any PDFs with B&N DRM. +- Issues with Obok key retrieval fixed (merged [apprenticeharper/DeDRM_tools#1691](https://github.com/apprenticeharper/DeDRM_tools/pull/1691) ). +- Issues with obfuscated Adobe fonts fixed (fixes [apprenticeharper/DeDRM_tools#1828](https://github.com/apprenticeharper/DeDRM_tools/issues/1828) ). +- Deobfuscate font files in EPUBs by default (can be disabled in the plugin settings). +- The standalone adobekey.py script now includes the account UUID in the key file name. +- When extracting the default key from an ADE install, include the account UUID in the key name. +- Adobe key management window size increased to account for longer key names due to the UUID. +- Verify that the decrypted book key has the correct format. This makes it way less likely for issue [apprenticeharper/DeDRM_tools#1862](https://github.com/apprenticeharper/DeDRM_tools/issues/1862) to cause trouble. +- If the Adobe owner UUID of a book being imported happens to be included in a particular key's name, try this key first before trying all the others. This completely fixes [apprenticeharper/DeDRM_tools#1862](https://github.com/apprenticeharper/DeDRM_tools/issues/1862), but only if the key name contains the correct UUID (not always the case, especially for keys imported with older versions of the plugin). It also makes DRM removal faster as the plugin no longer has to attempt all possible keys. +- Remove some additional DRM remnants in Amazon MOBI files (merged [apprenticeharper/DeDRM_tools#23](https://github.com/apprenticeharper/DeDRM_tools/pull/23) ). +- Just in case it's necessary, added a setting to the B&N key generation script to optionally allow the user to select the old key generation algorithm. Who knows, they might want to remove DRM from old books with the old key scheme. +- Add a more verbose error message when trying to remove DRM from a book with the new, not-yet-cracked version of the Adobe ADEPT DRM. +- Added back support for Python2 (Calibre 2.0+). Only tested with ADEPT (PDF & EPUB) and Readium LCP so far, please open an issue if there's errors with other book types. +- Begin work on removing some kinds of watermarks from files after DRM removal. This isn't tested a lot, and is disabled by default. You can enable it in the plugin settings. +- If you're using the [ACSM Input Plugin / DeACSM](https://www.mobileread.com/forums/showthread.php?t=341975), the encryption key will automatically be extracted from that plugin if necessary. \ No newline at end of file diff --git a/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_plugin/DeDRM_Help.htm index 26040549..6ec385ca 100644 --- a/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_plugin/DeDRM_Help.htm @@ -17,15 +17,19 @@ -

DeDRM Plugin (v6.7.0)

+

DeDRM Plugin (v10.0.0)

This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.

+

It is a forked version created by NoDRM, based on the original plugin by Apprentice Alf and Apprentice Harper.

+

Installation

You have obviously managed to install the plugin, as otherwise you wouldn’t be reading this help file. However, you should also delete any older DRM removal plugins, as this DeDRM plugin replaces the five older plugins: Kindle and Mobipocket DeDRM (K4MobiDeDRM), Ignoble Epub DeDRM (ignobleepub), Inept Epub DeDRM (ineptepub), Inept PDF DeDRM (ineptepub) and eReader PDB 2 PML (eReaderPDB2PML).

Configuration

-

On Windows and Mac, the keys for ebooks downloaded for Kindle for Mac/PC and Adobe Digital Editions are automatically generated. If all your DRMed ebooks can be opened and read in Kindle for Mac/PC and/or Adobe Digital Editions on the same computer on which you are running calibre, you do not need to do any configuration of this plugin. On Linux, keys for Kindle for PC and Adobe Digital Editions need to be generated separately (see the Linux section below)

+

On Windows and Mac, the keys for ebooks downloaded for Kindle for Mac/PC and Adobe Digital Editions are automatically generated. If all your DRMed ebooks can be opened and read in Kindle for Mac/PC and/or Adobe Digital Editions on the same computer on which you are running calibre, you do not need to do any configuration of this plugin. On Linux, keys for Kindle for PC and Adobe Digital Editions need to be generated separately (see the Linux section below).

+ +

If you are using the DeACSM / ACSM Input Plugin for Calibre, the keys will also automatically be dumped for you.

If you have other DRMed ebooks, you will need to enter extra configuration information. The buttons in this dialog will open individual configuration dialogs that will allow you to enter the needed information, depending on the type and source of your DRMed eBooks. Additional help on the information required is available in each of the the dialogs.

@@ -42,11 +46,12 @@

Troubleshooting:

Credits:

    +
  • NoDRM for a bunch of updates and the Readium LCP support
  • The Dark Reverser for the Mobipocket and eReader scripts
  • i♥cabbages for the Adobe Digital Editions scripts
  • Skindle aka Bart Simpson for the Amazon Kindle for PC script
  • CMBDTC for Amazon Topaz DRM removal script
  • -
  • some_updates, clarknova and Bart Simpson for Amazon Topaz conversion scripts
  • +
  • some_updates, clarknova and Bart Simpson for Amazon Topaz conversion scripts
  • DiapDealer for the first calibre plugin versions of the tools
  • some_updates, DiapDealer, Apprentice Alf and mdlnx for Amazon Kindle/Mobipocket tools
  • some_updates for the DeDRM all-in-one Python tool
  • @@ -55,7 +60,8 @@

    Credits:

  • And probably many more.
-

For additional help read the FAQs at Apprentice Harpers’s GitHub repository. You can ask questions in the comments section of the first post at Apprentice Alf's blog or raise an issue.

+

For additional help read the FAQs at NoDRM's GitHub repository (or the corresponding FAQs at Apprentice Harpers’s GitHub repository). You can open issue reportsrelated to this fork at NoDRM's GitHub repository.

+

Linux Systems Only

Generating decryption keys for Adobe Digital Editions and Kindle for PC

diff --git a/DeDRM_plugin/DeDRM_Mobipocket PID_Help.htm b/DeDRM_plugin/DeDRM_Mobipocket PID_Help.htm index 00aeeca4..2ad808f5 100644 --- a/DeDRM_plugin/DeDRM_Mobipocket PID_Help.htm +++ b/DeDRM_plugin/DeDRM_Mobipocket PID_Help.htm @@ -35,7 +35,7 @@

Deleting Mobipocket PIDs:

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a red "X". Clicking this button will delete the highlighted Mobipocket PID from the list. You will be prompted once to be sure that’s what you truly mean to do. Once gone, it’s permanently gone.

-

Once done creating/deleting PIDs, click Close to exit the customization dialogue. Your changes wil only be saved permanently when you click OK in the main configuration dialog.

+

Once done creating/deleting PIDs, click Close to exit the customization dialogue. Your changes will only be saved permanently when you click OK in the main configuration dialog.

diff --git a/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm b/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm new file mode 100644 index 00000000..a5f5e91c --- /dev/null +++ b/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm @@ -0,0 +1,41 @@ + + + + + + +Managing Readium LCP passphrases + + + + + +

Managing Readium LCP passphrases

+ +

Readium LCP is a relatively new eBook DRM. It's also known under the names "CARE DRM" or "TEA DRM". It does not rely on any accounts or key data that's difficult to acquire. All you need to open (or decrypt) LCP eBooks is the account passphrase given to you by the eBook provider - the very same passphrase you'd have to enter into your eBook reader device (once) to read LCP-encrypted books.

+ + +

Entering an LCP passphrase:

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a green plus sign (+). Clicking this button will open a new dialog for entering a new passphrase.

+ +

Just enter your passphrase as provided with the book, then click the OK button to save the passphrase.

+ +

Usually, passphrases are identical for all books bought with the same account. So if you buy multiple LCP-protected eBooks, they'll usually all have the same passphrase if they've all been bought at the same store with the same account.

+ +

Deleting an LCP passphrase:

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a red "X". Clicking this button will delete the highlighted passphrase from the list. You will be prompted once to be sure that’s what you truly mean to do. Once gone, it’s permanently gone.

+ +

Once done entering/deleting passphrases, click Close to exit the customization dialogue. Your changes will only be saved permanently when you click OK in the main configuration dialog.

+ + + + diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index e2f34645..778b84b5 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -6,7 +6,7 @@ # Copyright © 2021 NoDRM __license__ = 'GPL v3' -__version__ = '7.2.1' +__version__ = '10.0.0' __docformat__ = 'restructuredtext en' @@ -78,6 +78,7 @@ # 7.1.0 - Full release for calibre 5.x # 7.2.0 - Update for latest KFX changes, and Python 3 Obok fixes. # 7.2.1 - Whitespace! +# 10.0.0 - First forked version by NoDRM. See CHANGELOG.md for details. """ Decrypt DRMed ebooks. @@ -130,7 +131,7 @@ def __getattr__(self, attr): class DeDRM(FileTypePlugin): name = PLUGIN_NAME - description = "Removes DRM from Amazon Kindle, Adobe Adept (including Kobo), Barnes & Noble, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." + description = "Removes DRM from Amazon Kindle, Adobe Adept (including Kobo), Readium LCP, Barnes & Noble, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." supported_platforms = ['linux', 'osx', 'windows'] author = "Apprentice Alf, Apprentice Harper, NoDRM, The Dark Reverser and i♥cabbages" version = PLUGIN_VERSION_TUPLE @@ -225,10 +226,10 @@ def postProcessEPUB(self, path_to_ebook): # Remove watermarks (currently just Amazon) from the OPF file path_to_ebook = watermark.removeOPFwatermarks(self, path_to_ebook) or path_to_ebook - + # Remove watermarks (currently just Adobe's resource ID) from all HTML and XHTML files path_to_ebook = watermark.removeHTMLwatermarks(self, path_to_ebook) or path_to_ebook - + return path_to_ebook except: @@ -240,18 +241,18 @@ def checkFonts(self, path_to_ebook): # It checks if there's fonts that need to be deobfuscated try: - import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt + import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt - output = self.temporary_file(".epub").name - ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) + output = self.temporary_file(".epub").name + ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) - if (ret == 0): - return output - elif (ret == 1): - return path_to_ebook - else: - print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) - raise DeDRMError("Font deobfuscation failed") + if (ret == 0): + return output + elif (ret == 1): + return path_to_ebook + else: + print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) + raise DeDRMError("Font deobfuscation failed") except: print("{0} v{1}: Error during font deobfuscation".format(PLUGIN_NAME, PLUGIN_VERSION)) @@ -276,6 +277,22 @@ def ePubDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs dedrmprefs = prefs.DeDRM_Prefs() + + # import the LCP handler + import calibre_plugins.dedrm.lcpdedrm as lcpdedrm + + if (lcpdedrm.isLCPbook(path_to_ebook)): + try: + retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) + except: + print("Looks like that didn't work:") + raise + + return self.postProcessEPUB(retval) + + + # Not an LCP book, do the normal EPUB (Adobe) handling. + # import the Barnes & Noble ePub handler import calibre_plugins.dedrm.ignobleepub as ignobleepub @@ -545,8 +562,21 @@ def ePubDecrypt(self,path_to_ebook): def PDFDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs import calibre_plugins.dedrm.ineptpdf as ineptpdf + import calibre_plugins.dedrm.lcpdedrm as lcpdedrm dedrmprefs = prefs.DeDRM_Prefs() + if (lcpdedrm.isLCPbook(path_to_ebook)): + try: + retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) + except: + print("Looks like that didn't work:") + raise + + return retval + + + # Not an LCP book, do the normal Adobe handling. + book_uuid = None try: # Try to figure out which Adobe account this book is licensed for. diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 7429a2ab..d566f885 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -84,6 +84,7 @@ def __init__(self, plugin_path, alfdir): self.tempdedrmprefs['kindlewineprefix'] = self.dedrmprefs['kindlewineprefix'] self.tempdedrmprefs['deobfuscate_fonts'] = self.dedrmprefs['deobfuscate_fonts'] self.tempdedrmprefs['remove_watermarks'] = self.dedrmprefs['remove_watermarks'] + self.tempdedrmprefs['lcp_passphrases'] = list(self.dedrmprefs['lcp_passphrases']) # Start Qt Gui dialog layout layout = QVBoxLayout(self) @@ -134,6 +135,10 @@ def __init__(self, plugin_path, alfdir): self.ereader_button.setToolTip(_("Click to manage keys for eReader ebooks")) self.ereader_button.setText("eReader ebooks") self.ereader_button.clicked.connect(self.ereader_keys) + self.lcp_button = QtGui.QPushButton(self) + self.lcp_button.setToolTip(_("Click to manage passphrases for Readium LCP ebooks")) + self.lcp_button.setText("Readium LCP ebooks") + self.lcp_button.clicked.connect(self.readium_lcp_keys) button_layout.addWidget(self.kindle_serial_button) button_layout.addWidget(self.kindle_android_button) button_layout.addWidget(self.bandn_button) @@ -141,6 +146,7 @@ def __init__(self, plugin_path, alfdir): button_layout.addWidget(self.ereader_button) button_layout.addWidget(self.adept_button) button_layout.addWidget(self.kindle_key_button) + button_layout.addWidget(self.lcp_button) self.chkFontObfuscation = QtGui.QCheckBox(_("Deobfuscate EPUB fonts")) self.chkFontObfuscation.setToolTip("Deobfuscates fonts in EPUB files after DRM removal") @@ -192,6 +198,10 @@ def ereader_keys(self): d = ManageKeysDialog(self,"eReader Key",self.tempdedrmprefs['ereaderkeys'], AddEReaderDialog, 'b63') d.exec_() + def readium_lcp_keys(self): + d = ManageKeysDialog(self,"Readium LCP passphrase",self.tempdedrmprefs['lcp_passphrases'], AddLCPKeyDialog) + d.exec_() + def help_link_activated(self, url): def get_help_file_resource(): # Copy the HTML helpfile to the plugin directory each time the @@ -216,6 +226,7 @@ def save_settings(self): self.dedrmprefs.set('configured', True) self.dedrmprefs.set('deobfuscate_fonts', self.chkFontObfuscation.isChecked()) self.dedrmprefs.set('remove_watermarks', self.chkRemoveWatermarks.isChecked()) + self.dedrmprefs.set('lcp_passphrases', self.tempdedrmprefs['lcp_passphrases']) self.dedrmprefs.writeprefs() def load_resource(self, name): @@ -1106,3 +1117,43 @@ def accept(self): QDialog.accept(self) +class AddLCPKeyDialog(QDialog): + def __init__(self, parent=None,): + QDialog.__init__(self, parent) + self.parent = parent + self.setWindowTitle("{0} {1}: Add new Readium LCP passphrase".format(PLUGIN_NAME, PLUGIN_VERSION)) + layout = QVBoxLayout(self) + self.setLayout(layout) + + data_group_box = QGroupBox("", self) + layout.addWidget(data_group_box) + data_group_box_layout = QVBoxLayout() + data_group_box.setLayout(data_group_box_layout) + + key_group = QHBoxLayout() + data_group_box_layout.addLayout(key_group) + key_group.addWidget(QLabel("Readium LCP passphrase:", self)) + self.key_ledit = QLineEdit("", self) + self.key_ledit.setToolTip("Enter your Readium LCP passphrase") + key_group.addWidget(self.key_ledit) + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept) + self.button_box.rejected.connect(self.reject) + layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + @property + def key_name(self): + return None + + @property + def key_value(self): + return str(self.key_ledit.text()) + + def accept(self): + if len(self.key_value) == 0 or self.key_value.isspace(): + errmsg = "Please enter your LCP passphrase or click Cancel in the dialog." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + QDialog.accept(self) diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py index de40b526..ea08175b 100644 --- a/DeDRM_plugin/epubfontdecrypt.py +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -148,7 +148,6 @@ def decryptFontsBook(inpath, outpath): with closing(ZipFile(open(inpath, 'rb'))) as inf: namelist = inf.namelist() if 'META-INF/encryption.xml' not in namelist: - print("{0:s} has no obfuscated fonts".format(os.path.basename(inpath))) return 1 # Font key handling: @@ -173,7 +172,7 @@ def decryptFontsBook(inpath, outpath): # If path is set, it's the path to the main content OPF file. if (path is None): - print("No OPF for font obfuscation found") + print("FontDecrypt: No OPF for font obfuscation found") return 1 else: packageNS = lambda tag: '{%s}%s' % ('http://www.idpf.org/2007/opf', tag) @@ -185,7 +184,7 @@ def decryptFontsBook(inpath, outpath): container = [] ## IETF font key algorithm: - print("Checking {0} for IETF font obfuscation keys ... ".format(path), end='') + print("FontDecrypt: Checking {0} for IETF font obfuscation keys ... ".format(path), end='') secret_key_name = None try: secret_key_name = container.get("unique-identifier") @@ -216,7 +215,7 @@ def decryptFontsBook(inpath, outpath): print("not found") ## Adobe font key algorithm - print("Checking {0} for Adobe font obfuscation keys ... ".format(path), end='') + print("FontDecrypt: Checking {0} for Adobe font obfuscation keys ... ".format(path), end='') try: metadata = container.find(packageNS("metadata")) @@ -284,7 +283,7 @@ def decryptFontsBook(inpath, outpath): # Check if there's still other entries not related to fonts if (decryptor.check_if_remaining()): data = decryptor.get_xml() - print("There's remaining entries in encryption.xml, adding file ...") + print("FontDecrypt: There's remaining entries in encryption.xml, adding file ...") else: # No remaining entries, no need for that file. continue @@ -313,7 +312,7 @@ def decryptFontsBook(inpath, outpath): else: outf.writestr(zi, decryptor.decrypt(path, data)) except: - print("Could not decrypt fonts in {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) + print("FontDecrypt: Could not decrypt fonts in {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) traceback.print_exc() return 2 return 0 diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index 561b053f..c2f47af5 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -12,6 +12,7 @@ # 1.00 - Cut to epubtest.py, testing ePub files only by Apprentice Alf # 1.01 - Added routine for use by Windows DeDRM # 2.00 - Python 3, September 2020 +# 2.01 - Add new Adobe DRM, add Readium LCP # # Written in 2011 by Paul Durrant # Released with unlicense. See http://unlicense.org/ @@ -185,7 +186,13 @@ def encryption(infile): foundencryption = False inzip = zipfile.ZipFile(infile,'r') namelist = set(inzip.namelist()) - if 'META-INF/rights.xml' not in namelist or 'META-INF/encryption.xml' not in namelist: + if ( + 'META-INF/encryption.xml' in namelist and + 'META-INF/license.lcpl' in namelist and + b"EncryptedContentKey" in inzip.read("META-INF/encryption.xml")): + encryption = "Readium LCP" + + elif 'META-INF/rights.xml' not in namelist or 'META-INF/encryption.xml' not in namelist: encryption = "Unencrypted" else: rights = etree.fromstring(inzip.read('META-INF/rights.xml')) @@ -193,7 +200,9 @@ def encryption(infile): expr = './/%s' % (adept('encryptedKey'),) bookkey = ''.join(rights.findtext(expr)) if len(bookkey) == 172: - encryption = "Adobe" + encryption = "Adobe (old)" + if len(bookkey) == 192: + encryption = "Adobe (new)" elif len(bookkey) == 64: encryption = "B&N" else: diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py index d84d95f9..3139e7a3 100644 --- a/DeDRM_plugin/epubwatermark.py +++ b/DeDRM_plugin/epubwatermark.py @@ -30,7 +30,7 @@ def removeHTMLwatermarks(object, path_to_ebook): modded_contents = [] for file in namelist: - if not (file.endswith('.html') or file.endswith('.xhtml')): + if not (file.endswith('.html') or file.endswith('.xhtml') or file.endswith('.xml')): continue try: diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index ebfb6b2c..16a85229 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -28,6 +28,7 @@ def __init__(self): self.dedrmprefs.defaults['androidkeys'] = {} self.dedrmprefs.defaults['pids'] = [] self.dedrmprefs.defaults['serials'] = [] + self.dedrmprefs.defaults['lcp_passphrases'] = [] self.dedrmprefs.defaults['adobewineprefix'] = "" self.dedrmprefs.defaults['kindlewineprefix'] = "" @@ -49,6 +50,8 @@ def __init__(self): self.dedrmprefs['pids'] = [] if self.dedrmprefs['serials'] == []: self.dedrmprefs['serials'] = [] + if self.dedrmprefs['lcp_passphrases'] == []: + self.dedrmprefs['lcp_passphrases'] = [] def __getitem__(self,kind = None): if kind is not None: diff --git a/DeDRM_plugin_ReadMe.txt b/DeDRM_plugin_ReadMe.txt index 96a65165..36e3bd71 100644 --- a/DeDRM_plugin_ReadMe.txt +++ b/DeDRM_plugin_ReadMe.txt @@ -7,7 +7,7 @@ This plugin will remove the DRM from: - Adobe Digital Editions (v2.0.1***) ePubs (including Kobo and Google ePubs downloaded to ADE) - Adobe Digital Editions (v2.0.1) PDFs -For limitations and work-arounds, see the FAQ at https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md +For limitations and work-arounds, see the FAQ at https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md (or the FAQ in Apprentice Harper's original repository at https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md) Installation @@ -31,4 +31,6 @@ If you find that the DeDRM plugin is not working for you (imported ebooks still - Once calibre has re-started, import the problem ebook. - Now close calibre. -A log will appear that you can copy and paste into a comment at Apprentice Alf's blog, http://apprenticealf.wordpress.com/ or an issue at Apprentice Harper's repository, https://github.com/apprenticeharper/DeDRM_tools/issues . You should also give details of your computer, and how you obtained the ebook file. +A log will appear that you can copy and paste into a GitHub issue report at https://github.com/noDRM/DeDRM_tools/issues. Please also include information about the eBook file. + +If you're using Apprentice Harper's original version, you can also comment at Apprentice Alf's blog, http://apprenticealf.wordpress.com/ or open an issue at Apprentice Harper's repository, https://github.com/apprenticeharper/DeDRM_tools/issues. \ No newline at end of file diff --git a/FAQs.md b/FAQs.md index 609d0779..f868e6b9 100644 --- a/FAQs.md +++ b/FAQs.md @@ -59,7 +59,7 @@ It's quite possible that Amazon will update their KFX DeDRM to prevent DRM remov Thanks to jhowell for his investigations into KFX format and the KFX Input plugin. Some of these instructions are from [his thread on the subject](https://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead. ## Where can I get the latest version of these free DRM removal tools? -Right here at github. Just go to the [releases page](https://github.com/apprenticeharper/DeDRM_tools/releases) and download the latest zip archive of the tools, named `DeDRM\_tools\_X.X.X.zip`, where X.X.X is the version number. You do not need to download the source code archive. +Right here at github. Just go to the [releases page](https://github.com/noDRM/DeDRM_tools/releases) and download the latest zip archive of the tools, named `DeDRM\_tools\_X.X.X.zip`, where X.X.X is the version number. You do not need to download the source code archive. This will get you the forked version by noDRM. If you want to download the original version by Apprentice Harper, go to [this page](https://github.com/noDRM/DeDRM_tools/releases) instead. ## I've downloaded the tools archive. Now what? First, unzip the archive. You should now have a DeDRM folder containing several other folders and a `ReadMe_Overview.txt` file. Please read the `ReadMe_Overview.txt` file! That will explain what the folders are, and you'll be able to work out which of the tools you need. @@ -69,7 +69,7 @@ Install calibre. Install the DeDRM\_plugin in calibre. Install the Obok\_plugin # Installing the Tools ## The calibre plugin -### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in u’[path]DeDRM\_tools\_6.5.3.zip’ is invalid. It does not contain a top-level \_\_init\_\_.py file" +### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in u’[path]DeDRM\_tools\_6.8.0.zip’ is invalid. It does not contain a top-level \_\_init\_\_.py file" You are trying to add the tools archive (e.g. `DeDRM_tools_6.8.0.zip`) instead of the plugin. The tools archive is not the plugin. It is a collection of DRM removal tools which includes the plugin. You must unzip the archive, and install the calibre plugin `DeDRM_plugin.zip` from a folder called `DeDRM_calibre_plugin` in the unzipped archive. ### I’ve unzipped the tools archive, but I can’t find the calibre plugin when I try to add them to calibre. I use Windows. @@ -95,7 +95,7 @@ Your ebooks are stored on your computer or on your ebook reader. You need to fin ### Macintosh Navigating from your home folder, -Kindle for Mac ebooks are in either `Library/Application Support/Kindle/My Kindle Content` or `Documents/My Kindle Content or Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/My Kindle Content`, depending on your version of Kindle for Mac. +Kindle for Mac ebooks are in either `Library/Application Support/Kindle/My Kindle Content` or `Documents/My Kindle Content` or `Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/My Kindle Content`, depending on your version of Kindle for Mac. Adobe Digital Editions ebooks are in `Documents/Digital Editions` @@ -120,21 +120,20 @@ If this book is from Kindle for Mac or Kindle for PC, you must have the Kindle S If the book is from Kindle for PC or Kindle for Mac and you think you are doing everything right, and you are getting this message, it is possible that the files containing the encryption key aren’t quite in the format the tools expect. To try to fix this: -1. Deregister Kindle for PC(Mac) from your Amazon account. -1. Uninstall Kindle for PC(Mac) -1. Delete the Kindle for PC(Mac) preferences +1. Deregister Kindle for PC/Mac from your Amazon account. +1. Uninstall Kindle for PC/Mac +1. Delete the Kindle for PC/Mac preferences * PC: Delete the directory `[home folder]\AppData\Local\Amazon` (it might be hidden) and `[home folder]\My Documents\My Kindle Content` * Mac: Delete the directory `[home folder]/Library/Application Support/Kindle/` and/or `[home folder]/Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/` (one or both may be present and should be deleted) -1. Reinstall Kindle for PC(Mac) version 1.17 or earlier (see above for download links). -1. Re-register Kindle for PC(Mac) with your Amazon account +1. Reinstall Kindle for PC/Mac version 1.17 or earlier (see above for download links). +1. Re-register Kindle for PC/Mac with your Amazon account 1. Download the ebook again. Do not use the files you have downloaded previously. ## Some of my books had their DRM removed, but some still say that they have DRM and will not convert. There are several possible reasons why only some books get their DRM removed. * You still don’t have the DRM removal tools working correctly, but some of your books didn’t have DRM in the first place. -* Kindle only: It is a Topaz format book and contains some coding that the tools do not understand. You will need to get a log of the DeDRM attempt, and then create a [new issue at Apprentice Harper's github repository](https://github.com/apprenticeharper/DeDRM_tools/issues/), attaching the book and the log, so that the tools can be updated. -If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books, and post that in a comment at Apprentice Alf's blog or in a new issue at Apprentice Harper's github repository. +If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books. If you're using NoDRM's fork, open [a new issue](https://github.com/noDRM/DeDRM_tools/issues) in the GitHub repo. If you're using Apprentice Harpers version, post that logfile as a comment at Apprentice Alf's blog or in a new issue at [Apprentice Harper's github repository](https://github.com/apprenticeharper/DeDRM_tools/issues). ## My Kindle book has imported and the DRM has been removed, but all the pictures are gone. Most likely, this is a book downloaded from Amazon directly to an eInk Kindle (e.g. Paperwhite). Unfortunately, the pictures are probably in a `.azw6` file that the tools don't understand. You must download the book manually from Amazon's web site "For transfer via USB" to your Kindle. When you download the eBook in this manner, Amazon will package the pictures in the with text in a single file that the tools will be able to import successfully. @@ -148,9 +147,6 @@ If you use the Kobo desktop application for Mac or PC, install the Obok plugin. ## I registered Adobe Digital Editions 3.0 or later with an Adobe ID before downloading, but my epub or PDF still has DRM. Adobe introduced a new DRM scheme with ADE 3.0 and later. Install ADE 2.0.1 and register with the same Adobe ID. If you can't open your book in ADE 2.01, then you have a book with the new DRM scheme. These tools can't help. You can avoid the new DRM scheme by always downloading your ebooks with ADE 2.0.1. Some retailers will require ADE 3.0 or later, in which case you won't be able to download with ADE 2.0.1. -## The DRM wasn't removed and the log says "Failed to decrypt with error: Cannot decode library or rented ebooks." What now? -You're trying to remove the DRM from an ebook that's only on loan to you. No help will be given to remove DRM from such ebooks. If you think that you have received this message for a book you own, please create an issue at github, or comment at the blog. - ## I cannot solve my problem with the DeDRM plugin, and now I need to ‘post a log’. How do I do that? Remove the DRMed book from calibre. Click the Preferences drop-down menu and choose 'Restart in debug mode'. Once calibre has re-started, import the problem ebook. Now close calibre. A log will appear that you can copy and paste into a comment at Apprentice Alf's blog, or into a new issue at Apprentice Harper's github repository. @@ -160,7 +156,7 @@ See the [Calibre command line interface (CLI) instructions](CALIBRE_CLI_INSTRUCT # General Questions ## Once the DRM has been removed, is there any trace of my personal identity left in the ebook? -The tools only remove the DRM. No attempt is made to remove any personally identifying information. +That question cannot be answered for sure. While it is easy to check if a book has DRM or not, it is very difficult to verify if all (traces of) personal information have been removed from a book. The tools attempt to remove watermarks when they are detected, but that will not be the case for all watermarks. ## Why do some of my Kindle ebooks import as HTMLZ format in calibre? Most Amazon Kindle ebooks are Mobipocket format ebooks, or the new KF8 format. However, some are in a format known as Topaz. The Topaz format is only used by Amazon. A Topaz ebook is a collections of glyphs and their positions on each page tagged with some additional information from that page including OCRed text (Optical Character Recognition generated Text) to allow searching, and some additional layout information. Each page of a Topaz ebook is effectively a description of an image of that page. To convert a Topaz ebook to another format is not easy as there is not a one-to-one mapping between glyphs and characters/fonts. To account for this, two different formats are generated by the DRM removal software. The first is an html description built from the OCRtext and images stored in the Topaz file (HTMLZ). This format is easily reflowed but may suffer from typical OCRtext errors including typos, garbled text, missing italics, missing bolds, etc. The second format uses the glyph and position information to create an accurate scalable vector graphics (SVG) image of each page of the book that can be viewed in web browsers that support svg images (Safari, Firefox 4 or later, etc). Additional conversion software can be used to convert these SVG images to an image only PDF file. The DeDRM calibre plugin only imports the HTMLZ versions of the Topaz ebook. The html version can be manually cleaned up and spell checked and then converted using Sigil/calibre to epubs, mobi ebooks, and etc. @@ -171,7 +167,7 @@ All the DRM removal tools hosted here are almost entirely scripts of one kind or There are some optional shared libraries (`*.dll`, `*.dylib`, and `*.so`) included for performance. The source for any compiled pieces are provided within `alfcrypto_src.zip`. If this is a concern either delete the binary files or manually rebuild them. ## What ebooks do these tools work on? -The tools linked from this blog remove DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Amazon, Kobo and eReader DRM schemes. +The Calibre plugin removes DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Readium LCP, Amazon, Kobo and eReader DRM schemes. Note these tools do NOT ‘crack’ the DRM. They simply allow the book’s owner to use the encryption key information already stored someplace on their computer or device to decrypt the ebook in the same manner the official ebook reading software uses. @@ -190,11 +186,12 @@ Apple regularly change the details of their DRM and so the tools in the main too ## I’ve got the tools archive and I’ve read all the FAQs but I still can’t install the tools and/or the DRM removal doesn’t work * Read the `ReadMe_Overview.txt` file in the top level of the tools archive * Read the ReadMe file for the tool you want to use. -* If you still can’t remove the DRM, ask in the comments section of Apprentice Alf's blog or create a new issue at Apprentice Harper's github repository, reporting the error as precisely as you can, what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this). +* If you still can’t remove the DRM, create a new [GitHub issue](https://github.com/noDRM/DeDRM_tools/issues). If you are using Apprentice Harper's original version and not this fork, you can also ask in the comments section of Apprentice Alf's blog or create a new issue at Apprentice Harper's github repository. If you do report an issue in any of the GitHub repositories, please report the error as precisely as you can. Include what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this). ## Who wrote these scripts? The authors tend to identify themselves only by pseudonyms: * The Adobe Adept and Barnes & Noble scripts were created by i♥cabbages +* The Readium LCP support for this plugin was created by NoDRM * The Amazon Mobipocket and eReader scripts were created by The Dark Reverser * The Amazon K4PC DRM/format was further decoded by Bart Simpson aka Skindle * The Amazon K4 Mobi tool was created by by some_updates, mdlnx and others diff --git a/Obok_plugin/obok_dedrm_Help.htm b/Obok_plugin/obok_dedrm_Help.htm index 251c23f5..c79eb5d2 100644 --- a/Obok_plugin/obok_dedrm_Help.htm +++ b/Obok_plugin/obok_dedrm_Help.htm @@ -8,7 +8,7 @@

Obok DeDRM Plugin

-

(version 3.1.3)

+

(version 10.0.0)

Installation:

@@ -22,7 +22,7 @@

Configuration:

Troubleshooting:

-

If you find that it’s not working for you , you can save a lot of time by using the plugin with Calibre in debug mode. This will print out a lot of helpful info that can be copied into any online help requests.

+

If you find that it’s not working for you, you can save a lot of time by using the plugin with Calibre in debug mode. This will print out a lot of helpful info that can be copied into any online help requests.

Open a command prompt (terminal window) and type "calibre-debug -g" (without the quotes). Calibre will launch, and you can use the plugin the usual way. The debug info will be output to the original command prompt (terminal window). Copy the resulting output and paste it into the comment you make at Apprentice Alf's blog.

diff --git a/README.md b/README.md index c587f7e5..d93487ea 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -# [Guide] How to remove DRM -Refer to [Wiki Page](https://github.com/apprenticeharper/DeDRM_tools/wiki/Exactly-how-to-remove-DRM) - # DeDRM_tools DeDRM tools for ebooks This is a fork of Apprentice Harper's version of the DeDRM tools. I've added some of the PRs that still haven't been merged, as well as added some more features / bugfixes myself. +Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0 so there won't be conflicting / duplicate version numbers when Apprentice Harper's version is updated again. + +The v10.0.0 versions of this plugin should both work with Calibre 5.x (Python 3) as well as Calibre 4.x and lower (Python 2). If you encounter issues with this plugin in Calibre 4.x or lower, please open a bug report. + # Original README from Apprentice Harper This is a repository that tracks all the scripts and other tools for removing DRM from ebooks that I could find, committed in date order as best as I could manage. (Except for the Requiem tools for Apple's iBooks, and Convert LIT for Microsoft's .lit ebooks.) This includes the tools from a time before Apprentice Alf had a blog, and continues through to when Apprentice Harper (with help) took over maintenance of the tools. diff --git a/ReadMe_Overview.txt b/ReadMe_Overview.txt index ca5bca12..3fd2b2b4 100644 --- a/ReadMe_Overview.txt +++ b/ReadMe_Overview.txt @@ -55,6 +55,7 @@ It may be possible to use the plugins on a Linux system, but no support is given Credits ------- The original inept and ignoble scripts were by i♥cabbages +The original Readium LCP DRM removal by NoDRM The original mobidedrm and erdr2pml scripts were by The Dark Reverser The original topaz DRM removal script was by CMBDTC The original topaz format conversion scripts were by some_updates, clarknova and Bart Simpson From 2edde54c44d29e145ae91204de8659da2c374b1e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 19 Nov 2021 12:42:29 +0100 Subject: [PATCH 031/154] Fixes a bug that sometimes caused the plugin to fail --- .github/workflows/main.yml | 2 +- DeDRM_plugin/__init__.py | 15 +++++-- DeDRM_plugin/epubwatermark.py | 73 ++++++++++++++++++++++++++++++++--- 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 707a5dea..c9f3ab7f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,7 +10,7 @@ jobs: - name: Checkout uses: actions/checkout@v2 - name: Package - run: python3 make_release.py 10.0.0 + run: python3 make_release.py 10.0.1 - name: Upload uses: actions/upload-artifact@v2 with: diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 778b84b5..3be03f74 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -6,7 +6,7 @@ # Copyright © 2021 NoDRM __license__ = 'GPL v3' -__version__ = '10.0.0' +__version__ = '10.0.1' __docformat__ = 'restructuredtext en' @@ -79,6 +79,7 @@ # 7.2.0 - Update for latest KFX changes, and Python 3 Obok fixes. # 7.2.1 - Whitespace! # 10.0.0 - First forked version by NoDRM. See CHANGELOG.md for details. +# 10.0.1 - Fixes a bug in the watermark code. """ Decrypt DRMed ebooks. @@ -210,6 +211,8 @@ def postProcessEPUB(self, path_to_ebook): # It does stuff like de-obfuscating fonts (by calling checkFonts) # or removing watermarks. + postProcessStart = time.time() + try: import calibre_plugins.dedrm.prefs as prefs dedrmprefs = prefs.DeDRM_Prefs() @@ -224,13 +227,17 @@ def postProcessEPUB(self, path_to_ebook): # Remove Tolino's CDP watermark file path_to_ebook = watermark.removeCDPwatermark(self, path_to_ebook) or path_to_ebook - # Remove watermarks (currently just Amazon) from the OPF file + # Remove watermarks (Amazon or LemonInk) from the OPF file path_to_ebook = watermark.removeOPFwatermarks(self, path_to_ebook) or path_to_ebook - # Remove watermarks (currently just Adobe's resource ID) from all HTML and XHTML files + # Remove watermarks (Adobe or LemonInk) from all HTML and XHTML files path_to_ebook = watermark.removeHTMLwatermarks(self, path_to_ebook) or path_to_ebook - return path_to_ebook + postProcessEnd = time.time() + print("{0} v{1}: Post-processing took {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, postProcessEnd-postProcessStart)) + + + return path_to_ebook except: print("Error while checking settings") diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py index 3139e7a3..e6115b3b 100644 --- a/DeDRM_plugin/epubwatermark.py +++ b/DeDRM_plugin/epubwatermark.py @@ -29,6 +29,12 @@ def removeHTMLwatermarks(object, path_to_ebook): modded_names = [] modded_contents = [] + count_adept = 0 + + count_lemonink_invisible = 0 + count_lemonink_visible = 0 + lemonink_trackingID = None + for file in namelist: if not (file.endswith('.html') or file.endswith('.xhtml') or file.endswith('.xml')): continue @@ -40,8 +46,33 @@ def removeHTMLwatermarks(object, path_to_ebook): # Remove Adobe ADEPT watermarks # Match optional newline at the beginning, then a "meta" tag with name = "Adept.expected.resource" or "Adept.resource" # and either a "value" or a "content" element with an Adobe UUID + pre_remove = str_new str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', str_new) str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', str_new) + + if (str_new != pre_remove): + count_adept += 1 + + # Remove eLibri / LemonInk watermark + # Run this in a loop, as it is possible a file has been watermarked twice ... + while True: + pre_remove = str_new + unique_id = re.search(r']+class="[^"]*(t0x[0-9a-fA-F]{25})[^"]*"[^>]*>', str_new) + if (unique_id): + lemonink_trackingID = unique_id.groups()[0] + count_lemonink_invisible += 1 + str_new = re.sub(lemonink_trackingID, '', str_new) + pre_remove = str_new + pm = r'(]+class="[^"]*"[^>]*>)' + pm += r'\
(.*?)
' + pm += r'\
(.*?)
' + str_new = re.sub(pm, r'\1', str_new) + + if (str_new != pre_remove): + count_lemonink_visible += 1 + else: + break + except: traceback.print_exc() continue @@ -51,6 +82,7 @@ def removeHTMLwatermarks(object, path_to_ebook): modded_names.append(file) modded_contents.append(str_new) + if len(modded_names) == 0: # No file modified, return original @@ -58,7 +90,7 @@ def removeHTMLwatermarks(object, path_to_ebook): if len(modded_names) != len(modded_contents): # Something went terribly wrong, return original - print("Watermark: Error during ADEPT watermark removal") + print("Watermark: Error during watermark removal") return path_to_ebook # Re-package with modified files: @@ -105,12 +137,20 @@ def removeHTMLwatermarks(object, path_to_ebook): traceback.print_exc() return path_to_ebook + if (count_adept > 0): + print("Watermark: Successfully stripped {0} ADEPT watermark(s) from ebook.".format(count_adept)) + + if (count_lemonink_invisible > 0 or count_lemonink_visible > 0): + print("Watermark: Successfully stripped {0} visible and {1} invisible LemonInk watermark(s) (\"{2}\") from ebook." + .format(count_lemonink_visible, count_lemonink_invisible, lemonink_trackingID)) + + return output + except: traceback.print_exc() return path_to_ebook - print("Watermark: Successfully stripped {0} ADEPT watermark(s) from ebook.".format(len(modded_names))) - return output + # Finds the main OPF file, then uses RegEx to remove watermarks @@ -141,10 +181,27 @@ def removeOPFwatermarks(object, path_to_ebook): container_str = inf.read(opf_path).decode("utf-8") container_str_new = container_str + had_amazon = False + had_elibri = False + # Remove Amazon hex watermarks # Match optional newline at the beginning, then spaces, then a "meta" tag with name = "Watermark" or "Watermark_(hex)" and a "content" element. - container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) - container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) + # This regex also matches DuMont watermarks with meta name="watermark", with the case-insensitive match on the "w" in watermark. + pre_remove = container_str_new + container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) + container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\', '', container_str_new) + if pre_remove != container_str_new: + had_amazon = True + + # Remove elibri / lemonink watermark + # Lemonink replaces all "id" fields in the opf with "idX_Y", with X being the watermark and Y being a number for that particular ID. + # This regex replaces all "idX_Y" IDs with "id_Y", removing the watermark IDs. + pre_remove = container_str_new + container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\<\!\-\-\s*Wygenerowane przez elibri dla zamówienia numer [0-9a-fA-F]+\s*\-\-\>', '', container_str_new) + container_str_new = re.sub(r'\=\"id[0-9]+_([0-9]+)\"', r'="id_\1"', container_str_new) + if pre_remove != container_str_new: + had_elibri = True + except: traceback.print_exc() return path_to_ebook @@ -191,7 +248,11 @@ def removeOPFwatermarks(object, path_to_ebook): traceback.print_exc() return path_to_ebook - print("Watermark: Successfully stripped Amazon watermark from OPF file.") + if had_elibri: + print("Watermark: Successfully stripped eLibri watermark from OPF file.") + if had_amazon: + print("Watermark: Successfully stripped Amazon watermark from OPF file.") + return output From 33437073d6ce4401501a00798776e2fcf168e97e Mon Sep 17 00:00:00 2001 From: Daniele Metilli Date: Sun, 21 Nov 2021 22:30:58 +0100 Subject: [PATCH 032/154] Fix typo in kindlekey.py that broke Mac version --- DeDRM_plugin/kindlekey.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 8321923e..f9f79a47 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -1526,7 +1526,7 @@ def getDBfromFile(kInfoFile): b'SerialNumber',\ b'UsernameHash',\ b'kindle.directedid.info',\ - b'DSN' + b'DSN',\ b'kindle.accounttype.info',\ b'krx.flashcardsplugin.data.encryption_key',\ b'krx.notebookexportplugin.data.encryption_key',\ From e9a6e80e5ae77c4dab357865f666dcdc8cf462d1 Mon Sep 17 00:00:00 2001 From: Florian Bach Date: Sun, 28 Nov 2021 12:51:22 +0100 Subject: [PATCH 033/154] Fix username code for ADE key retrieval --- DeDRM_plugin/adobekey.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 3565cf66..f0464de1 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -237,6 +237,20 @@ def GetUserName(): return GetUserName GetUserName = GetUserName() + def GetUserName2(): + try: + import winreg + except ImportError: + import _winreg as winreg + + try: + DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, DEVICE_KEY_PATH) + userREG = winreg.QueryValueEx(regkey, 'username')[0].encode('utf-16-le')[::2] + return userREG + except: + return None + PAGE_EXECUTE_READWRITE = 0x40 MEM_COMMIT = 0x1000 MEM_RESERVE = 0x2000 @@ -360,7 +374,9 @@ def adeptkeys(): serial = GetVolumeSerialNumber(root) vendor = cpuid0() signature = struct.pack('>I', cpuid1())[1:] - user = GetUserName() + user = GetUserName2() + if user is None: + user = GetUserName() entropy = struct.pack('>I12s3s13s', serial, vendor, signature, user) cuser = winreg.HKEY_CURRENT_USER try: From ca6ec8f6d0e43e8abed5bc9c293160e0e9eb58bb Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 29 Nov 2021 16:27:51 +0100 Subject: [PATCH 034/154] Allow packaging without version number --- .github/workflows/main.yml | 3 ++- make_release.py | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c9f3ab7f..899539a0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,10 +10,11 @@ jobs: - name: Checkout uses: actions/checkout@v2 - name: Package - run: python3 make_release.py 10.0.1 + run: python3 make_release.py - name: Upload uses: actions/upload-artifact@v2 with: name: plugin path: | DeDRM_tools_*.zip + DeDRM_tools.zip diff --git a/make_release.py b/make_release.py index 0e95173d..e600af8a 100755 --- a/make_release.py +++ b/make_release.py @@ -34,7 +34,10 @@ def make_release(version): shutil.copy(OBOK_README, RELEASE_DIR) shutil.copy("ReadMe_Overview.txt", RELEASE_DIR) - release_name = 'DeDRM_tools_{}'.format(version) + if version is not None: + release_name = 'DeDRM_tools_{}'.format(version) + else: + release_name = 'DeDRM_tools' result = shutil.make_archive(release_name, 'zip', RELEASE_DIR) try: shutil.rmtree(RELEASE_DIR) @@ -48,6 +51,6 @@ def make_release(version): try: version = sys.argv[1] except IndexError: - raise SystemExit('Usage: {} version'.format(__file__)) + version = None print(make_release(version)) From 09a34cf7d92e8f4e029fdfc0922f7fb2ca1a444c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 29 Nov 2021 16:33:45 +0100 Subject: [PATCH 035/154] Fix watermark stuff --- DeDRM_plugin/epubwatermark.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py index e6115b3b..95459758 100644 --- a/DeDRM_plugin/epubwatermark.py +++ b/DeDRM_plugin/epubwatermark.py @@ -198,7 +198,9 @@ def removeOPFwatermarks(object, path_to_ebook): # This regex replaces all "idX_Y" IDs with "id_Y", removing the watermark IDs. pre_remove = container_str_new container_str_new = re.sub(r'((\r\n|\r|\n)\s*)?\<\!\-\-\s*Wygenerowane przez elibri dla zamówienia numer [0-9a-fA-F]+\s*\-\-\>', '', container_str_new) - container_str_new = re.sub(r'\=\"id[0-9]+_([0-9]+)\"', r'="id_\1"', container_str_new) + if pre_remove != container_str_new: + # To prevent this Regex from applying to books without that watermark, only do that if the watermark above was found. + container_str_new = re.sub(r'\=\"id[0-9]+_([0-9]+)\"', r'="id_\1"', container_str_new) if pre_remove != container_str_new: had_elibri = True From d05594dcbc008decf930a3d3d44f891c7026e595 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 29 Nov 2021 17:06:18 +0100 Subject: [PATCH 036/154] Update to v10.0.2 --- CHANGELOG.md | 15 +++++++- DeDRM_plugin/__init__.py | 3 +- DeDRM_plugin/adobekey.py | 79 +++++++++++++++++++++++++++++----------- DeDRM_plugin/config.py | 2 +- 4 files changed, 75 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbb1f72a..f6a7efe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ List of changes since the fork of Apprentice Harper's repository: +## Fixes in v10.0.0 (2021-11-17): + - CI testing / linting removed as that always failed anyways. The CI now "just" packages the plugin. - Support for the Readium LCP DRM (also known as "CARE DRM" or "TEA DRM"). This supports EPUB and PDF files. It does not yet support Readium LCPDF/LPF/LCPA/LCPAU/LCPDI files, as I don't have access to any of these. If you have an LCP-protected file in one of these formats that this plugin does not work with, please open [an issue](https://github.com/noDRM/DeDRM_tools/issues) and attach the file to the report. - Add new Github issue report form which forces the user to include stuff like their Calibre version to hopefully increase the quality of bug reports. @@ -20,4 +22,15 @@ List of changes since the fork of Apprentice Harper's repository: - Add a more verbose error message when trying to remove DRM from a book with the new, not-yet-cracked version of the Adobe ADEPT DRM. - Added back support for Python2 (Calibre 2.0+). Only tested with ADEPT (PDF & EPUB) and Readium LCP so far, please open an issue if there's errors with other book types. - Begin work on removing some kinds of watermarks from files after DRM removal. This isn't tested a lot, and is disabled by default. You can enable it in the plugin settings. -- If you're using the [ACSM Input Plugin / DeACSM](https://www.mobileread.com/forums/showthread.php?t=341975), the encryption key will automatically be extracted from that plugin if necessary. \ No newline at end of file +- If you're using the [ACSM Input Plugin / DeACSM](https://www.mobileread.com/forums/showthread.php?t=341975), the encryption key will automatically be extracted from that plugin if necessary. + +## Fixes in v10.0.1 (2021-11-19): + +- Hotfix update to fix broken EPUB DRM removal due to a typo. + +## Fixes in v10.0.2 (2021-11-29): + +- Fix Kindle for Mac key retrieval (merged [apprenticeharper/DeDRM_tools#1936](https://github.com/apprenticeharper/DeDRM_tools/pull/1936) ), fixing #1. +- Fix Adobe key retrieval in case the username has been changed (merged [apprenticeharper/DeDRM_tools#1946](https://github.com/apprenticeharper/DeDRM_tools/pull/1946) ). This should fix the error "failed to decrypt user key key". +- Fix small issue with elibri watermark removal. +- Adobe key name will now contain account email. diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 3be03f74..0b17e5f6 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -6,7 +6,7 @@ # Copyright © 2021 NoDRM __license__ = 'GPL v3' -__version__ = '10.0.1' +__version__ = '10.0.2' __docformat__ = 'restructuredtext en' @@ -80,6 +80,7 @@ # 7.2.1 - Whitespace! # 10.0.0 - First forked version by NoDRM. See CHANGELOG.md for details. # 10.0.1 - Fixes a bug in the watermark code. +# 10.0.2 - Fix Kindle for Mac & update Adobe key retrieval """ Decrypt DRMed ebooks. diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index f0464de1..f957ed1f 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# adobekey.pyw, version 6.0 -# Copyright © 2009-2020 i♥cabbages, Apprentice Harper et al. +# adobekey.pyw, version 7.1 +# Copyright © 2009-2021 i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -29,13 +29,14 @@ # 5.9 - moved unicode_argv call inside main for Windows DeDRM compatibility # 6.0 - Work if TkInter is missing # 7.0 - Python 3 for calibre 5 +# 7.1 - Fix "failed to decrypt user key key" error (read username from registry) """ Retrieve Adobe ADEPT user key. """ __license__ = 'GPL v3' -__version__ = '7.0' +__version__ = '7.1' import sys, os, struct, getopt from base64 import b64decode @@ -288,8 +289,13 @@ def __call__(self, *args): def __del__(self): if self._buf is not None: - VirtualFree(self._buf) - self._buf = None + try: + VirtualFree(self._buf) + self._buf = None + except TypeError: + # Apparently this sometimes gets cleared on application exit + # Causes a useless exception in the log, so let's just catch and ignore that. + pass if struct.calcsize("P") == 4: CPUID0_INSNS = ( @@ -400,7 +406,7 @@ def adeptkeys(): ktype = winreg.QueryValueEx(plkparent, None)[0] if ktype != 'credentials': continue - uuid_name = "Unknown" + uuid_name = "" for j in range(0, 16): try: plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) @@ -408,17 +414,32 @@ def adeptkeys(): break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'user': - uuid_name = winreg.QueryValueEx(plkkey, 'value')[0] - if ktype != 'privateLicenseKey': - continue - userkey = winreg.QueryValueEx(plkkey, 'value')[0] - userkey = b64decode(userkey) - aes = AES(keykey) - userkey = aes.decrypt(userkey) - userkey = userkey[26:-ord(userkey[-1:])] - # print ("found " + uuid_name + " key: " + str(userkey)) - keys.append(userkey) - names.append(uuid_name[9:]) + # Add Adobe UUID to key name + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'value')[0][9:] + "_" + if ktype == 'username': + # Add account type & email to key name, if present + try: + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'method')[0] + "_" + except: + pass + try: + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'value')[0] + "_" + except: + pass + if ktype == 'privateLicenseKey': + userkey = winreg.QueryValueEx(plkkey, 'value')[0] + userkey = b64decode(userkey) + aes = AES(keykey) + userkey = aes.decrypt(userkey) + userkey = userkey[26:-ord(userkey[-1:])] + # print ("found " + uuid_name + " key: " + str(userkey)) + keys.append(userkey) + + if uuid_name == "": + names.append("Unknown") + else: + names.append(uuid_name[:-1]) + if len(keys) == 0: raise ADEPTError('Could not locate privateLicenseKey') print("Found {0:d} keys".format(len(keys))) @@ -461,16 +482,32 @@ def adeptkeys(): tree = etree.parse(actpath) adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey')) - exprUUID = '//%s/%s' % (adept('credentials'), adept('user')) userkey = tree.findtext(expr) - userUUID = "Unknown" + + exprUUID = '//%s/%s' % (adept('credentials'), adept('user')) + keyName = "" try: - userUUID = tree.findtext(exprUUID) + keyName = tree.findtext(exprUUID)[9:] + "_" except: pass + + try: + exprMail = '//%s/%s' % (adept('credentials'), adept('username')) + keyName = keyName + tree.find(exprMail).attrib["method"] + "_" + keyName = keyName + tree.findtext(exprMail) + "_" + except: + pass + + if keyName == "": + keyName = "Unknown" + else: + keyName = keyName[:-1] + + + userkey = b64decode(userkey) userkey = userkey[26:] - return [userkey], [userUUID[9:]] + return [userkey], [keyName] else: def adeptkeys(): diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index d566f885..9b9538ad 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -832,7 +832,7 @@ def __init__(self, parent=None,): key_group = QHBoxLayout() data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Unique Key Name:", self)) - self.key_ledit = QLineEdit(self.default_name_A, self) + self.key_ledit = QLineEdit("default_ade_key_uuid_" + self.default_name_A, self) self.key_ledit.setToolTip("

Enter an identifying name for the current Adobe key. Note that it's recommended to leave the UUID (the random-looking digits and letters) as it is.") key_group.addWidget(self.key_ledit) From 78ac98fc1b2582aea9096a5d49b468521a41b9b2 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 20 Dec 2021 21:06:50 +0100 Subject: [PATCH 037/154] Cleanup --- DeDRM_plugin/__init__.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 0b17e5f6..8f1c8521 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -234,9 +234,10 @@ def postProcessEPUB(self, path_to_ebook): # Remove watermarks (Adobe or LemonInk) from all HTML and XHTML files path_to_ebook = watermark.removeHTMLwatermarks(self, path_to_ebook) or path_to_ebook - postProcessEnd = time.time() - print("{0} v{1}: Post-processing took {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, postProcessEnd-postProcessStart)) - + + + postProcessEnd = time.time() + print("{0} v{1}: Post-processing took {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, postProcessEnd-postProcessStart)) return path_to_ebook @@ -487,14 +488,9 @@ def ePubDecrypt(self,path_to_ebook): scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) - try: - self.default_key = defaultkeys[0] - except: - print("{0} v{1}: No ADE key found".format(PLUGIN_NAME, PLUGIN_VERSION)) except: print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() - self.default_key = "" newkeys = [] newnames = [] @@ -669,14 +665,9 @@ def PDFDecrypt(self,path_to_ebook): scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) - try: - self.default_key = defaultkeys[0] - except: - print("{0} v{1}: No ADE key found".format(PLUGIN_NAME, PLUGIN_VERSION)) except: print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() - self.default_key = "" newkeys = [] newnames = [] From cdd6402b9a259bab7a6e7e308f31487292e79069 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 20 Dec 2021 21:07:44 +0100 Subject: [PATCH 038/154] Fix username decryption with unicode chars in Python2 --- DeDRM_plugin/adobekey.py | 29 ++- DeDRM_plugin/adobekey_winreg_unicode.py | 271 ++++++++++++++++++++++++ 2 files changed, 293 insertions(+), 7 deletions(-) create mode 100644 DeDRM_plugin/adobekey_winreg_unicode.py diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index f957ed1f..9871edaf 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -30,13 +30,14 @@ # 6.0 - Work if TkInter is missing # 7.0 - Python 3 for calibre 5 # 7.1 - Fix "failed to decrypt user key key" error (read username from registry) +# 7.2 - Fix decryption error on Python2 if there's unicode in the username """ Retrieve Adobe ADEPT user key. """ __license__ = 'GPL v3' -__version__ = '7.1' +__version__ = '7.2' import sys, os, struct, getopt from base64 import b64decode @@ -240,14 +241,21 @@ def GetUserName(): def GetUserName2(): try: - import winreg + from winreg import OpenKey, QueryValueEx, HKEY_CURRENT_USER except ImportError: - import _winreg as winreg + # We're on Python 2 + try: + # The default _winreg on Python2 isn't unicode-safe. + # Check if we have winreg_unicode, a unicode-safe alternative. + # Without winreg_unicode, this will fail with Unicode chars in the username. + from adobekey_winreg_unicode import OpenKey, QueryValueEx, HKEY_CURRENT_USER + except: + from _winreg import OpenKey, QueryValueEx, HKEY_CURRENT_USER try: DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, DEVICE_KEY_PATH) - userREG = winreg.QueryValueEx(regkey, 'username')[0].encode('utf-16-le')[::2] + regkey = OpenKey(HKEY_CURRENT_USER, DEVICE_KEY_PATH) + userREG = QueryValueEx(regkey, 'username')[0].encode('utf-16-le')[::2] return userREG except: return None @@ -398,11 +406,16 @@ def adeptkeys(): plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) except WindowsError: raise ADEPTError("Could not locate ADE activation") - for i in range(0, 16): + + i = -1 + while True: + i = i + 1 # start with 0 try: plkparent = winreg.OpenKey(plkroot, "%04d" % (i,)) - except WindowsError: + except: + # No more keys break + ktype = winreg.QueryValueEx(plkparent, None)[0] if ktype != 'credentials': continue @@ -476,6 +489,8 @@ def findActivationDat(): return None def adeptkeys(): + # TODO: All the code to support extracting multiple activation keys + # TODO: seems to be Windows-only currently, still needs to be added for Mac. actpath = findActivationDat() if actpath is None: raise ADEPTError("Could not find ADE activation.dat file.") diff --git a/DeDRM_plugin/adobekey_winreg_unicode.py b/DeDRM_plugin/adobekey_winreg_unicode.py new file mode 100644 index 00000000..6c719c40 --- /dev/null +++ b/DeDRM_plugin/adobekey_winreg_unicode.py @@ -0,0 +1,271 @@ +# This is based on https://github.com/DanielStutzbach/winreg_unicode +# The original _winreg in Python2 doesn't support unicode. +# This causes issues if there's unicode chars in the username needed to decrypt the key. + +''' +Copyright 2010 Stutzbach Enterprises, LLC (daniel@stutzbachenterprises.com) + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + 3. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +''' + +import ctypes, ctypes.wintypes + +ERROR_SUCCESS = 0 +ERROR_MORE_DATA = 234 + +KEY_READ = 0x20019 + +REG_NONE = 0 +REG_SZ = 1 +REG_EXPAND_SZ = 2 +REG_BINARY = 3 +REG_DWORD = 4 +REG_DWORD_BIG_ENDIAN = 5 +REG_DWORD_LITTLE_ENDIAN = 4 +REG_LINK = 6 +REG_MULTI_SZ = 7 +REG_RESOURCE_LIST = 8 +REG_FULL_RESOURCE_DESCRIPTOR = 9 +REG_RESOURCE_REQUIREMENTS_LIST = 10 + +c_HKEY = ctypes.c_void_p +DWORD = ctypes.wintypes.DWORD +BYTE = ctypes.wintypes.BYTE +LPDWORD = ctypes.POINTER(DWORD) +LPBYTE = ctypes.POINTER(BYTE) + +advapi32 = ctypes.windll.advapi32 + +class FILETIME(ctypes.Structure): + _fields_ = [("dwLowDateTime", DWORD), + ("dwHighDateTime", DWORD)] + +RegCloseKey = advapi32.RegCloseKey +RegCloseKey.restype = ctypes.c_long +RegCloseKey.argtypes = [c_HKEY] + +RegOpenKeyEx = advapi32.RegOpenKeyExW +RegOpenKeyEx.restype = ctypes.c_long +RegOpenKeyEx.argtypes = [c_HKEY, ctypes.c_wchar_p, ctypes.c_ulong, + ctypes.c_ulong, ctypes.POINTER(c_HKEY)] + +RegQueryInfoKey = advapi32.RegQueryInfoKeyW +RegQueryInfoKey.restype = ctypes.c_long +RegQueryInfoKey.argtypes = [c_HKEY, ctypes.c_wchar_p, LPDWORD, LPDWORD, + LPDWORD, LPDWORD, LPDWORD, LPDWORD, + LPDWORD, LPDWORD, LPDWORD, + ctypes.POINTER(FILETIME)] + +RegEnumValue = advapi32.RegEnumValueW +RegEnumValue.restype = ctypes.c_long +RegEnumValue.argtypes = [c_HKEY, DWORD, ctypes.c_wchar_p, LPDWORD, + LPDWORD, LPDWORD, LPBYTE, LPDWORD] + +RegEnumKeyEx = advapi32.RegEnumKeyExW +RegEnumKeyEx.restype = ctypes.c_long +RegEnumKeyEx.argtypes = [c_HKEY, DWORD, ctypes.c_wchar_p, LPDWORD, + LPDWORD, ctypes.c_wchar_p, LPDWORD, + ctypes.POINTER(FILETIME)] + +RegQueryValueEx = advapi32.RegQueryValueExW +RegQueryValueEx.restype = ctypes.c_long +RegQueryValueEx.argtypes = [c_HKEY, ctypes.c_wchar_p, LPDWORD, LPDWORD, + LPBYTE, LPDWORD] + +def check_code(code): + if code == ERROR_SUCCESS: + return + raise ctypes.WinError(2) + +class HKEY(object): + def __init__(self): + self.hkey = c_HKEY() + + def __enter__(self): + return self + + def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): + self.Close() + return False + + def Detach(self): + rv = self.cast(self.hkey, self.c_ulong).value + self.hkey = c_HKEY() + return rv + + def __nonzero__(self): + return bool(self.hkey) + + def Close(self): + if not self.hkey: + return + if RegCloseKey is None or check_code is None or c_HKEY is None: + return # globals become None during exit + rc = RegCloseKey(self.hkey) + self.hkey = c_HKEY() + check_code(rc) + + def __del__(self): + self.Close() + +class RootHKEY(ctypes.Structure): + def __init__(self, value): + self.hkey = c_HKEY(value) + + def Close(self): + pass + +HKEY_CLASSES_ROOT = RootHKEY(0x80000000) +HKEY_CURRENT_USER = RootHKEY(0x80000001) +HKEY_LOCAL_MACHINE = RootHKEY(0x80000002) +HKEY_USERS = RootHKEY(0x80000003) +HKEY_PERFORMANCE_DATA = RootHKEY(0x80000004) +HKEY_CURRENT_CONFIG = RootHKEY(0x80000005) +HKEY_DYN_DATA = RootHKEY(0x80000006) + +def OpenKey(key, sub_key): + new_key = HKEY() + rc = RegOpenKeyEx(key.hkey, sub_key, 0, KEY_READ, + ctypes.cast(ctypes.byref(new_key.hkey), + ctypes.POINTER(c_HKEY))) + check_code(rc) + return new_key + +def QueryInfoKey(key): + null = LPDWORD() + num_sub_keys = DWORD() + num_values = DWORD() + ft = FILETIME() + rc = RegQueryInfoKey(key.hkey, ctypes.c_wchar_p(), null, null, + ctypes.byref(num_sub_keys), null, null, + ctypes.byref(num_values), null, null, null, + ctypes.byref(ft)) + check_code(rc) + return (num_sub_keys.value, num_values.value, + ft.dwLowDateTime | (ft.dwHighDateTime << 32)) + +def EnumValue(key, index): + null = LPDWORD() + value_size = DWORD() + data_size = DWORD() + rc = RegQueryInfoKey(key.hkey, ctypes.c_wchar_p(), null, null, null, + null, null, null, + ctypes.byref(value_size), ctypes.byref(data_size), + null, ctypes.POINTER(FILETIME)()) + check_code(rc) + value_size.value += 1 + data_size.value += 1 + + value = ctypes.create_unicode_buffer(value_size.value) + + while True: + data = ctypes.create_string_buffer(data_size.value) + + tmp_value_size = DWORD(value_size.value) + tmp_data_size = DWORD(data_size.value) + typ = DWORD() + rc = RegEnumValue(key.hkey, index, + ctypes.cast(value, ctypes.c_wchar_p), + ctypes.byref(tmp_value_size), null, + ctypes.byref(typ), + ctypes.cast(data, LPBYTE), + ctypes.byref(tmp_data_size)) + + if rc != ERROR_MORE_DATA: + break + + data_size.value *= 2 + + check_code(rc) + return (value.value, Reg2Py(data, tmp_data_size.value, typ.value), + typ.value) + +def split_multi_sz(data, size): + if size == 0: + return [] + Q = size + P = 0 + rv = [] + while P < Q and data[P].value != u'\0': + rv.append[P] + while P < Q and data[P].value != u'\0': + P += 1 + P += 1 + rv.append(size) + return [ctypes.wstring_at(ctypes.pointer(data[rv[i]]), + rv[i+1] - rv[i]).rstrip(u'\x00') + for i in range(len(rv)-1)] + +def Reg2Py(data, size, typ): + if typ == REG_DWORD: + if size == 0: + return 0 + return ctypes.cast(data, ctypes.POINTER(ctypes.c_int)).contents.value + elif typ == REG_SZ or typ == REG_EXPAND_SZ: + return ctypes.wstring_at(data, size // 2).rstrip(u'\x00') + elif typ == REG_MULTI_SZ: + return split_multi_sz(ctypes.cast(data, ctypes.c_wchar_p), size // 2) + else: + if size == 0: + return None + return ctypes.string_at(data, size) + +def EnumKey(key, index): + tmpbuf = ctypes.create_unicode_buffer(257) + length = DWORD(257) + rc = RegEnumKeyEx(key.hkey, index, + ctypes.cast(tmpbuf, ctypes.c_wchar_p), + ctypes.byref(length), + LPDWORD(), ctypes.c_wchar_p(), LPDWORD(), + ctypes.POINTER(FILETIME)()) + check_code(rc) + return ctypes.wstring_at(tmpbuf, length.value).rstrip(u'\x00') + +def QueryValueEx(key, value_name): + size = 256 + typ = DWORD() + while True: + tmp_size = DWORD(size) + buf = ctypes.create_string_buffer(size) + rc = RegQueryValueEx(key.hkey, value_name, LPDWORD(), + ctypes.byref(typ), + ctypes.cast(buf, LPBYTE), ctypes.byref(tmp_size)) + if rc != ERROR_MORE_DATA: + break + + size *= 2 + check_code(rc) + return (Reg2Py(buf, tmp_size.value, typ.value), typ.value) + +__all__ = ['OpenKey', 'QueryInfoKey', 'EnumValue', 'EnumKey', 'QueryValueEx', + 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', 'HKEY_LOCAL_MACHINE', + 'HKEY_USERS', 'HKEY_PERFORMANCE_DATA', 'HKEY_CURRENT_CONFIG', + 'HKEY_DYN_DATA', 'REG_NONE', 'REG_SZ', 'REG_EXPAND_SZ', + 'REG_BINARY', 'REG_DWORD', 'REG_DWORD_BIG_ENDIAN', + 'REG_DWORD_LITTLE_ENDIAN', 'REG_LINK', 'REG_MULTI_SZ', + 'REG_RESOURCE_LIST', 'REG_FULL_RESOURCE_DESCRIPTOR', + 'REG_RESOURCE_REQUIREMENTS_LIST'] \ No newline at end of file From 3eb4eab18da020419eeb8bf09c968cd7c29e0b9f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 20 Dec 2021 21:10:21 +0100 Subject: [PATCH 039/154] Support importing multiple keys from ADE --- DeDRM_plugin/config.py | 100 +++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 33 deletions(-) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 9b9538ad..6a9b920e 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -6,7 +6,7 @@ # Python 3, September 2020 # Standard Python modules. -import os, traceback, json, codecs +import sys, os, traceback, json, codecs from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, QCheckBox, @@ -33,6 +33,11 @@ def checkForDeACSMkeys(): try: from calibre_plugins.deacsm.libadobeAccount import exportAccountEncryptionKeyDER, getAccountUUID + except: + # Looks like DeACSM is not installed. + return None, None + + try: from calibre.ptempfile import TemporaryFile @@ -774,6 +779,9 @@ def __init__(self, parent=None,): layout = QVBoxLayout(self) self.setLayout(layout) + self.new_keys = [] + self.new_names = [] + try: if iswindows or isosx: from calibre_plugins.dedrm.adobekey import adeptkeys @@ -785,43 +793,64 @@ def __init__(self, parent=None,): scriptpath = os.path.join(parent.parent.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",parent.getwineprefix()) - self.default_key = defaultkeys[0] - self.default_name_A = defaultnames[0] - - for key in self.parent.plugin_keys.values(): - if key == codecs.encode(self.default_key,'hex').decode("utf-8"): - # We already have the ADE key imported into the plugin. - # Set it back to "" as if we had not found anything, - # so the next code path searches more places for potential keys. - print("Found key '{0}' in ADE - already present, skipping.".format(self.default_name_A)) - self.default_key = "" - break - + if sys.version_info[0] < 3: + # Python2 + import itertools + zip_function = itertools.izip + else: + # Python3 + zip_function = zip + + for key, name in zip_function(defaultkeys, defaultnames): + if codecs.encode(key,'hex').decode("latin-1") in self.parent.plugin_keys.values(): + print("Found key '{0}' in ADE - already present, skipping.".format(name)) + else: + self.new_keys.append(key) + self.new_names.append(name) except: - self.default_key = "" - - self.foundInPlugin = False + print("Exception while checking for ADE keys") + traceback.print_exc() - if len(self.default_key) == 0: - # No (new) key found in ADE. Check the DeACSM calibre plugin instead. + # Check for keys in the DeACSM plugin + try: key, name = checkForDeACSMkeys() if key is not None: - self.default_key = key - self.default_name_A = name - - for key in self.parent.plugin_keys.values(): - if key == codecs.encode(self.default_key,'hex').decode("utf-8"): - # We already have the ADE key imported into the plugin. - # Set it back to "" as if we had not found anything, - # so the next code path searches more places for potential keys. - print("Found key '{0}' in DeACSM - already present, skipping.".format(self.default_name_A)) - self.default_key = "" - break + + if codecs.encode(key,'hex').decode("latin-1") in self.parent.plugin_keys.values(): + print("Found key '{0}' in DeACSM - already present, skipping.".format(name)) + else: + # Found new key, add that. + self.new_keys.append(key) + self.new_names.append(name) + except: + print("Exception while checking for DeACSM keys") + traceback.print_exc() + + # Just in case ADE and DeACSM are activated with the same account, + # check the new_keys list for duplicates and remove them, if they exist. + + new_keys_2 = [] + new_names_2 = [] + i = 0 + while True: + if i >= len(self.new_keys): + break + if not self.new_keys[i] in new_keys_2: + new_keys_2.append(self.new_keys[i]) + new_names_2.append(self.new_names[i]) + i = i + 1 + self.new_keys = new_keys_2 + self.new_names = new_names_2 + - if len(self.default_key)>0: + # Okay, new_keys is now a list of new keys, and new_names has the names for these keys. + # Right now this code only supports adding one key per each invocation, + # so if the user has multiple keys, he's going to need to add the "plus" button multiple times. + + if len(self.new_keys)>0: self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) data_group_box = QGroupBox("", self) @@ -832,9 +861,14 @@ def __init__(self, parent=None,): key_group = QHBoxLayout() data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Unique Key Name:", self)) - self.key_ledit = QLineEdit("default_ade_key_uuid_" + self.default_name_A, self) + self.key_ledit = QLineEdit("ade_key_uuid_" + self.new_names[0], self) self.key_ledit.setToolTip("

Enter an identifying name for the current Adobe key. Note that it's recommended to leave the UUID (the random-looking digits and letters) as it is.") key_group.addWidget(self.key_ledit) + + if len(self.new_keys) > 1: + # The code currently doesn't support adding multiple keys. + # If there are more keys, tell the user to trigger this again. + data_group_box_layout.addWidget(QLabel("

There are more keys available.
Click the 'plus' icon again after adding this key to add the other keys.

", self)) self.button_box.accepted.connect(self.accept) else: @@ -859,12 +893,12 @@ def key_name(self): @property def key_value(self): - return codecs.encode(self.default_key,'hex').decode("utf-8") + return codecs.encode(self.new_keys[0],'hex').decode("utf-8") def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): - errmsg = "All fields are required!" + errmsg = "Key name must not be empty!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) if len(self.key_name) < 4: errmsg = "Key name must be at least 4 characters long!" From a16e66a0231093699cf083e18063341c7549b048 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 20 Dec 2021 21:11:09 +0100 Subject: [PATCH 040/154] Detect Kobo & Apple DRM in epubtest.py --- DeDRM_plugin/epubtest.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index c2f47af5..11f8b4b4 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -175,15 +175,13 @@ def getfiledata(file, zi): return data def encryption(infile): - # returns encryption: one of Unencrypted, Adobe, B&N and Unknown - encryption = "Error When Checking." + # Supports Adobe (old & new), B&N, Kobo, Apple, Readium LCP. + encryption = "Error" try: with open(infile,'rb') as infileobject: bookdata = infileobject.read(58) # Check for Zip if bookdata[0:0+2] == b"PK": - foundrights = False - foundencryption = False inzip = zipfile.ZipFile(infile,'r') namelist = set(inzip.namelist()) if ( @@ -191,21 +189,32 @@ def encryption(infile): 'META-INF/license.lcpl' in namelist and b"EncryptedContentKey" in inzip.read("META-INF/encryption.xml")): encryption = "Readium LCP" + + elif 'META-INF/sinf.xml' in namelist and b"fairplay" in inzip.read("META-INF/sinf.xml"): + # Untested, just found this info on Google + encryption = "Apple" + + elif 'META-INF/rights.xml' in namelist and b"" in inzip.read("META-INF/rights.xml"): + # Untested, just found this info on Google + encryption = "Kobo" elif 'META-INF/rights.xml' not in namelist or 'META-INF/encryption.xml' not in namelist: encryption = "Unencrypted" else: - rights = etree.fromstring(inzip.read('META-INF/rights.xml')) - adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) - expr = './/%s' % (adept('encryptedKey'),) - bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) == 172: - encryption = "Adobe (old)" - if len(bookkey) == 192: - encryption = "Adobe (new)" - elif len(bookkey) == 64: - encryption = "B&N" - else: + try: + rights = etree.fromstring(inzip.read('META-INF/rights.xml')) + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + expr = './/%s' % (adept('encryptedKey'),) + bookkey = ''.join(rights.findtext(expr)) + if len(bookkey) == 172: + encryption = "Adobe (old)" + if len(bookkey) == 192: + encryption = "Adobe (new)" + elif len(bookkey) == 64: + encryption = "B&N" + else: + encryption = "Unknown (key len " + str(len(bookkey)) + ")" + except: encryption = "Unknown" except: traceback.print_exc() From db71d35b4030ed07292b78b28085b35f5d8d3afb Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 20 Dec 2021 21:16:03 +0100 Subject: [PATCH 041/154] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6a7efe4..3008a2f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,3 +34,10 @@ List of changes since the fork of Apprentice Harper's repository: - Fix Adobe key retrieval in case the username has been changed (merged [apprenticeharper/DeDRM_tools#1946](https://github.com/apprenticeharper/DeDRM_tools/pull/1946) ). This should fix the error "failed to decrypt user key key". - Fix small issue with elibri watermark removal. - Adobe key name will now contain account email. + +## Fixes on master (not yet released): + +- Fix issue where importing a key from Adobe Digital Editions would fail in Python2 (Calibre < 5) if there were non-ASCII characters in the username. +- Add code to support importing multiple decryption keys from ADE (click the 'plus' button multiple times). +- Improve epubtest.py to also detect Kobo & Apple DRM. +- Small updates to the LCP DRM error messages. From 3b9c2014214b4d047c7a471edda34ba6a522cc5e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 23 Dec 2021 11:29:58 +0100 Subject: [PATCH 042/154] Lots of B&N updates --- CHANGELOG.md | 4 + DeDRM_plugin/__init__.py | 422 ++-- DeDRM_plugin/config.py | 340 ++- DeDRM_plugin/ignoblekeyAndroid.py | 65 + ...oblekeygen.py => ignoblekeyGenPassHash.py} | 2 +- .../{ignoblekey.py => ignoblekeyNookStudy.py} | 0 DeDRM_plugin/ignoblekeyWindowsStore.py | 75 + DeDRM_plugin/ignoblekeyfetch.py | 7 +- DeDRM_plugin/ignoblepdf.py | 2199 ----------------- DeDRM_plugin/ineptepub.py | 70 +- DeDRM_plugin/utilities.py | 2 +- 11 files changed, 684 insertions(+), 2502 deletions(-) create mode 100644 DeDRM_plugin/ignoblekeyAndroid.py rename DeDRM_plugin/{ignoblekeygen.py => ignoblekeyGenPassHash.py} (99%) rename DeDRM_plugin/{ignoblekey.py => ignoblekeyNookStudy.py} (100%) create mode 100644 DeDRM_plugin/ignoblekeyWindowsStore.py delete mode 100644 DeDRM_plugin/ignoblepdf.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3008a2f0..462b1cea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,3 +41,7 @@ List of changes since the fork of Apprentice Harper's repository: - Add code to support importing multiple decryption keys from ADE (click the 'plus' button multiple times). - Improve epubtest.py to also detect Kobo & Apple DRM. - Small updates to the LCP DRM error messages. +- Merge ignobleepub into ineptepub so there's no duplicate code. +- Support extracting the B&N / Nook key from the NOOK Microsoft Store application (based on [this script](https://github.com/noDRM/DeDRM_tools/discussions/9) by fesiwi). +- Support extracting the B&N / Nook key from a data dump of the NOOK Android application. +- Support adding an existing B&N key base64 string without having to write it to a file first. diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 8f1c8521..2db9acbe 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -302,266 +302,288 @@ def ePubDecrypt(self,path_to_ebook): # Not an LCP book, do the normal EPUB (Adobe) handling. - # import the Barnes & Noble ePub handler - import calibre_plugins.dedrm.ignobleepub as ignobleepub + # import the Adobe ePub handler + import calibre_plugins.dedrm.ineptepub as ineptepub + if ineptepub.adeptBook(inf.name): - #check the book - if ignobleepub.ignobleBook(inf.name): - print("{0} v{1}: “{2}” is a secure Barnes & Noble ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + if ineptepub.isPassHashBook(inf.name): + # This is an Adobe PassHash / B&N encrypted eBook + print("{0} v{1}: “{2}” is a secure PassHash-protected (B&N) ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - # Attempt to decrypt epub with each encryption key (generated or provided). - for keyname, userkey in dedrmprefs['bandnkeys'].items(): - keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) - of = self.temporary_file(".epub") + # Attempt to decrypt epub with each encryption key (generated or provided). + for keyname, userkey in dedrmprefs['bandnkeys'].items(): + keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) + of = self.temporary_file(".epub") - # Give the user key, ebook and TemporaryPersistent file to the decryption function. - try: - result = ignobleepub.decryptBook(userkey, inf.name, of.name) - except: - print("{0} v{1}: Exception when trying to decrypt after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() - result = 1 + # Give the user key, ebook and TemporaryPersistent file to the decryption function. + try: + result = ineptepub.decryptBook(userkey, inf.name, of.name) + except: + print("{0} v{1}: Exception when trying to decrypt after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + result = 1 - of.close() + of.close() + + if result == 0: + # Decryption was successful. + # Return the modified PersistentTemporary file to calibre. + return self.postProcessEPUB(of.name) - if result == 0: - # Decryption was successful. - # Return the modified PersistentTemporary file to calibre. - return self.postProcessEPUB(of.name) + print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) - print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) + # perhaps we should see if we can get a key from a log file + print("{0} v{1}: Looking for new NOOK Keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - # perhaps we should see if we can get a key from a log file - print("{0} v{1}: Looking for new NOOK Study Keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + # get the default NOOK keys + defaultkeys = [] - # get the default NOOK Study keys - defaultkeys = [] + ###### Add keys from the NOOK Study application (ignoblekeyNookStudy.py) - try: - if iswindows or isosx: - from calibre_plugins.dedrm.ignoblekey import nookkeys + try: + if iswindows or isosx: + from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys - defaultkeys = nookkeys() - else: # linux - from .wineutils import WineGetKeys + defaultkeys_study = nookkeys() + else: # linux + from .wineutils import WineGetKeys - scriptpath = os.path.join(self.alfdir,"ignoblekey.py") - defaultkeys = WineGetKeys(scriptpath, ".b64",dedrmprefs['adobewineprefix']) + scriptpath = os.path.join(self.alfdir,"ignoblekeyNookStudy.py") + defaultkeys_study = WineGetKeys(scriptpath, ".b64",dedrmprefs['adobewineprefix']) - except: - print("{0} v{1}: Exception when getting default NOOK Study Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() + except: + print("{0} v{1}: Exception when getting default NOOK Study Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + - newkeys = [] - for keyvalue in defaultkeys: - if keyvalue not in dedrmprefs['bandnkeys'].values(): - newkeys.append(keyvalue) + ###### Add keys from the NOOK Microsoft Store application (ignoblekeyNookStudy.py) - if len(newkeys) > 0: try: - for i,userkey in enumerate(newkeys): - print("{0} v{1}: Trying a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + if iswindows: + # That's a Windows store app, it won't run on Linux or MacOS anyways. + # No need to waste time running Wine. + from calibre_plugins.dedrm.ignoblekeyWindowsStore import dump_keys as dump_nook_keys + defaultkeys_store = dump_nook_keys(False) - of = self.temporary_file(".epub") + except: + print("{0} v{1}: Exception when getting default NOOK Microsoft App keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() - # Give the user key, ebook and TemporaryPersistent file to the decryption function. - try: - result = ignobleepub.decryptBook(userkey, inf.name, of.name) - except: - print("{0} v{1}: Exception when trying to decrypt after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() - result = 1 - of.close() + ###### Check if one of the new keys decrypts the book: - if result == 0: - # Decryption was a success - # Store the new successful key in the defaults - print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + newkeys = [] + for keyvalue in defaultkeys_study: + if keyvalue not in dedrmprefs['bandnkeys'].values() and keyvalue not in newkeys: + newkeys.append(keyvalue) + + if iswindows: + for keyvalue in defaultkeys_store: + if keyvalue not in dedrmprefs['bandnkeys'].values() and keyvalue not in newkeys: + newkeys.append(keyvalue) + + if len(newkeys) > 0: + try: + for i,userkey in enumerate(newkeys): + print("{0} v{1}: Trying a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + + of = self.temporary_file(".epub") + + # Give the user key, ebook and TemporaryPersistent file to the decryption function. try: - dedrmprefs.addnamedvaluetoprefs('bandnkeys','nook_Study_key',keyvalue) - dedrmprefs.writeprefs() - print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + result = ineptepub.decryptBook(userkey, inf.name, of.name) except: - print("{0} v{1}: Exception saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + print("{0} v{1}: Exception when trying to decrypt after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() - # Return the modified PersistentTemporary file to calibre. - return self.postProcessEPUB(of.name) + result = 1 + + of.close() + + if result == 0: + # Decryption was a success + # Store the new successful key in the defaults + print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + try: + dedrmprefs.addnamedvaluetoprefs('bandnkeys','nook_key_'+time.strftime("%Y-%m-%d"),keyvalue) + dedrmprefs.writeprefs() + print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + except: + print("{0} v{1}: Exception saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + # Return the modified PersistentTemporary file to calibre. + return self.postProcessEPUB(of.name) + + print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + + except: + pass - print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - except Exception as e: + else: + # This is a "normal" Adobe eBook. + + book_uuid = None + try: + # This tries to figure out which Adobe account UUID the book is licensed for. + # If we know that we can directly use the correct key instead of having to + # try them all. + book_uuid = ineptepub.adeptGetUserUUID(inf.name) + except: pass - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + if book_uuid is None: + print("{0} v{1}: {2} is a secure Adobe Adept ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + else: + print("{0} v{1}: {2} is a secure Adobe Adept ePub for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) - # import the Adobe Adept ePub handler - import calibre_plugins.dedrm.ineptepub as ineptepub - if ineptepub.adeptBook(inf.name): - book_uuid = None - try: - # This tries to figure out which Adobe account UUID the book is licensed for. - # If we know that we can directly use the correct key instead of having to - # try them all. - book_uuid = ineptepub.adeptGetUserUUID(inf.name) - except: - pass + if book_uuid is not None: + # Check if we have a key with that UUID in its name: + for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): + if not book_uuid.lower() in keyname.lower(): + continue - if book_uuid is None: - print("{0} v{1}: {2} is a secure Adobe Adept ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - else: - print("{0} v{1}: {2} is a secure Adobe Adept ePub for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) + # Found matching key + userkey = codecs.decode(userkeyhex, 'hex') + print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) + of = self.temporary_file(".epub") + try: + result = ineptepub.decryptBook(userkey, inf.name, of.name) + of.close() + if result == 0: + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + return self.postProcessEPUB(of.name) + except ineptepub.ADEPTNewVersionError: + print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + return self.postProcessEPUB(path_to_ebook) + except: + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() - if book_uuid is not None: - # Check if we have a key with that UUID in its name: - for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): - if not book_uuid.lower() in keyname.lower(): - continue - # Found matching key + # Attempt to decrypt epub with each encryption key (generated or provided). + for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): userkey = codecs.decode(userkeyhex, 'hex') - print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".epub") - try: + + # Give the user key, ebook and TemporaryPersistent file to the decryption function. + try: result = ineptepub.decryptBook(userkey, inf.name, of.name) - of.close() - if result == 0: - print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return self.postProcessEPUB(of.name) except ineptepub.ADEPTNewVersionError: print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) return self.postProcessEPUB(path_to_ebook) - except: - print("{0} v{1}: Exception when decrypting after {2:.1f} seconds - trying other keys".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() + result = 1 + try: + of.close() + except: + print("{0} v{1}: Exception closing temporary file after {2:.1f} seconds. Ignored.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - # Attempt to decrypt epub with each encryption key (generated or provided). - for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): - userkey = codecs.decode(userkeyhex, 'hex') - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) - of = self.temporary_file(".epub") - - # Give the user key, ebook and TemporaryPersistent file to the decryption function. - try: - result = ineptepub.decryptBook(userkey, inf.name, of.name) - except ineptepub.ADEPTNewVersionError: - print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - return self.postProcessEPUB(path_to_ebook) - except: - print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() - result = 1 - - try: - of.close() - except: - print("{0} v{1}: Exception closing temporary file after {2:.1f} seconds. Ignored.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - - if result == 0: - # Decryption was successful. - # Return the modified PersistentTemporary file to calibre. - print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - return self.postProcessEPUB(of.name) - - print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - - # perhaps we need to get a new default ADE key - print("{0} v{1}: Looking for new default Adobe Digital Editions Keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + if result == 0: + # Decryption was successful. + # Return the modified PersistentTemporary file to calibre. + print("{0} v{1}: Decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + return self.postProcessEPUB(of.name) - # get the default Adobe keys - defaultkeys = [] + print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - try: - if iswindows or isosx: - from calibre_plugins.dedrm.adobekey import adeptkeys + # perhaps we need to get a new default ADE key + print("{0} v{1}: Looking for new default Adobe Digital Editions Keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - defaultkeys, defaultnames = adeptkeys() - else: # linux - from .wineutils import WineGetKeys + # get the default Adobe keys + defaultkeys = [] - scriptpath = os.path.join(self.alfdir,"adobekey.py") - defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) + try: + if iswindows or isosx: + from calibre_plugins.dedrm.adobekey import adeptkeys - except: - print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() + defaultkeys, defaultnames = adeptkeys() + else: # linux + from .wineutils import WineGetKeys - newkeys = [] - newnames = [] - idx = 0 - for keyvalue in defaultkeys: - if codecs.encode(keyvalue, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): - newkeys.append(keyvalue) - newnames.append("default_ade_key_uuid_" + defaultnames[idx]) - idx += 1 + scriptpath = os.path.join(self.alfdir,"adobekey.py") + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) - # Check for DeACSM keys: - try: - from calibre_plugins.dedrm.config import checkForDeACSMkeys + except: + print("{0} v{1}: Exception when getting default Adobe Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() - newkey, newname = checkForDeACSMkeys() + newkeys = [] + newnames = [] + idx = 0 + for keyvalue in defaultkeys: + if codecs.encode(keyvalue, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): + newkeys.append(keyvalue) + newnames.append("default_ade_key_uuid_" + defaultnames[idx]) + idx += 1 - if newkey is not None: - if codecs.encode(newkey, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): - print("{0} v{1}: Found new key '{2}' in DeACSM plugin".format(PLUGIN_NAME, PLUGIN_VERSION, newname)) - newkeys.append(newkey) - newnames.append(newname) - except: - traceback.print_exc() - pass + # Check for DeACSM keys: + try: + from calibre_plugins.dedrm.config import checkForDeACSMkeys - if len(newkeys) > 0: - try: - for i,userkey in enumerate(newkeys): - print("{0} v{1}: Trying a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) - of = self.temporary_file(".epub") + newkey, newname = checkForDeACSMkeys() - # Give the user key, ebook and TemporaryPersistent file to the decryption function. - try: - result = ineptepub.decryptBook(userkey, inf.name, of.name) - except: - print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() - result = 1 + if newkey is not None: + if codecs.encode(newkey, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): + print("{0} v{1}: Found new key '{2}' in DeACSM plugin".format(PLUGIN_NAME, PLUGIN_VERSION, newname)) + newkeys.append(newkey) + newnames.append(newname) + except: + traceback.print_exc() + pass - of.close() + if len(newkeys) > 0: + try: + for i,userkey in enumerate(newkeys): + print("{0} v{1}: Trying a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + of = self.temporary_file(".epub") - if result == 0: - # Decryption was a success - # Store the new successful key in the defaults - print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + # Give the user key, ebook and TemporaryPersistent file to the decryption function. try: - dedrmprefs.addnamedvaluetoprefs('adeptkeys', newnames[i], codecs.encode(userkey, 'hex').decode('ascii')) - dedrmprefs.writeprefs() - print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + result = ineptepub.decryptBook(userkey, inf.name, of.name) except: - print("{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + print("{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() - print("{0} v{1}: Decrypted with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - # Return the modified PersistentTemporary file to calibre. - return self.postProcessEPUB(of.name) - - print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - except Exception as e: - print("{0} v{1}: Unexpected Exception trying a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) - traceback.print_exc() - pass + result = 1 + + of.close() + + if result == 0: + # Decryption was a success + # Store the new successful key in the defaults + print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) + try: + dedrmprefs.addnamedvaluetoprefs('adeptkeys', newnames[i], codecs.encode(userkey, 'hex').decode('ascii')) + dedrmprefs.writeprefs() + print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + except: + print("{0} v{1}: Exception when saving a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + print("{0} v{1}: Decrypted with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + # Return the modified PersistentTemporary file to calibre. + return self.postProcessEPUB(of.name) + + print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + except Exception as e: + print("{0} v{1}: Unexpected Exception trying a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + pass - # Something went wrong with decryption. - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + # Something went wrong with decryption. + print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - # Not a Barnes & Noble nor an Adobe Adept - # Probably a DRM-free EPUB, but we should still check for fonts. - print("{0} v{1}: “{2}” is neither an Adobe Adept nor a Barnes & Noble encrypted ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - return self.postProcessEPUB(inf.name) - #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + # Not a Barnes & Noble nor an Adobe Adept + # Probably a DRM-free EPUB, but we should still check for fonts. + print("{0} v{1}: “{2}” is neither an Adobe Adept nor a Barnes & Noble encrypted ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + return self.postProcessEPUB(inf.name) + #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) def PDFDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 6a9b920e..c1850e03 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -6,12 +6,12 @@ # Python 3, September 2020 # Standard Python modules. -import sys, os, traceback, json, codecs +import sys, os, traceback, json, codecs, base64 from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, QCheckBox, QAbstractItemView, QIcon, QDialog, QDialogButtonBox, QUrl, - QCheckBox) + QCheckBox, QComboBox) from PyQt5 import Qt as QtGui from zipfile import ZipFile @@ -113,8 +113,8 @@ def __init__(self, plugin_path, alfdir): button_layout = QVBoxLayout() keys_group_box_layout.addLayout(button_layout) self.bandn_button = QtGui.QPushButton(self) - self.bandn_button.setToolTip(_("Click to manage keys for Barnes and Noble ebooks")) - self.bandn_button.setText("Barnes and Noble ebooks") + self.bandn_button.setToolTip(_("Click to manage keys for ADE books with PassHash algorithm.
Commonly used by Barnes and Noble")) + self.bandn_button.setText("ADE PassHash (B&&N) ebooks") self.bandn_button.clicked.connect(self.bandn_keys) self.kindle_android_button = QtGui.QPushButton(self) self.kindle_android_button.setToolTip(_("Click to manage keys for Kindle for Android ebooks")) @@ -196,7 +196,7 @@ def mobi_keys(self): d.exec_() def bandn_keys(self): - d = ManageKeysDialog(self,"Barnes and Noble Key",self.tempdedrmprefs['bandnkeys'], AddBandNKeyDialog, 'b64') + d = ManageKeysDialog(self,"ADE PassHash Key",self.tempdedrmprefs['bandnkeys'], AddBandNKeyDialog, 'b64') d.exec_() def ereader_keys(self): @@ -566,79 +566,173 @@ def key_name(self): class AddBandNKeyDialog(QDialog): - def __init__(self, parent=None,): - QDialog.__init__(self, parent) - self.parent = parent - self.setWindowTitle("{0} {1}: Create New Barnes & Noble Key".format(PLUGIN_NAME, PLUGIN_VERSION)) - layout = QVBoxLayout(self) - self.setLayout(layout) - data_group_box = QGroupBox("", self) - layout.addWidget(data_group_box) - data_group_box_layout = QVBoxLayout() - data_group_box.setLayout(data_group_box_layout) + def update_form(self, idx): + self.cbType.hide() - key_group = QHBoxLayout() - data_group_box_layout.addLayout(key_group) - key_group.addWidget(QLabel("Unique Key Name:", self)) + if idx == 1: + self.add_fields_for_passhash() + elif idx == 2: + self.add_fields_for_b64_passhash() + elif idx == 3: + self.add_fields_for_windows_nook() + elif idx == 4: + self.add_fields_for_android_nook() + + + def add_fields_for_android_nook(self): + + self.andr_nook_group_box = QGroupBox("", self) + andr_nook_group_box_layout = QVBoxLayout() + self.andr_nook_group_box.setLayout(andr_nook_group_box_layout) + + self.layout.addWidget(self.andr_nook_group_box) + + ph_key_name_group = QHBoxLayout() + andr_nook_group_box_layout.addLayout(ph_key_name_group) + ph_key_name_group.addWidget(QLabel("Unique Key Name:", self)) + self.key_ledit = QLineEdit("", self) + self.key_ledit.setToolTip(_("

Enter an identifying name for this new key.

")) + ph_key_name_group.addWidget(self.key_ledit) + + andr_nook_group_box_layout.addWidget(QLabel("Hidden in the Android application data is a " + + "folder\nnamed '.adobe-digital-editions'. Please enter\nthe full path to that folder.", self)) + + ph_path_group = QHBoxLayout() + andr_nook_group_box_layout.addLayout(ph_path_group) + ph_path_group.addWidget(QLabel("Path:", self)) + self.cc_ledit = QLineEdit("", self) + self.cc_ledit.setToolTip(_("

Enter path to .adobe-digital-editions folder.

")) + ph_path_group.addWidget(self.cc_ledit) + + self.button_box.hide() + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept_android_nook) + self.button_box.rejected.connect(self.reject) + self.layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + def add_fields_for_windows_nook(self): + + self.win_nook_group_box = QGroupBox("", self) + win_nook_group_box_layout = QVBoxLayout() + self.win_nook_group_box.setLayout(win_nook_group_box_layout) + + self.layout.addWidget(self.win_nook_group_box) + + ph_key_name_group = QHBoxLayout() + win_nook_group_box_layout.addLayout(ph_key_name_group) + ph_key_name_group.addWidget(QLabel("Unique Key Name:", self)) + self.key_ledit = QLineEdit("", self) + self.key_ledit.setToolTip(_("

Enter an identifying name for this new key.

")) + ph_key_name_group.addWidget(self.key_ledit) + + self.button_box.hide() + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept_win_nook) + self.button_box.rejected.connect(self.reject) + self.layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + def add_fields_for_b64_passhash(self): + + self.passhash_group_box = QGroupBox("", self) + passhash_group_box_layout = QVBoxLayout() + self.passhash_group_box.setLayout(passhash_group_box_layout) + + self.layout.addWidget(self.passhash_group_box) + + ph_key_name_group = QHBoxLayout() + passhash_group_box_layout.addLayout(ph_key_name_group) + ph_key_name_group.addWidget(QLabel("Unique Key Name:", self)) self.key_ledit = QLineEdit("", self) self.key_ledit.setToolTip(_("

Enter an identifying name for this new key.

" + "

It should be something that will help you remember " + "what personal information was used to create it.")) - key_group.addWidget(self.key_ledit) + ph_key_name_group.addWidget(self.key_ledit) - name_group = QHBoxLayout() - data_group_box_layout.addLayout(name_group) - name_group.addWidget(QLabel("B&N/nook account email address:", self)) + ph_name_group = QHBoxLayout() + passhash_group_box_layout.addLayout(ph_name_group) + ph_name_group.addWidget(QLabel("Base64 key string:", self)) + self.cc_ledit = QLineEdit("", self) + self.cc_ledit.setToolTip(_("

Enter the Base64 key string

")) + ph_name_group.addWidget(self.cc_ledit) + + self.button_box.hide() + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept_b64_passhash) + self.button_box.rejected.connect(self.reject) + self.layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + + def add_fields_for_passhash(self): + + self.passhash_group_box = QGroupBox("", self) + passhash_group_box_layout = QVBoxLayout() + self.passhash_group_box.setLayout(passhash_group_box_layout) + + self.layout.addWidget(self.passhash_group_box) + + ph_key_name_group = QHBoxLayout() + passhash_group_box_layout.addLayout(ph_key_name_group) + ph_key_name_group.addWidget(QLabel("Unique Key Name:", self)) + self.key_ledit = QLineEdit("", self) + self.key_ledit.setToolTip(_("

Enter an identifying name for this new key.

" + + "

It should be something that will help you remember " + + "what personal information was used to create it.")) + ph_key_name_group.addWidget(self.key_ledit) + + ph_name_group = QHBoxLayout() + passhash_group_box_layout.addLayout(ph_name_group) + ph_name_group.addWidget(QLabel("Username:", self)) self.name_ledit = QLineEdit("", self) - self.name_ledit.setToolTip(_("

Enter your email address as it appears in your B&N " + - "account.

" + - "

It will only be used to generate this " + - "key and won\'t be stored anywhere " + - "in calibre or on your computer.

" + - "

eg: apprenticeharper@gmail.com

")) - name_group.addWidget(self.name_ledit) - name_disclaimer_label = QLabel(_("(Will not be saved in configuration data)"), self) - name_disclaimer_label.setAlignment(Qt.AlignHCenter) - data_group_box_layout.addWidget(name_disclaimer_label) + self.name_ledit.setToolTip(_("

Enter the PassHash username

")) + ph_name_group.addWidget(self.name_ledit) - ccn_group = QHBoxLayout() - data_group_box_layout.addLayout(ccn_group) - ccn_group.addWidget(QLabel("B&N/nook account password:", self)) + ph_pass_group = QHBoxLayout() + passhash_group_box_layout.addLayout(ph_pass_group) + ph_pass_group.addWidget(QLabel("Password:", self)) self.cc_ledit = QLineEdit("", self) - self.cc_ledit.setToolTip(_("

Enter the password " + - "for your B&N account.

" + - "

The password will only be used to generate this " + - "key and won\'t be stored anywhere in " + - "calibre or on your computer.")) - ccn_group.addWidget(self.cc_ledit) - ccn_disclaimer_label = QLabel(_('(Will not be saved in configuration data)'), self) - ccn_disclaimer_label.setAlignment(Qt.AlignHCenter) - data_group_box_layout.addWidget(ccn_disclaimer_label) - layout.addSpacing(10) + self.cc_ledit.setToolTip(_("

Enter the PassHash password

")) + ph_pass_group.addWidget(self.cc_ledit) - self.chkOldAlgo = QCheckBox(_("Try to use the old algorithm")) - self.chkOldAlgo.setToolTip(_("Leave this off if you're unsure.")) - data_group_box_layout.addWidget(self.chkOldAlgo) - layout.addSpacing(10) + self.button_box.hide() + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept_passhash) + self.button_box.rejected.connect(self.reject) + self.layout.addWidget(self.button_box) - key_group = QHBoxLayout() - data_group_box_layout.addLayout(key_group) - key_group.addWidget(QLabel("Retrieved key:", self)) - self.key_display = QLabel("", self) - self.key_display.setToolTip(_("Click the Retrieve Key button to fetch your B&N encryption key from the B&N servers")) - key_group.addWidget(self.key_display) - self.retrieve_button = QtGui.QPushButton(self) - self.retrieve_button.setToolTip(_("Click to retrieve your B&N encryption key from the B&N servers")) - self.retrieve_button.setText("Retrieve Key") - self.retrieve_button.clicked.connect(self.retrieve_key) - key_group.addWidget(self.retrieve_button) - layout.addSpacing(10) + self.resize(self.sizeHint()) - self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) - self.button_box.accepted.connect(self.accept) + + + def __init__(self, parent=None,): + QDialog.__init__(self, parent) + self.parent = parent + self.setWindowTitle("{0} {1}: Create New PassHash (B&N) Key".format(PLUGIN_NAME, PLUGIN_VERSION)) + self.layout = QVBoxLayout(self) + self.setLayout(self.layout) + + self.cbType = QComboBox() + self.cbType.addItem("--- Select key type ---") + self.cbType.addItem("Adobe PassHash username & password") + self.cbType.addItem("Base64-encoded PassHash key string") + self.cbType.addItem("Extract key from Nook Windows application") + self.cbType.addItem("Extract key from Nook Android application") + self.cbType.currentIndexChanged.connect(self.update_form, self.cbType.currentIndex()) + self.layout.addWidget(self.cbType) + + self.button_box = QDialogButtonBox(QDialogButtonBox.Cancel) self.button_box.rejected.connect(self.reject) - layout.addWidget(self.button_box) + self.layout.addWidget(self.button_box) self.resize(self.sizeHint()) @@ -648,7 +742,7 @@ def key_name(self): @property def key_value(self): - return str(self.key_display.text()).strip() + return self.result_data @property def user_name(self): @@ -658,40 +752,108 @@ def user_name(self): def cc_number(self): return str(self.cc_ledit.text()).strip() - def retrieve_key(self): - - if self.chkOldAlgo.isChecked(): - # old method, try to generate - from calibre_plugins.dedrm.ignoblekeygen import generate_key as generate_bandn_key - generated_key = generate_bandn_key(self.user_name, self.cc_number) - if generated_key == "": - errmsg = "Could not generate key." - error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - else: - self.key_display.setText(generated_key.decode("latin-1")) + def accept_android_nook(self): + + if len(self.key_name) < 4: + errmsg = "Key name must be at least 4 characters long!" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + path_to_ade_data = self.cc_number + + if (os.path.isfile(os.path.join(path_to_ade_data, ".adobe-digital-editions", "activation.xml"))): + path_to_ade_data = os.path.join(path_to_ade_data, ".adobe-digital-editions") + elif (os.path.isfile(os.path.join(path_to_ade_data, "activation.xml"))): + pass else: - # New method, try to connect to server - from calibre_plugins.dedrm.ignoblekeyfetch import fetch_key as fetch_bandn_key - fetched_key = fetch_bandn_key(self.user_name,self. cc_number) - if fetched_key == "": - errmsg = "Could not retrieve key. Check username, password and intenet connectivity and try again." - error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - else: - self.key_display.setText(fetched_key) + errmsg = "This isn't the correct path, or the data is invalid." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - def accept(self): + from calibre_plugins.dedrm.ignoblekeyAndroid import dump_keys + store_result = dump_keys(path_to_ade_data) + + if len(store_result) == 0: + errmsg = "Failed to extract keys. Is this the correct folder?" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + self.result_data = store_result[0] + QDialog.accept(self) + + + + + def accept_win_nook(self): + + if len(self.key_name) < 4: + errmsg = "Key name must be at least 4 characters long!" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + try: + from calibre_plugins.dedrm.ignoblekeyWindowsStore import dump_keys + store_result = dump_keys(False) + except: + errmsg = "Failed to import from Nook Microsoft Store app." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + if len(store_result) == 0: + # Nothing found, try the Nook Study app + from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys + store_result = nookkeys() + + # Take the first key we found. In the future it might be a good idea to import them all, + # but with how the import dialog is currently structured that's not easily possible. + if len(store_result) > 0: + self.result_data = store_result[0] + QDialog.accept(self) + return + + # Okay, we didn't find anything. How do we get rid of the window? + errmsg = "Didn't find any Nook keys in the Windows app." + error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + QDialog.reject(self) + + + def accept_b64_passhash(self): + if len(self.key_name) == 0 or len(self.cc_number) == 0 or self.key_name.isspace() or self.cc_number.isspace(): + errmsg = "All fields are required!" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + if len(self.key_name) < 4: + errmsg = "Key name must be at least 4 characters long!" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + try: + x = base64.b64decode(self.cc_number) + except: + errmsg = "Key data is no valid base64 string!" + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + + self.result_data = self.cc_number + QDialog.accept(self) + + def accept_passhash(self): if len(self.key_name) == 0 or len(self.user_name) == 0 or len(self.cc_number) == 0 or self.key_name.isspace() or self.user_name.isspace() or self.cc_number.isspace(): errmsg = "All fields are required!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) if len(self.key_name) < 4: errmsg = "Key name must be at least 4 characters long!" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - if len(self.key_value) == 0: - self.retrieve_key() - if len(self.key_value) == 0: - return + + try: + from calibre_plugins.dedrm.ignoblekeyGenPassHash import generate_key + self.result_data = generate_key(self.user_name, self.cc_number) + except: + errmsg = "Key generation failed." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + if len(self.result_data) == 0: + errmsg = "Key generation failed." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + QDialog.accept(self) + + class AddEReaderDialog(QDialog): def __init__(self, parent=None,): QDialog.__init__(self, parent) diff --git a/DeDRM_plugin/ignoblekeyAndroid.py b/DeDRM_plugin/ignoblekeyAndroid.py new file mode 100644 index 00000000..2b3f0ecf --- /dev/null +++ b/DeDRM_plugin/ignoblekeyAndroid.py @@ -0,0 +1,65 @@ +''' +Extracts the user's ccHash from an .adobe-digital-editions folder +typically included in the Nook Android app's data folder. + +Based on ignoblekeyWindowsStore.py, updated for Android by noDRM. +''' + +import sys +import os +import base64 +try: + from Cryptodome.Cipher import AES +except: + from Crypto.Cipher import AES +import hashlib +from lxml import etree + + +PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" + +def unpad(data): + + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + +def dump_keys(path_to_adobe_folder): + + activation_path = os.path.join(path_to_adobe_folder, "activation.xml") + device_path = os.path.join(path_to_adobe_folder, "device.xml") + + if not os.path.isfile(activation_path): + print("Nook activation file is missing: %s\n" % activation_path) + return [] + if not os.path.isfile(device_path): + print("Nook device file is missing: %s\n" % device_path) + return [] + + # Load files: + activation_xml = etree.parse(activation_path) + device_xml = etree.parse(device_path) + + # Get fingerprint: + device_fingerprint = device_xml.findall(".//{http://ns.adobe.com/adept}fingerprint")[0].text + device_fingerprint = base64.b64decode(device_fingerprint).hex() + + hash_key = hashlib.sha1(bytearray.fromhex(device_fingerprint + PASS_HASH_SECRET)).digest()[:16] + + hashes = [] + + for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): + encrypted_cc_hash = base64.b64decode(pass_hash.text) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + hashes.append(base64.b64encode(cc_hash).decode("ascii")) + #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + + return hashes + + + +if __name__ == "__main__": + print("No standalone version available.") diff --git a/DeDRM_plugin/ignoblekeygen.py b/DeDRM_plugin/ignoblekeyGenPassHash.py similarity index 99% rename from DeDRM_plugin/ignoblekeygen.py rename to DeDRM_plugin/ignoblekeyGenPassHash.py index 58935536..cb6d208a 100644 --- a/DeDRM_plugin/ignoblekeygen.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# ignoblekeygen.py +# ignoblekeyGenPassHash.py # Copyright © 2009-2020 i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 diff --git a/DeDRM_plugin/ignoblekey.py b/DeDRM_plugin/ignoblekeyNookStudy.py similarity index 100% rename from DeDRM_plugin/ignoblekey.py rename to DeDRM_plugin/ignoblekeyNookStudy.py diff --git a/DeDRM_plugin/ignoblekeyWindowsStore.py b/DeDRM_plugin/ignoblekeyWindowsStore.py new file mode 100644 index 00000000..919d2e67 --- /dev/null +++ b/DeDRM_plugin/ignoblekeyWindowsStore.py @@ -0,0 +1,75 @@ +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +''' +Obtain the user's ccHash from the Barnes & Noble Nook Windows Store app. +https://www.microsoft.com/en-us/p/nook-books-magazines-newspapers-comics/9wzdncrfj33h +(Requires a recent Windows version in a supported region (US).) +This procedure has been tested with Nook app version 1.11.0.4 under Windows 11. + +Based on experimental standalone python script created by fesiwi at +https://github.com/noDRM/DeDRM_tools/discussions/9 +''' + +import sys, os +import apsw +import base64 +try: + from Cryptodome.Cipher import AES +except: + from Crypto.Cipher import AES +import hashlib +from lxml import etree + + +NOOK_DATA_FOLDER = "%LOCALAPPDATA%\\Packages\\BarnesNoble.Nook_ahnzqzva31enc\\LocalState" +PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" + +def unpad(data): + + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + + +def dump_keys(print_result=False): + db_filename = os.path.expandvars(NOOK_DATA_FOLDER + "\\NookDB.db3") + + + if not os.path.isfile(db_filename): + print("Database file not found. Is the Nook Windows Store app installed?") + return [] + + + # Python2 has no fetchone() so we have to use fetchall() and discard everything but the first result. + # There should only be one result anyways. + serial_number = apsw.Connection(db_filename).cursor().execute( + "SELECT value FROM bn_internal_key_value_table WHERE key = 'serialNumber';").fetchall()[0][0] + + + hash_key = hashlib.sha1(bytearray.fromhex(serial_number + PASS_HASH_SECRET)).digest()[:16] + + activation_file_name = os.path.expandvars(NOOK_DATA_FOLDER + "\\settings\\activation.xml") + + if not os.path.isfile(activation_file_name): + print("Activation file not found. Are you logged in to your Nook account?") + return [] + + + activation_xml = etree.parse(activation_file_name) + + decrypted_hashes = [] + + for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): + encrypted_cc_hash = base64.b64decode(pass_hash.text) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + decrypted_hashes.append((base64.b64encode(cc_hash).decode("ascii"))) + if print_result: + print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + + return decrypted_hashes + +if __name__ == "__main__": + dump_keys(True) diff --git a/DeDRM_plugin/ignoblekeyfetch.py b/DeDRM_plugin/ignoblekeyfetch.py index 25c18f62..278879b1 100644 --- a/DeDRM_plugin/ignoblekeyfetch.py +++ b/DeDRM_plugin/ignoblekeyfetch.py @@ -25,7 +25,12 @@ # 2.0 - Python 3 for calibre 5.0 """ -Fetch Barnes & Noble EPUB user key from B&N servers using email and password +Fetch Barnes & Noble EPUB user key from B&N servers using email and password. + +NOTE: This script used to work in the past, but the server it uses is long gone. +It can no longer be used to download keys from B&N servers, it is no longer +supported by the Calibre plugin, and it will be removed in the future. + """ __license__ = 'GPL v3' diff --git a/DeDRM_plugin/ignoblepdf.py b/DeDRM_plugin/ignoblepdf.py deleted file mode 100644 index 1e6d66ae..00000000 --- a/DeDRM_plugin/ignoblepdf.py +++ /dev/null @@ -1,2199 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - -# ignoblepdf.py -# Copyright © 2009-2020 by Apprentice Harper et al. - -# Released under the terms of the GNU General Public Licence, version 3 -# - -# Based on version 8.0.6 of ineptpdf.py - - -# Revision history: -# 0.1 - Initial alpha testing release 2020 by Pu D. Pud -# 0.2 - Python 3 for calibre 5.0 (in testing) -# 0.3 - More Python3 fixes - - -""" -Decrypts Barnes & Noble encrypted PDF files. -""" - -__license__ = 'GPL v3' -__version__ = "0.3" - -import codecs -import sys -import os -import re -import zlib -import struct -import hashlib -from io import BytesIO -from decimal import Decimal -import itertools -import xml.etree.ElementTree as etree - -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -iswindows = sys.platform.startswith('win') -isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - return ["ignoblepdf.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - - -class IGNOBLEError(Exception): - pass - - -import hashlib - -def SHA256(message): - ctx = hashlib.sha256() - ctx.update(message) - return ctx.digest() - - -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if sys.platform.startswith('win'): - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise IGNOBLEError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - class RC4_KEY(Structure): - _fields_ = [('x', c_int), ('y', c_int), ('box', c_int * 256)] - RC4_KEY_p = POINTER(RC4_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', - [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, - c_int]) - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', - [c_char_p, c_int, AES_KEY_p]) - - RC4_set_key = F(None,'RC4_set_key',[RC4_KEY_p, c_int, c_char_p]) - RC4_crypt = F(None,'RC4',[RC4_KEY_p, c_int, c_char_p, c_char_p]) - - class ARC4(object): - @classmethod - def new(cls, userkey): - self = ARC4() - self._blocksize = len(userkey) - key = self._key = RC4_KEY() - RC4_set_key(key, self._blocksize, userkey) - return self - def __init__(self): - self._blocksize = 0 - self._key = None - def decrypt(self, data): - out = create_string_buffer(len(data)) - RC4_crypt(self._key, len(data), data, out) - return out.raw - - class AES(object): - MODE_CBC = 0 - @classmethod - def new(cls, userkey, mode, iv): - self = AES() - self._blocksize = len(userkey) - # mode is ignored since CBCMODE is only thing supported/used so far - self._mode = mode - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise IGNOBLEError('AES improper key used') - return - keyctx = self._keyctx = AES_KEY() - self._iv = iv - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) - if rv < 0: - raise IGNOBLEError('Failed to initialize AES key') - return self - def __init__(self): - self._blocksize = 0 - self._keyctx = None - self._iv = 0 - self._mode = 0 - def decrypt(self, data): - out = create_string_buffer(len(data)) - rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 0) - if rv == 0: - raise IGNOBLEError('AES decryption failed') - return out.raw - - return (ARC4, AES) - - -def _load_crypto_pycrypto(): - from Crypto.Cipher import ARC4 as _ARC4 - from Crypto.Cipher import AES as _AES - - class ARC4(object): - @classmethod - def new(cls, userkey): - self = ARC4() - self._arc4 = _ARC4.new(userkey) - return self - def __init__(self): - self._arc4 = None - def decrypt(self, data): - return self._arc4.decrypt(data) - - class AES(object): - MODE_CBC = _AES.MODE_CBC - @classmethod - def new(cls, userkey, mode, iv): - self = AES() - self._aes = _AES.new(userkey, mode, iv) - return self - def __init__(self): - self._aes = None - def decrypt(self, data): - return self._aes.decrypt(data) - - return (ARC4, AES) - -def _load_crypto(): - ARC4 = AES = None - cryptolist = (_load_crypto_libcrypto, _load_crypto_pycrypto) - if sys.platform.startswith('win'): - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - ARC4, AES = loader() - break - except (ImportError, IGNOBLEError): - pass - return (ARC4, AES) -ARC4, AES = _load_crypto() - - - - -# Do we generate cross reference streams on output? -# 0 = never -# 1 = only if present in input -# 2 = always - -GEN_XREF_STM = 1 - -# This is the value for the current document -gen_xref_stm = False # will be set in PDFSerializer - -# PDF parsing routines from pdfminer, with changes for EBX_HANDLER - -# Utilities - -def choplist(n, seq): - '''Groups every n elements of the list.''' - r = [] - for x in seq: - r.append(x) - if len(r) == n: - yield tuple(r) - r = [] - return - -def nunpack(s, default=0): - '''Unpacks up to 4 bytes big endian.''' - l = len(s) - if not l: - return default - elif l == 1: - return ord(s) - elif l == 2: - return struct.unpack('>H', s)[0] - elif l == 3: - return struct.unpack('>L', bytes([0]) + s)[0] - elif l == 4: - return struct.unpack('>L', s)[0] - else: - return TypeError('invalid length: %d' % l) - - -STRICT = 0 - - -# PS Exceptions - -class PSException(Exception): pass -class PSEOF(PSException): pass -class PSSyntaxError(PSException): pass -class PSTypeError(PSException): pass -class PSValueError(PSException): pass - - -# Basic PostScript Types - - -# PSLiteral -class PSObject(object): pass - -class PSLiteral(PSObject): - ''' - PS literals (e.g. "/Name"). - Caution: Never create these objects directly. - Use PSLiteralTable.intern() instead. - ''' - def __init__(self, name): - self.name = name.decode('utf-8') - return - - def __repr__(self): - name = [] - for char in self.name: - if not char.isalnum(): - char = '#%02x' % ord(char) - name.append(char) - return '/%s' % ''.join(name) - -# PSKeyword -class PSKeyword(PSObject): - ''' - PS keywords (e.g. "showpage"). - Caution: Never create these objects directly. - Use PSKeywordTable.intern() instead. - ''' - def __init__(self, name): - self.name = name.decode('utf-8') - return - - def __repr__(self): - return self.name - -# PSSymbolTable -class PSSymbolTable(object): - - ''' - Symbol table that stores PSLiteral or PSKeyword. - ''' - - def __init__(self, classe): - self.dic = {} - self.classe = classe - return - - def intern(self, name): - if name in self.dic: - lit = self.dic[name] - else: - lit = self.classe(name) - self.dic[name] = lit - return lit - -PSLiteralTable = PSSymbolTable(PSLiteral) -PSKeywordTable = PSSymbolTable(PSKeyword) -LIT = PSLiteralTable.intern -KWD = PSKeywordTable.intern -KEYWORD_BRACE_BEGIN = KWD(b'{') -KEYWORD_BRACE_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): - if STRICT: - raise PSTypeError('Literal required: %r' % x) - else: - return str(x) - return x.name - -def keyword_name(x): - if not isinstance(x, PSKeyword): - if STRICT: - raise PSTypeError('Keyword required: %r' % x) - else: - return str(x) - return x.name - - -## 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'[()\\]') -OCT_STRING = re.compile(br'[0-7]') -ESC_STRING = { b'b':8, b't':9, b'n':10, b'f':12, b'r':13, b'(':40, b')':41, b'\\':92 } - -class PSBaseParser(object): - - ''' - Most basic PostScript parser that performs only basic tokenization. - ''' - BUFSIZ = 4096 - - def __init__(self, fp): - self.fp = fp - self.seek(0) - return - - def __repr__(self): - return '' % (self.fp, self.bufpos) - - def flush(self): - return - - def close(self): - self.flush() - 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) - # print('poll(%d): %r' % (pos, self.fp.read(n)), file=sys.stderr) - self.fp.seek(pos0) - return - - def seek(self, pos): - ''' - Seeks the parser to the given position. - ''' - 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.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 parse_main(self, s, i): - m = NONSPC.search(s, i) - if not m: - return (self.parse_main, len(s)) - j = m.start(0) - if isinstance(s[j], str): - # Python 2 - c = s[j] - else: - # Python 3 - c = bytes([s[j]]) - self.tokenstart = self.bufpos+j - if c == b'%': - self.token = c - return (self.parse_comment, j+1) - if c == b'/': - self.token = b'' - return (self.parse_literal, j+1) - if c in b'-+' or c.isdigit(): - self.token = c - return (self.parse_number, j+1) - if c == b'.': - self.token = c - return (self.parse_decimal, j+1) - if c.isalpha(): - self.token = c - return (self.parse_keyword, j+1) - if c == b'(': - self.token = b'' - self.paren = 1 - return (self.parse_string, j+1) - if c == b'<': - self.token = b'' - return (self.parse_wopen, j+1) - if c == b'>': - self.token = b'' - return (self.parse_wclose, j+1) - self.add_token(KWD(c)) - return (self.parse_main, j+1) - - def add_token(self, obj): - self.tokens.append((self.tokenstart, obj)) - return - - def parse_comment(self, s, i): - m = EOL.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_comment, len(s)) - j = m.start(0) - self.token += s[i:j] - # We ignore comments. - #self.tokens.append(self.token) - return (self.parse_main, j) - - def parse_literal(self, s, i): - m = END_LITERAL.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_literal, len(s)) - j = m.start(0) - self.token += s[i:j] - if isinstance(s[j], str): - c = s[j] - else: - c = bytes([s[j]]) - if c == b'#': - self.hex = b'' - return (self.parse_literal_hex, j+1) - self.add_token(PSLiteralTable.intern(self.token)) - return (self.parse_main, j) - - def parse_literal_hex(self, s, i): - if isinstance(s[i], str): - c = s[i] - else: - c = bytes([s[i]]) - if HEX.match(c) and len(self.hex) < 2: - self.hex += c - return (self.parse_literal_hex, i+1) - if self.hex: - self.token += bytes([int(self.hex, 16)]) - return (self.parse_literal, i) - - def parse_number(self, s, i): - m = END_NUMBER.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_number, len(s)) - j = m.start(0) - self.token += s[i:j] - if isinstance(s[j], str): - c = s[j] - else: - c = bytes([s[j]]) - if c == b'.': - self.token += c - return (self.parse_decimal, j+1) - try: - self.add_token(int(self.token)) - except ValueError: - pass - return (self.parse_main, j) - - def parse_decimal(self, s, i): - m = END_NUMBER.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_decimal, len(s)) - j = m.start(0) - self.token += s[i:j] - self.add_token(Decimal(self.token.decode('utf-8'))) - return (self.parse_main, j) - - def parse_keyword(self, s, i): - m = END_KEYWORD.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_keyword, len(s)) - j = m.start(0) - self.token += s[i:j] - if self.token == 'true': - token = True - elif self.token == 'false': - token = False - else: - token = KWD(self.token) - self.add_token(token) - return (self.parse_main, j) - - def parse_string(self, s, i): - m = END_STRING.search(s, i) - if not m: - self.token += s[i:] - return (self.parse_string, len(s)) - j = m.start(0) - self.token += s[i:j] - if isinstance(s[j], str): - c = s[j] - else: - c = bytes([s[j]]) - if c == b'\\': - self.oct = '' - return (self.parse_string_1, j+1) - if c == b'(': - self.paren += 1 - self.token += c - return (self.parse_string, j+1) - if c == b')': - self.paren -= 1 - if self.paren: - self.token += c - return (self.parse_string, j+1) - self.add_token(self.token) - return (self.parse_main, j+1) - def parse_string_1(self, s, i): - if isinstance(s[i], str): - c = s[i] - else: - c = bytes([s[i]]) - if OCT_STRING.match(c) and len(self.oct) < 3: - self.oct += c - return (self.parse_string_1, i+1) - if self.oct: - self.token += bytes([int(self.oct, 8)]) - return (self.parse_string, i) - if c in ESC_STRING: - self.token += bytes([ESC_STRING[c]]) - return (self.parse_string, i+1) - - def parse_wopen(self, s, i): - if isinstance(s[i], str): - c = s[i] - else: - c = bytes([s[i]]) - if c.isspace() or HEX.match(c): - return (self.parse_hexstring, i) - if c == b'<': - self.add_token(KEYWORD_DICT_BEGIN) - i += 1 - return (self.parse_main, i) - - def parse_wclose(self, s, i): - if isinstance(s[i], str): - c = s[i] - else: - c = bytes([s[i]]) - if c == b'>': - self.add_token(KEYWORD_DICT_END) - i += 1 - return (self.parse_main, i) - - def parse_hexstring(self, s, i): - m1 = END_HEX_STRING.search(s, i) - if not m1: - self.token += s[i:] - return (self.parse_hexstring, len(s)) - j = m1.start(0) - self.token += s[i:j] - token = HEX_PAIR.sub(lambda m2: bytes([int(m2.group(0), 16)]), - SPC.sub(b'', self.token)) - self.add_token(token) - return (self.parse_main, j) - - def nexttoken(self): - while not self.tokens: - self.fillbuf() - (self.parse1, self.charpos) = self.parse1(self.buf, self.charpos) - token = self.tokens.pop(0) - return token - - 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 = bytes([self.buf[self.charpos]]) - # handle '\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 bytes([linebuf[-1]]) == b'\r': - eol = True - else: - break - else: - linebuf += self.buf[self.charpos:] - self.charpos = len(self.buf) - return (linepos, linebuf) - - def revreadlines(self): - ''' - Fetches a next line backword. 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 - - -## 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 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): - self.results.extend(objs) - return - - def start_type(self, pos, type): - self.context.append((pos, self.curtype, self.curstack)) - (self.curtype, self.curstack) = (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 ] - (pos, self.curtype, self.curstack) = self.context.pop() - return (pos, objs) - - def do_keyword(self, pos, token): - return - - def nextobject(self, direct=False): - ''' - Yields a list of objects: keywords, literals, strings (byte arrays), - numbers, arrays and dictionaries. Arrays and dictionaries - are represented as Python sequence and dictionaries. - ''' - while not self.results: - (pos, token) = self.nexttoken() - # print((pos, token), (self.curtype, self.curstack)) - if (isinstance(token, int) or - isinstance(token, Decimal) or - isinstance(token, bool) or - isinstance(token, bytearray) or - isinstance(token, bytes) or - isinstance(token, str) or - isinstance(token, PSLiteral)): - # normal token - self.push((pos, token)) - elif token == KEYWORD_ARRAY_BEGIN: - # begin array - self.start_type(pos, 'a') - elif token == KEYWORD_ARRAY_END: - # end array - try: - self.push(self.end_type('a')) - except PSTypeError: - if STRICT: raise - elif token == KEYWORD_DICT_BEGIN: - # begin dictionary - self.start_type(pos, 'd') - elif token == KEYWORD_DICT_END: - # end dictionary - try: - (pos, objs) = self.end_type('d') - if len(objs) % 2 != 0: - print("Incomplete dictionary construct") - objs.append("") # this isn't necessary. - # temporary fix. is this due to rental books? - # raise PSSyntaxError( - # 'Invalid dictionary construct: %r' % objs) - d = dict((literal_name(k), v) \ - for (k,v) in choplist(2, objs)) - self.push((pos, d)) - except PSTypeError: - if STRICT: raise - else: - self.do_keyword(pos, token) - if self.context: - continue - else: - if direct: - return self.pop(1)[0] - self.flush() - obj = self.results.pop(0) - return obj - - -LITERAL_CRYPT = PSLiteralTable.intern(b'Crypt') -LITERALS_FLATE_DECODE = (PSLiteralTable.intern(b'FlateDecode'), PSLiteralTable.intern(b'Fl')) -LITERALS_LZW_DECODE = (PSLiteralTable.intern(b'LZWDecode'), PSLiteralTable.intern(b'LZW')) -LITERALS_ASCII85_DECODE = (PSLiteralTable.intern(b'ASCII85Decode'), PSLiteralTable.intern(b'A85')) - - -## PDF Objects -## -class PDFObject(PSObject): pass - -class PDFException(PSException): pass -class PDFTypeError(PDFException): pass -class PDFValueError(PDFException): pass -class PDFNotImplementedError(PSException): pass - - -## PDFObjRef -## -class PDFObjRef(PDFObject): - - def __init__(self, doc, objid, genno): - if objid == 0: - if STRICT: - raise PDFValueError('PDF object id cannot be 0.') - self.doc = doc - self.objid = objid - self.genno = genno - return - - def __repr__(self): - return '' % (self.objid, self.genno) - - def resolve(self): - return self.doc.getobj(self.objid) - - -# resolve -def resolve1(x): - ''' - Resolve an object. If this is an array or dictionary, - it may still contains some indirect objects inside. - ''' - while isinstance(x, PDFObjRef): - x = x.resolve() - return x - -def resolve_all(x): - ''' - Recursively resolve X 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() - if isinstance(x, list): - x = [ resolve_all(v) for v in x ] - elif isinstance(x, dict): - for (k,v) in iter(x.items()): - x[k] = resolve_all(v) - return x - -def decipher_all(decipher, objid, genno, x): - ''' - Recursively decipher X. - ''' - if isinstance(x, bytearray) or isinstance(x,bytes) or isinstance(x,str): - return decipher(objid, genno, x) - decf = lambda v: decipher_all(decipher, objid, genno, v) - if isinstance(x, list): - x = [decf(v) for v in x] - elif isinstance(x, dict): - x = dict((k, decf(v)) for (k, v) in iter(x.items())) - return x - - -# Type cheking -def int_value(x): - x = resolve1(x) - if not isinstance(x, int): - if STRICT: - raise PDFTypeError('Integer required: %r' % x) - return 0 - return x - -def decimal_value(x): - x = resolve1(x) - if not isinstance(x, Decimal): - if STRICT: - raise PDFTypeError('Decimal required: %r' % x) - return 0.0 - return x - -def num_value(x): - x = resolve1(x) - if not (isinstance(x, int) or isinstance(x, Decimal)): - if STRICT: - raise PDFTypeError('Int or Float required: %r' % x) - return 0 - return x - -def str_value(x): - x = resolve1(x) - if not (isinstance(x, bytearray) or isinstance(x, bytes) or isinstance(x, str)): - if STRICT: - raise PDFTypeError('String required: %r' % x) - return '' - return x - -def list_value(x): - x = resolve1(x) - if not (isinstance(x, list) or isinstance(x, 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 - -def stream_value(x): - x = resolve1(x) - if not isinstance(x, PDFStream): - if STRICT: - raise PDFTypeError('PDFStream required: %r' % x) - return PDFStream({}, '') - return x - -# ascii85decode(data) -def ascii85decode(data): - n = b = 0 - out = b'' - for c in data: - if b'!' <= c and c <= b'u': - n += 1 - b = b*85+(c-33) - if n == 5: - out += struct.pack('>L',b) - n = b = 0 - elif c == b'z': - assert n == 0 - out += b'\0\0\0\0' - elif c == b'~': - if n: - for _ in range(5-n): - b = b*85+84 - out += struct.pack('>L',b)[:n-1] - break - return out - - -## PDFStream type -class PDFStream(PDFObject): - def __init__(self, dic, rawdata, decipher=None): - length = int_value(dic.get('Length', 0)) - eol = rawdata[length:] - # quick and dirty fix for false length attribute, - # might not work if the pdf stream parser has a problem - if decipher != None and decipher.__name__ == 'decrypt_aes': - if (len(rawdata) % 16) != 0: - cutdiv = len(rawdata) // 16 - rawdata = rawdata[:16*cutdiv] - else: - if eol in (b'\r', b'\n', b'\r\n'): - rawdata = rawdata[:length] - - self.dic = dic - self.rawdata = rawdata - self.decipher = decipher - self.data = None - self.decdata = 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.rawdata: - return '' % \ - (self.objid, len(self.rawdata), self.dic) - else: - return '' % \ - (self.objid, len(self.data), self.dic) - - def decode(self): - 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) - if gen_xref_stm: - self.decdata = data # keep decrypted data - if 'Filter' not in self.dic: - self.data = data - self.rawdata = None - ##print(self.dict) - return - filters = self.dic['Filter'] - if not isinstance(filters, list): - filters = [ filters ] - for f in filters: - if f in LITERALS_FLATE_DECODE: - # will get errors if the document is encrypted. - data = zlib.decompress(data) - elif f in LITERALS_LZW_DECODE: - data = b''.join(LZWDecoder(BytesIO(data)).run()) - elif f in LITERALS_ASCII85_DECODE: - data = ascii85decode(data) - elif f == LITERAL_CRYPT: - raise PDFNotImplementedError('/Crypt filter is unsupported') - else: - raise PDFNotImplementedError('Unsupported filter: %r' % f) - # apply predictors - if 'DP' in self.dic: - params = self.dic['DP'] - else: - params = self.dic.get('DecodeParms', {}) - if 'Predictor' in params: - pred = int_value(params['Predictor']) - if pred: - if pred != 12: - raise PDFNotImplementedError( - 'Unsupported predictor: %r' % pred) - if 'Columns' not in params: - raise PDFValueError( - 'Columns undefined for predictor=12') - columns = int_value(params['Columns']) - buf = b'' - ent0 = b'\x00' * columns - for i in range(0, len(data), columns+1): - pred = data[i] - ent1 = data[i+1:i+1+columns] - if pred == 2: - ent1 = b''.join(bytes([(a+b) & 255]) \ - for (a,b) in zip(ent0,ent1)) - buf += ent1 - ent0 = ent1 - data = buf - self.data = data - self.rawdata = None - return - - def get_data(self): - if self.data is None: - self.decode() - return self.data - - def get_rawdata(self): - return self.rawdata - - def get_decdata(self): - if self.decdata is not None: - return self.decdata - data = self.rawdata - if self.decipher and data: - # Handle encryption - data = self.decipher(self.objid, self.genno, data) - return data - - -## PDF Exceptions -## -class PDFSyntaxError(PDFException): pass -class PDFNoValidXRef(PDFSyntaxError): pass -class PDFEncryptionError(PDFException): pass -class PDFPasswordIncorrect(PDFEncryptionError): pass - -# some predefined literals and keywords. -LITERAL_OBJSTM = PSLiteralTable.intern(b'ObjStm') -LITERAL_XREF = PSLiteralTable.intern(b'XRef') -LITERAL_PAGE = PSLiteralTable.intern(b'Page') -LITERAL_PAGES = PSLiteralTable.intern(b'Pages') -LITERAL_CATALOG = PSLiteralTable.intern(b'Catalog') - - -## XRefs -## - -## PDFXRef -## -class PDFXRef(object): - - def __init__(self): - self.offsets = None - return - - def __repr__(self): - return '' % len(self.offsets) - - def objids(self): - return iter(self.offsets.keys()) - - def load(self, parser): - self.offsets = {} - while 1: - try: - (pos, line) = parser.nextline() - except PSEOF: - raise PDFNoValidXRef('Unexpected EOF - file corrupted?') - if not line: - raise PDFNoValidXRef('Premature eof: %r' % parser) - if line.startswith(b'trailer'): - parser.seek(pos) - break - f = line.strip().split(b' ') - if len(f) != 2: - raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) - try: - (start, nobjs) = 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(b' ') - if len(f) != 3: - raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) - (pos, genno, use) = f - if use != b'n': - continue - self.offsets[objid] = (int(genno.decode('utf-8')), int(pos.decode('utf-8'))) - self.load_trailer(parser) - return - - KEYWORD_TRAILER = PSKeywordTable.intern(b'trailer') - def load_trailer(self, parser): - try: - (_,kwd) = parser.nexttoken() - assert kwd is self.KEYWORD_TRAILER - (_,dic) = parser.nextobject(direct=True) - except PSEOF: - x = parser.pop(1) - if not x: - raise PDFNoValidXRef('Unexpected EOF - file corrupted') - (_,dic) = x[0] - self.trailer = dict_value(dic) - return - - def getpos(self, objid): - try: - (genno, pos) = self.offsets[objid] - except KeyError: - raise - return (None, pos) - - -## PDFXRefStream -## -class PDFXRefStream(object): - - def __init__(self): - self.index = None - self.data = None - self.entlen = None - self.fl1 = self.fl2 = self.fl3 = None - return - - def __repr__(self): - return '' % self.index - - def objids(self): - for first, size in self.index: - for objid in range(first, first + size): - yield objid - - def load(self, parser, debug=0): - (_,objid) = parser.nexttoken() # ignored - (_,genno) = parser.nexttoken() # ignored - (_,kwd) = parser.nexttoken() - (_,stream) = parser.nextobject() - if not isinstance(stream, PDFStream) or \ - stream.dic['Type'] is not LITERAL_XREF: - raise PDFNoValidXRef('Invalid PDF stream spec.') - size = stream.dic['Size'] - index = stream.dic.get('Index', (0,size)) - self.index = list(zip(itertools.islice(index, 0, None, 2), - itertools.islice(index, 1, None, 2))) - (self.fl1, self.fl2, self.fl3) = stream.dic['W'] - self.data = stream.get_data() - self.entlen = self.fl1+self.fl2+self.fl3 - self.trailer = stream.dic - return - - def getpos(self, objid): - offset = 0 - for first, size in self.index: - if first <= objid and objid < (first + size): - break - offset += size - else: - raise KeyError(objid) - i = self.entlen * ((objid - first) + 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) - - -## PDFDocument -## -## A PDFDocument object represents a PDF document. -## Since a PDF file is usually pretty big, normally it is not loaded -## at once. Rather it is parsed dynamically as processing goes. -## A PDF parser is associated with the document. -## -class PDFDocument(object): - - def __init__(self): - self.xrefs = [] - self.objs = {} - self.parsed_objs = {} - self.root = None - self.catalog = None - self.parser = None - self.encryption = None - self.decipher = None - return - - # set_parser(parser) - # Associates the document with an (already initialized) parser object. - def set_parser(self, parser): - if self.parser: - return - self.parser = parser - # The document is set to be temporarily ready during collecting - # all the basic information about the document, e.g. - # the header, the encryption information, and the access rights - # for the document. - self.ready = True - # 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.trailer - if not trailer: continue - - # If there's an encryption info, remember it. - if 'Encrypt' in trailer: - #assert not self.encryption - try: - self.encryption = (list_value(trailer['ID']), - dict_value(trailer['Encrypt'])) - # fix for bad files - except: - self.encryption = (b'ffffffffffffffffffffffffffffffffffff', - dict_value(trailer['Encrypt'])) - if 'Root' in trailer: - self.set_root(dict_value(trailer['Root'])) - break - else: - raise PDFSyntaxError('No /Root object! - Is this really a PDF?') - # The document is set to be non-ready again, until all the - # proper initialization (asking the password key and - # verifying the access permission, so on) is finished. - self.ready = False - return - - # set_root(root) - # Set the Root dictionary of the document. - # Each PDF file must have exactly one /Root dictionary. - def set_root(self, root): - self.root = root - self.catalog = dict_value(self.root) - if self.catalog.get('Type') is not LITERAL_CATALOG: - if STRICT: - raise PDFSyntaxError('Catalog not found!') - return - # initialize(password='') - # Perform the initialization with a given password. - # This step is mandatory even if there's no password associated - # with the document. - def initialize(self, password=b''): - if not self.encryption: - self.is_printable = self.is_modifiable = self.is_extractable = True - self.ready = True - raise PDFEncryptionError('Document is not encrypted.') - return - (docid, param) = self.encryption - type = literal_name(param['Filter']) - if type == 'Adobe.APS': - return self.initialize_adobe_ps(password, docid, param) - if type == 'Standard': - return self.initialize_standard(password, docid, param) - if type == 'EBX_HANDLER': - return self.initialize_ebx(password, docid, param) - raise PDFEncryptionError('Unknown filter: param=%r' % param) - - def initialize_adobe_ps(self, password, docid, param): - global KEYFILEPATH - self.decrypt_key = self.genkey_adobe_ps(param) - self.genkey = self.genkey_v4 - self.decipher = self.decrypt_aes - self.ready = True - return - - def genkey_adobe_ps(self, param): - # nice little offline principal keys dictionary - # global static principal key for German Onleihe / Bibliothek Digital - principalkeys = { b'bibliothek-digital.de': codecs.decode(b'rRwGv2tbpKov1krvv7PO0ws9S436/lArPlfipz5Pqhw=','base64')} - self.is_printable = self.is_modifiable = self.is_extractable = True - length = int_value(param.get('Length', 0)) // 8 - edcdata = str_value(param.get('EDCData')).decode('base64') - pdrllic = str_value(param.get('PDRLLic')).decode('base64') - pdrlpol = str_value(param.get('PDRLPol')).decode('base64') - edclist = [] - for pair in edcdata.split(b'\n'): - edclist.append(pair) - # principal key request - for key in principalkeys: - if key in pdrllic: - principalkey = principalkeys[key] - else: - raise IGNOBLEError('Cannot find principal key for this pdf') - shakey = SHA256(principalkey) - ivector = bytes(16) - plaintext = AES.new(shakey,AES.MODE_CBC,ivector).decrypt(edclist[9].decode('base64')) - if plaintext[-16:] != bytearray(b'\0x10')*16: - raise IGNOBLEError('Offlinekey cannot be decrypted, aborting ...') - pdrlpol = AES.new(plaintext[16:32],AES.MODE_CBC,edclist[2].decode('base64')).decrypt(pdrlpol) - if pdrlpol[-1] < 1 or pdrlpol[-1] > 16: - raise IGNOBLEError('Could not decrypt PDRLPol, aborting ...') - else: - cutter = -1 * pdrlpol[-1] - pdrlpol = pdrlpol[:cutter] - return plaintext[:16] - - PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ - b'\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' - # experimental aes pw support - def initialize_standard(self, password, docid, param): - # copy from a global variable - V = int_value(param.get('V', 0)) - if (V <=0 or V > 4): - 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']) - try: - EncMetadata = str_value(param['EncryptMetadata']) - except: - EncMetadata = b'True' - self.is_printable = bool(P & 4) - self.is_modifiable = bool(P & 8) - self.is_extractable = bool(P & 16) - self.is_annotationable = bool(P & 32) - self.is_formsenabled = bool(P & 256) - self.is_textextractable = bool(P & 512) - self.is_assemblable = bool(P & 1024) - self.is_formprintable = bool(P & 2048) - # Algorithm 3.2 - password = (password+self.PASSWORD_PADDING)[:32] # 1 - hash = hashlib.md5(password) # 2 - hash.update(O) # 3 - hash.update(struct.pack('= 3: - # Algorithm 3.5 - hash = hashlib.md5(self.PASSWORD_PADDING) # 2 - hash.update(docid[0]) # 3 - x = ARC4.new(key).decrypt(hash.digest()[:16]) # 4 - for i in range(1,19+1): - k = b''.join(bytes([c ^ i]) for c in key ) - x = ARC4.new(k).decrypt(x) - u1 = x+x # 32bytes total - if R == 2: - is_authenticated = (u1 == U) - else: - is_authenticated = (u1[:16] == U[:16]) - if not is_authenticated: - raise IGNOBLEError('Password is not correct.') - self.decrypt_key = key - # genkey method - if V == 1 or V == 2: - self.genkey = self.genkey_v2 - elif V == 3: - self.genkey = self.genkey_v3 - elif V == 4: - self.genkey = self.genkey_v2 - #self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 - # rc4 - if V != 4: - self.decipher = self.decipher_rc4 # XXX may be AES - # aes - elif V == 4 and length == 128: - self.decipher = self.decipher_aes - elif V == 4 and length == 256: - raise PDFNotImplementedError('AES256 encryption is currently unsupported') - self.ready = True - return - - def initialize_ebx(self, keyb64, docid, param): - self.is_printable = self.is_modifiable = self.is_extractable = True - key = keyb64.decode('base64')[:16] - aes = AES.new(key,AES.MODE_CBC,"\x00" * len(key)) - length = int_value(param.get('Length', 0)) / 8 - rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') - rights = zlib.decompress(rights, -15) - rights = etree.fromstring(rights) - expr = './/{http://ns.adobe.com/adept}encryptedKey' - bookkey = ''.join(rights.findtext(expr)).decode('base64') - bookkey = aes.decrypt(bookkey) - bookkey = bookkey[:-ord(bookkey[-1])] - # todo: Take a look at this. - # This seems to be the only function that's different between ignoblepdf and ineptpdf. - # A ton of useless duplicated code ..... - bookkey = bookkey[-16:] - ebx_V = int_value(param.get('V', 4)) - ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) - # added because of improper booktype / decryption book session key errors - if length > 0: - if len(bookkey) == length: - if ebx_V == 3: - V = 3 - else: - V = 2 - elif len(bookkey) == length + 1: - V = bookkey[0] - bookkey = bookkey[1:] - else: - print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) - print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % bookkey[0]) - raise IGNOBLEError('error decrypting book session key - mismatched length') - else: - # proper length unknown try with whatever you have - print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) - print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % bookkey[0]) - if ebx_V == 3: - V = 3 - else: - V = 2 - self.decrypt_key = bookkey - self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 - self.decipher = self.decrypt_rc4 - self.ready = True - return - - # genkey functions - def genkey_v2(self, objid, genno): - objid = struct.pack(' PDFObjStmRef.maxindex: - PDFObjStmRef.maxindex = index - - -## PDFParser -## -class PDFParser(PSStackParser): - - def __init__(self, doc, fp): - PSStackParser.__init__(self, fp) - self.doc = doc - self.doc.set_parser(self) - return - - def __repr__(self): - return '' - - KEYWORD_R = PSKeywordTable.intern(b'R') - KEYWORD_ENDOBJ = PSKeywordTable.intern(b'endobj') - KEYWORD_STREAM = PSKeywordTable.intern(b'stream') - KEYWORD_XREF = PSKeywordTable.intern(b'xref') - KEYWORD_STARTXREF = PSKeywordTable.intern(b'startxref') - def do_keyword(self, pos, token): - if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): - self.add_results(*self.pop(1)) - return - if token is self.KEYWORD_ENDOBJ: - self.add_results(*self.pop(4)) - return - - if token is self.KEYWORD_R: - # reference to indirect object - try: - ((_,objid), (_,genno)) = self.pop(2) - (objid, genno) = (int(objid), int(genno)) - obj = PDFObjRef(self.doc, objid, genno) - self.push((pos, obj)) - except PSSyntaxError: - pass - return - - if token is self.KEYWORD_STREAM: - # stream object - ((_,dic),) = self.pop(1) - dic = dict_value(dic) - try: - objlen = int_value(dic['Length']) - except KeyError: - if STRICT: - raise PDFSyntaxError('/Length is undefined: %r' % dic) - objlen = 0 - self.seek(pos) - try: - (_, line) = self.nextline() # 'stream' - except PSEOF: - if STRICT: - raise PDFSyntaxError('Unexpected EOF') - return - pos += len(line) - self.fp.seek(pos) - data = self.fp.read(objlen) - self.seek(pos+objlen) - while 1: - try: - (linepos, line) = self.nextline() - except PSEOF: - if STRICT: - raise PDFSyntaxError('Unexpected EOF') - break - if b'endstream' in line: - i = line.index(b'endstream') - objlen += i - data += line[:i] - break - objlen += len(line) - data += line - self.seek(pos+objlen) - obj = PDFStream(dic, data, self.doc.decipher) - self.push((pos, obj)) - return - - # others - self.push((pos, token)) - return - - def find_xref(self): - # search the last xref table by scanning the file backwards. - prev = None - for line in self.revreadlines(): - line = line.strip() - if line == b'startxref': break - if line: - prev = line - else: - raise PDFNoValidXRef('Unexpected EOF') - return int(prev) - - # read xref table - def read_xref_from(self, start, xrefs): - self.seek(start) - self.reset() - try: - (pos, token) = self.nexttoken() - except PSEOF: - raise PDFNoValidXRef('Unexpected EOF') - if isinstance(token, int): - # XRefStream: PDF-1.5 - if GEN_XREF_STM == 1: - global gen_xref_stm - gen_xref_stm = True - self.seek(pos) - self.reset() - xref = PDFXRefStream() - xref.load(self) - else: - if token is not self.KEYWORD_XREF: - raise PDFNoValidXRef('xref not found: pos=%d, token=%r' % - (pos, token)) - self.nextline() - xref = PDFXRef() - xref.load(self) - xrefs.append(xref) - trailer = xref.trailer - if 'XRefStm' in trailer: - pos = int_value(trailer['XRefStm']) - self.read_xref_from(pos, xrefs) - if 'Prev' in trailer: - # find previous xref - pos = int_value(trailer['Prev']) - self.read_xref_from(pos, xrefs) - return - - # read xref tables and trailers - def read_xref(self): - xrefs = [] - trailerpos = None - try: - pos = self.find_xref() - self.read_xref_from(pos, xrefs) - except PDFNoValidXRef: - # fallback - self.seek(0) - pat = re.compile(b'^(\\d+)\\s+(\\d+)\\s+obj\\b') - offsets = {} - xref = PDFXRef() - while 1: - try: - (pos, line) = self.nextline() - except PSEOF: - break - if line.startswith(b'trailer'): - trailerpos = pos # remember last trailer - m = pat.match(line) - if not m: continue - (objid, genno) = m.groups() - offsets[int(objid)] = (0, pos) - if not offsets: raise - xref.offsets = offsets - if trailerpos: - self.seek(trailerpos) - xref.load_trailer(self) - xrefs.append(xref) - return xrefs - -## PDFObjStrmParser -## -class PDFObjStrmParser(PDFParser): - - def __init__(self, data, doc): - PSStackParser.__init__(self, BytesIO(data)) - self.doc = doc - return - - def flush(self): - self.add_results(*self.popall()) - return - - KEYWORD_R = KWD(b'R') - def do_keyword(self, pos, token): - if token is self.KEYWORD_R: - # reference to indirect object - try: - ((_,objid), (_,genno)) = self.pop(2) - (objid, genno) = (int(objid), int(genno)) - obj = PDFObjRef(self.doc, objid, genno) - self.push((pos, obj)) - except PSSyntaxError: - pass - return - # others - self.push((pos, token)) - return - -### -### My own code, for which there is none else to blame - -class PDFSerializer(object): - def __init__(self, inf, userkey): - global GEN_XREF_STM, gen_xref_stm - gen_xref_stm = GEN_XREF_STM > 1 - self.version = inf.read(8) - inf.seek(0) - self.doc = doc = PDFDocument() - parser = PDFParser(doc, inf) - doc.initialize(userkey) - self.objids = objids = set() - for xref in reversed(doc.xrefs): - trailer = xref.trailer - for objid in xref.objids(): - objids.add(objid) - trailer = dict(trailer) - trailer.pop('Prev', None) - trailer.pop('XRefStm', None) - if 'Encrypt' in trailer: - objids.remove(trailer.pop('Encrypt').objid) - self.trailer = trailer - - def dump(self, outf): - self.outf = outf - self.write(self.version) - self.write(b'\n%\xe2\xe3\xcf\xd3\n') - doc = self.doc - objids = self.objids - xrefs = {} - maxobj = max(objids) - trailer = dict(self.trailer) - trailer['Size'] = maxobj + 1 - for objid in objids: - obj = doc.getobj(objid) - if isinstance(obj, PDFObjStmRef): - xrefs[objid] = obj - continue - if obj is not None: - try: - genno = obj.genno - except AttributeError: - genno = 0 - xrefs[objid] = (self.tell(), genno) - self.serialize_indirect(objid, obj) - startxref = self.tell() - - if not gen_xref_stm: - self.write(b'xref\n') - self.write(b'0 %d\n' % (maxobj + 1,)) - for objid in range(0, maxobj + 1): - if objid in xrefs: - # force the genno to be 0 - self.write(b"%010d 00000 n \n" % xrefs[objid][0]) - else: - self.write(b"%010d %05d f \n" % (0, 65535)) - - self.write(b'trailer\n') - self.serialize_object(trailer) - self.write(b'\nstartxref\n%d\n%%%%EOF' % startxref) - - else: # Generate crossref stream. - - # Calculate size of entries - maxoffset = max(startxref, maxobj) - maxindex = PDFObjStmRef.maxindex - fl2 = 2 - power = 65536 - while maxoffset >= power: - fl2 += 1 - power *= 256 - fl3 = 1 - power = 256 - while maxindex >= power: - fl3 += 1 - power *= 256 - - index = [] - first = None - prev = None - data = [] - # Put the xrefstream's reference in itself - startxref = self.tell() - maxobj += 1 - xrefs[maxobj] = (startxref, 0) - for objid in sorted(xrefs): - if first is None: - first = objid - elif objid != prev + 1: - index.extend((first, prev - first + 1)) - first = objid - prev = objid - objref = xrefs[objid] - if isinstance(objref, PDFObjStmRef): - f1 = 2 - f2 = objref.stmid - f3 = objref.index - else: - f1 = 1 - f2 = objref[0] - # we force all generation numbers to be 0 - # f3 = objref[1] - f3 = 0 - - data.append(struct.pack('>B', f1)) - data.append(struct.pack('>L', f2)[-fl2:]) - data.append(struct.pack('>L', f3)[-fl3:]) - index.extend((first, prev - first + 1)) - data = zlib.compress(b''.join(data)) - dic = {'Type': LITERAL_XREF, 'Size': prev + 1, 'Index': index, - 'W': [1, fl2, fl3], 'Length': len(data), - 'Filter': LITERALS_FLATE_DECODE[0], - 'Root': trailer['Root'],} - if 'Info' in trailer: - dic['Info'] = trailer['Info'] - xrefstm = PDFStream(dic, data) - self.serialize_indirect(maxobj, xrefstm) - self.write(b'startxref\n%d\n%%%%EOF' % startxref) - def write(self, data): - self.outf.write(data) - self.last = data[-1:] - - def tell(self): - return self.outf.tell() - - def escape_string(self, string): - string = string.replace(b'\\', b'\\\\') - string = string.replace(b'\n', b'\\n') - string = string.replace(b'(', b'\\(') - string = string.replace(b')', b'\\)') - return string - - def serialize_object(self, obj): - if isinstance(obj, dict): - # Correct malformed Mac OS resource forks for Stanza - if 'ResFork' in obj and 'Type' in obj and 'Subtype' not in obj \ - and isinstance(obj['Type'], int): - obj['Subtype'] = obj['Type'] - del obj['Type'] - # end - hope this doesn't have bad effects - self.write(b'<<') - for key, val in obj.items(): - self.write(str(PSLiteralTable.intern(key.encode('utf-8'))).encode('utf-8')) - self.serialize_object(val) - self.write(b'>>') - elif isinstance(obj, list): - self.write(b'[') - for val in obj: - self.serialize_object(val) - self.write(b']') - elif isinstance(obj, bytearray): - self.write(b'(%s)' % self.escape_string(obj)) - elif isinstance(obj, bytes): - self.write(b'(%s)' % self.escape_string(obj)) - elif isinstance(obj, str): - self.write(b'(%s)' % self.escape_string(obj.encode('utf-8'))) - elif isinstance(obj, bool): - if self.last.isalnum(): - self.write(b' ') - self.write(str(obj).lower().encode('utf-8')) - elif isinstance(obj, (int, long)): - if self.last.isalnum(): - self.write(b' ') - self.write(str(obj).encode('utf-8')) - elif isinstance(obj, Decimal): - if self.last.isalnum(): - self.write(b' ') - self.write(str(obj).encode('utf-8')) - elif isinstance(obj, PDFObjRef): - if self.last.isalnum(): - self.write(b' ') - self.write(b'%d %d R' % (obj.objid, 0)) - elif isinstance(obj, PDFStream): - ### If we don't generate cross ref streams the object streams - ### are no longer useful, as we have extracted all objects from - ### them. Therefore leave them out from the output. - if obj.dic.get('Type') == LITERAL_OBJSTM and not gen_xref_stm: - self.write('(deleted)') - else: - data = obj.get_decdata() - self.serialize_object(obj.dic) - self.write(b'stream\n') - self.write(data) - self.write(b'\nendstream') - else: - data = str(obj).encode('utf-8') - if bytes([data[0]]).isalnum() and self.last.isalnum(): - self.write(b' ') - self.write(data) - - def serialize_indirect(self, objid, obj): - self.write(b'%d 0 obj' % (objid,)) - self.serialize_object(obj) - if self.last.isalnum(): - self.write(b'\n') - self.write(b'endobj\n') - - - - -def decryptBook(userkey, inpath, outpath): - if AES is None: - raise IGNOBLEError("PyCrypto or OpenSSL must be installed.") - with open(inpath, 'rb') as inf: - serializer = PDFSerializer(inf, userkey) - with open(outpath, 'wb') as outf: - # help construct to make sure the method runs to the end - try: - serializer.dump(outf) - except Exception as e: - print("error writing pdf: {0}".format(e.args[0])) - return 2 - return 0 - - -def cli_main(): - sys.stdout=SafeUnbuffered(sys.stdout) - sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() - progname = os.path.basename(argv[0]) - if len(argv) != 4: - print("usage: {0} ".format(progname)) - return 1 - keypath, inpath, outpath = argv[1:] - userkey = open(keypath,'rb').read() - result = decryptBook(userkey, inpath, outpath) - if result == 0: - print("Successfully decrypted {0:s} as {1:s}".format(os.path.basename(inpath),os.path.basename(outpath))) - return result - - -def gui_main(): - try: - import tkinter - import tkinter.constants - import tkinter.filedialog - import tkinter.messagebox - import traceback - except: - return cli_main() - - class DecryptionDialog(tkinter.Frame): - def __init__(self, root): - tkinter.Frame.__init__(self, root, border=5) - self.status = tkinter.Label(self, text="Select files for decryption") - self.status.pack(fill=tkinter.constants.X, expand=1) - body = tkinter.Frame(self) - body.pack(fill=tkinter.constants.X, expand=1) - sticky = tkinter.constants.E + tkinter.constants.W - body.grid_columnconfigure(1, weight=2) - tkinter.Label(body, text="Key file").grid(row=0) - self.keypath = tkinter.Entry(body, width=30) - self.keypath.grid(row=0, column=1, sticky=sticky) - if os.path.exists("bnpdfkey.b64"): - self.keypath.insert(0, "bnpdfkey.b64") - button = tkinter.Button(body, text="...", command=self.get_keypath) - button.grid(row=0, column=2) - tkinter.Label(body, text="Input file").grid(row=1) - self.inpath = tkinter.Entry(body, width=30) - self.inpath.grid(row=1, column=1, sticky=sticky) - button = tkinter.Button(body, text="...", command=self.get_inpath) - button.grid(row=1, column=2) - tkinter.Label(body, text="Output file").grid(row=2) - self.outpath = tkinter.Entry(body, width=30) - self.outpath.grid(row=2, column=1, sticky=sticky) - button = tkinter.Button(body, text="...", command=self.get_outpath) - button.grid(row=2, column=2) - buttons = tkinter.Frame(self) - buttons.pack() - botton = tkinter.Button( - buttons, text="Decrypt", width=10, command=self.decrypt) - botton.pack(side=tkinter.constants.LEFT) - tkinter.Frame(buttons, width=10).pack(side=tkinter.constants.LEFT) - button = tkinter.Button( - buttons, text="Quit", width=10, command=self.quit) - button.pack(side=tkinter.constants.RIGHT) - - def get_keypath(self): - keypath = tkinter.filedialog.askopenfilename( - parent=None, title="Select Barnes & Noble \'.b64\' key file", - defaultextension=".b64", - filetypes=[('base64-encoded files', '.b64'), - ('All Files', '.*')]) - if keypath: - keypath = os.path.normpath(keypath) - self.keypath.delete(0, tkinter.constants.END) - self.keypath.insert(0, keypath) - return - - def get_inpath(self): - inpath = tkinter.filedialog.askopenfilename( - parent=None, title="Select B&N-encrypted PDF file to decrypt", - defaultextension=".pdf", filetypes=[('PDF files', '.pdf')]) - if inpath: - inpath = os.path.normpath(inpath) - self.inpath.delete(0, tkinter.constants.END) - self.inpath.insert(0, inpath) - return - - def get_outpath(self): - outpath = tkinter.filedialog.asksaveasfilename( - parent=None, title="Select unencrypted PDF file to produce", - defaultextension=".pdf", filetypes=[('PDF files', '.pdf')]) - if outpath: - outpath = os.path.normpath(outpath) - self.outpath.delete(0, tkinter.constants.END) - self.outpath.insert(0, outpath) - return - - def decrypt(self): - keypath = self.keypath.get() - inpath = self.inpath.get() - outpath = self.outpath.get() - if not keypath or not os.path.exists(keypath): - self.status['text'] = "Specified key file does not exist" - return - if not inpath or not os.path.exists(inpath): - self.status['text'] = "Specified input file does not exist" - return - if not outpath: - self.status['text'] = "Output file not specified" - return - if inpath == outpath: - self.status['text'] = "Must have different input and output files" - return - userkey = open(keypath,'rb').read() - self.status['text'] = "Decrypting..." - try: - decrypt_status = decryptBook(userkey, inpath, outpath) - except Exception as e: - self.status['text'] = "Error; {0}".format(e.args[0]) - return - if decrypt_status == 0: - self.status['text'] = "File successfully decrypted" - else: - self.status['text'] = "The was an error decrypting the file." - - - root = tkinter.Tk() - if AES is None: - root.withdraw() - tkinter.messagebox.showerror( - "IGNOBLE PDF", - "This script requires OpenSSL or PyCrypto, which must be installed " - "separately. Read the top-of-script comment for details.") - return 1 - root.title("Barnes & Noble PDF Decrypter v.{0}".format(__version__)) - root.resizable(True, False) - root.minsize(370, 0) - DecryptionDialog(root).pack(fill=tkinter.constants.X, expand=1) - root.mainloop() - return 0 - - -if __name__ == '__main__': - if len(sys.argv) > 1: - sys.exit(cli_main()) - sys.exit(gui_main()) diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 759a6061..2c6cecac 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # ineptepub.py -# Copyright © 2009-2020 by i♥cabbages, Apprentice Harper et al. +# Copyright © 2009-2021 by i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -30,18 +30,19 @@ # 6.5 - Completely remove erroneous check on DER file sanity # 6.6 - Import tkFileDialog, don't assume something else will import it. # 7.0 - Add Python 3 compatibility for calibre 5.0 +# 7.1 - Add ignoble support, dropping the dedicated ignobleepub.py script """ Decrypt Adobe Digital Editions encrypted ePub books. """ __license__ = 'GPL v3' -__version__ = "7.0" +__version__ = "7.1" -import codecs import sys import os import traceback +import base64 import zlib import zipfile from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED @@ -210,9 +211,14 @@ def decrypt(self, data): return (AES, RSA) def _load_crypto_pycrypto(): - from Crypto.Cipher import AES as _AES - from Crypto.PublicKey import RSA as _RSA - from Crypto.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 + try: + from Cryptodome.Cipher import AES as _AES + from Cryptodome.PublicKey import RSA as _RSA + from Cryptodome.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 + except: + from Crypto.Cipher import AES as _AES + from Crypto.PublicKey import RSA as _RSA + from Crypto.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 # ASN.1 parsing code from tlslite class ASN1Error(Exception): @@ -417,13 +423,32 @@ def adeptBook(inpath): adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = './/%s' % (adept('encryptedKey'),) bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) == 172: + if len(bookkey) in [192, 172, 64]: return True except: # if we couldn't check, assume it is return True return False +def isPassHashBook(inpath): + # If this is an Adobe book, check if it's a PassHash-encrypted book (B&N) + with closing(ZipFile(open(inpath, 'rb'))) as inf: + namelist = set(inf.namelist()) + if 'META-INF/rights.xml' not in namelist or \ + 'META-INF/encryption.xml' not in namelist: + return False + try: + rights = etree.fromstring(inf.read('META-INF/rights.xml')) + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + expr = './/%s' % (adept('encryptedKey'),) + bookkey = ''.join(rights.findtext(expr)) + if len(bookkey) == 64: + return True + except: + pass + + return False + # Checks the license file and returns the UUID the book is licensed for. # This is used so that the Calibre plugin can pick the correct decryption key # first try without having to loop through all possible keys. @@ -463,7 +488,7 @@ def verify_book_key(bookkey): def decryptBook(userkey, inpath, outpath): if AES is None: raise ADEPTError("PyCrypto or OpenSSL must be installed.") - rsa = RSA(userkey) + with closing(ZipFile(open(inpath, 'rb'))) as inf: namelist = inf.namelist() if 'META-INF/rights.xml' not in namelist or \ @@ -483,10 +508,32 @@ def decryptBook(userkey, inpath, outpath): print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") raise ADEPTNewVersionError("Book uses new ADEPT encryption") - if len(bookkey) != 172: - print("{0:s} is not a secure Adobe Adept ePub.".format(os.path.basename(inpath))) + + if len(bookkey) == 172: + print("{0:s} is a secure Adobe Adept ePub.".format(os.path.basename(inpath))) + elif len(bookkey) == 64: + print("{0:s} is a secure Adobe PassHash (B&N) ePub.".format(os.path.basename(inpath))) + else: + print("{0:s} is not an Adobe-protected ePub!".format(os.path.basename(inpath))) return 1 - bookkey = rsa.decrypt(codecs.decode(bookkey.encode('ascii'), 'base64')) + + if len(bookkey) != 64: + # Normal Adobe ADEPT + rsa = RSA(userkey) + bookkey = rsa.decrypt(base64.b64decode(bookkey.encode('ascii'))) + else: + # Adobe PassHash / B&N + key = base64.b64decode(userkey)[:16] + aes = AES(key) + bookkey = aes.decrypt(base64.b64decode(bookkey)) + if type(bookkey[-1]) != int: + pad = ord(bookkey[-1]) + else: + pad = bookkey[-1] + + bookkey = bookkey[:-pad] + + # Padded as per RSAES-PKCS1-v1_5 if len(bookkey) > 16: if verify_book_key(bookkey): @@ -494,6 +541,7 @@ def decryptBook(userkey, inpath, outpath): else: print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) return 2 + encryption = inf.read('META-INF/encryption.xml') decryptor = Decryptor(bookkey, encryption) kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index c6670cfd..47d6106b 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from calibre_plugins.dedrm.ignoblekeygen import generate_key +from calibre_plugins.dedrm.ignoblekeyGenPassHash import generate_key __license__ = 'GPL v3' From 620c90b69541107742d33bec5b58cfbb9f2cad47 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 23 Dec 2021 15:53:52 +0100 Subject: [PATCH 043/154] Update PassHash documentation --- DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm | 67 ++++++++++++++++++ .../DeDRM_Barnes and Noble Key_Help.htm | 68 ------------------- 2 files changed, 67 insertions(+), 68 deletions(-) create mode 100644 DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm delete mode 100644 DeDRM_plugin/DeDRM_Barnes and Noble Key_Help.htm diff --git a/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm b/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm new file mode 100644 index 00000000..6f61260c --- /dev/null +++ b/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm @@ -0,0 +1,67 @@ + + + + + + +Managing Adobe PassHash (B&N) Keys + + + + + +

Managing Adobe PassHash Keys

+ +

Adobe PassHash is a variant of the Adobe DRM which is used by retailers like Barnes and Noble. Instead of using certificates and device-based authorization, this uses a username and password combination. In B&&Ns implementation however, the user never gets access to these credentials, just to the credential hash.

+ +

Changes at Barnes & Noble

+ +

Since 2014, Barnes & Noble is no longer using the default Adobe key generation algorithm, which used to be the full name as "username" and the full credit card number as "password" for the PassHash algorithm. +Instead, they started generating a random key on their server and send that to the reading application during login. This means that the old method to decrypt these books will no longer work.

+ +

There used to be a way to use the Android app's API to simulate a login to the Barnes and Noble servers, but that API has been shut down a while ago, too, and so far nobody has reverse-engineered the new one.

+ +

Importing PassHash / B&N keys

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a green plus sign (+). Clicking this button will open a new dialog for entering the necessary data to generate a new key.

+

Currently, the only known ways to access the key are the following:

+
    +
  • B&N: The encryption key can be extracted from the NOOK reading application available in the Microsoft store, or from the old "Nook Study" application. To do that, click on the "Extract key from Nook Windows application" option.
  • +
  • B&N: The encryption key can also be extracted from a data backup of the NOOK Android application. To do that, you'll need to have a rooted Android device, a hacked / modified Nook APK file, or an Android emulator to be able to access the app data. If you have that, click on "Extract key from Nook Android application" and follow the instructions.
  • +
  • B&N: The NOOK Android application supports / accepts user-added CA certificates, so you can set up something like mitmproxy on your computer, tunnel your phone's traffic through that, and extract the ccHash key data from the server response. You can then add that hash through the "Base64-encoded PassHash key string" option.
  • +
  • If you already have a copy of the Nook ccHash key string (or, more general, the PassHash key string) in base64 encoding, you can either click on "Import existing keyfiles" if it's a file in b64 format, or you click on the "Base64-encoded PassHash key string" option while adding a new PassHash key.
  • +
  • For retailers other than B&N that are using the PassHash algorihm as intended, you can click on "Adobe PassHash username & password" to enter your credentials while adding a key. This is the same algorihm as the original credit card number based key generation for B&N.
  • +
+ + +

After you've selected a key retrieval method from the settings, the dialog may change and request some additional information depending on the key retrieval method. Enter that, then click the OK button to create and store the generated key. Or Cancel if you don’t want to create a key.

+

New keys are checked against the current list of keys before being added, and duplicates are discarded.

+ +

Deleting Keys:

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a red "X". Clicking this button will delete the highlighted key in the list. You will be prompted once to be sure that’s what you truly mean to do. Once gone, it’s permanently gone.

+ +

Renaming Keys:

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a sheet of paper. Clicking this button will prompt you to enter a new name for the highlighted key in the list. Enter the new name for the encryption key and click the OK button to use the new name, or Cancel to revert to the old name..

+ +

Exporting Keys:

+ +

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a computer’s hard-drive. Use this button to export the highlighted key to a file (with a ‘.b64’ file name extension). Used for backup purposes or to migrate key data to other computers/calibre installations. The dialog will prompt you for a place to save the file.

+ +

Importing Existing Keyfiles:

+ +

At the bottom-left of the plugin’s customization dialog, you will see a button labeled "Import Existing Keyfiles". Use this button to import existing ‘.b64’ key files. Key files might come from being exported from this or older plugins, or may have been generated using the original i♥cabbages script, or you may have made it by following the instructions above.

+ +

Once done creating/deleting/renaming/importing decryption keys, click Close to exit the customization dialogue. Your changes will only be saved permanently when you click OK in the main configuration dialog.

+ + + + diff --git a/DeDRM_plugin/DeDRM_Barnes and Noble Key_Help.htm b/DeDRM_plugin/DeDRM_Barnes and Noble Key_Help.htm deleted file mode 100644 index 2b78ee9a..00000000 --- a/DeDRM_plugin/DeDRM_Barnes and Noble Key_Help.htm +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -Managing Barnes and Noble Keys - - - - - -

Managing Barnes and Noble Keys

- - -

If you have upgraded from an earlier version of the plugin, any existing Barnes and Noble keys will have been automatically imported, so you might not need to do any more configuration. Continue reading for key generation and management instructions.

- -

Changes at Barnes & Noble

- -

In mid-2014, Barnes & Noble changed the way they generated encryption keys. Instead of deriving the key from the user's name and credit card number, they started generating a random key themselves, sending that key through to devices when they connected to the Barnes & Noble servers. This means that most users will now find that no combination of their name and CC# will work in decrypting their recently downloaded ebooks.

- -

Someone commenting at Apprentice Alf's blog detailed a way to retrieve a new account key using the account's email address and password. This method has now been incorporated into the plugin. - -

Creating New Keys:

- -

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a green plus sign (+). Clicking this button will open a new dialog for entering the necessary data to generate a new key.

-
    -
  • Unique Key Name: this is a unique name you choose to help you identify the key. This name will show in the list of configured keys. Choose something that will help you remember the data (account email address) it was created with.
  • -
  • B&N/nook account email address: This is the default email address for your Barnes and Noble/nook account. This email will not be stored anywhere on your computer or in calibre. It will only be used to fetch the account key that from the B&N server, and it is that key that will be stored in the preferences.
  • -
  • B&N/nook account password: this is the password for your Barnes and Noble/nook account. As with the email address, this will not be stored anywhere on your computer or in calibre. It will only be used to fetch the key from the B&N server.
  • -
- -

Click the OK button to create and store the generated key. Or Cancel if you don’t want to create a key.

-

New keys are checked against the current list of keys before being added, and duplicates are discarded.

- -

Deleting Keys:

- -

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a red "X". Clicking this button will delete the highlighted key in the list. You will be prompted once to be sure that’s what you truly mean to do. Once gone, it’s permanently gone.

- -

Renaming Keys:

- -

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a sheet of paper. Clicking this button will prompt you to enter a new name for the highlighted key in the list. Enter the new name for the encryption key and click the OK button to use the new name, or Cancel to revert to the old name..

- -

Exporting Keys:

- -

On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a computer’s hard-drive. Use this button to export the highlighted key to a file (with a ‘.b64’ file name extension). Used for backup purposes or to migrate key data to other computers/calibre installations. The dialog will prompt you for a place to save the file.

- -

Importing Existing Keyfiles:

- -

At the bottom-left of the plugin’s customization dialog, you will see a button labeled "Import Existing Keyfiles". Use this button to import existing ‘.b64’ key files. Key files might come from being exported from this or older plugins, or may have been generated using the original i♥cabbages script, or you may have made it by following the instructions above.

- -

Once done creating/deleting/renaming/importing decryption keys, click Close to exit the customization dialogue. Your changes will only be saved permanently when you click OK in the main configuration dialog.

- -

NOOK Study

-

Books downloaded through NOOK Study may or may not use the key found using the above method. If a book is not decrypted successfully with any of the keys, the plugin will attempt to recover keys from the NOOK Study log file and use them.

- - - - - - From 8986855a47cae416ed70843076af206f148afad5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 24 Dec 2021 14:35:53 +0100 Subject: [PATCH 044/154] Support for extracting PassHashes from ADE --- CHANGELOG.md | 3 +- DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm | 1 + DeDRM_plugin/__init__.py | 22 ++- DeDRM_plugin/adobekey_get_passhash.py | 158 +++++++++++++++++++ DeDRM_plugin/config.py | 156 +++++++++++++++--- 5 files changed, 320 insertions(+), 20 deletions(-) create mode 100644 DeDRM_plugin/adobekey_get_passhash.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 462b1cea..4df06e4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,4 +44,5 @@ List of changes since the fork of Apprentice Harper's repository: - Merge ignobleepub into ineptepub so there's no duplicate code. - Support extracting the B&N / Nook key from the NOOK Microsoft Store application (based on [this script](https://github.com/noDRM/DeDRM_tools/discussions/9) by fesiwi). - Support extracting the B&N / Nook key from a data dump of the NOOK Android application. -- Support adding an existing B&N key base64 string without having to write it to a file first. +- Support adding an existing PassHash / B&N key base64 string without having to write it to a file first. +- Support extracting PassHash keys from Adobe Digital Editions. diff --git a/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm b/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm index 6f61260c..cc6d878f 100644 --- a/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm +++ b/DeDRM_plugin/DeDRM_ADE PassHash Key_Help.htm @@ -38,6 +38,7 @@

Importing PassHash / B&N keys

  • B&N: The NOOK Android application supports / accepts user-added CA certificates, so you can set up something like mitmproxy on your computer, tunnel your phone's traffic through that, and extract the ccHash key data from the server response. You can then add that hash through the "Base64-encoded PassHash key string" option.
  • If you already have a copy of the Nook ccHash key string (or, more general, the PassHash key string) in base64 encoding, you can either click on "Import existing keyfiles" if it's a file in b64 format, or you click on the "Base64-encoded PassHash key string" option while adding a new PassHash key.
  • For retailers other than B&N that are using the PassHash algorihm as intended, you can click on "Adobe PassHash username & password" to enter your credentials while adding a key. This is the same algorihm as the original credit card number based key generation for B&N.
  • +
  • Windows only: If you've successfully opened a PassHash-encrypted book in Adobe Digital Editions by entering username and password, you can dump the stored credentials from ADE.
  • diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 2db9acbe..23512203 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -371,6 +371,19 @@ def ePubDecrypt(self,path_to_ebook): print("{0} v{1}: Exception when getting default NOOK Microsoft App keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() + ###### Add keys from Adobe PassHash ADE activation data (adobekey_get_passhash.py) + + try: + if iswindows: + # Right now this is only implemented for Windows. MacOS support still needs to be added. + from calibre_plugins.dedrm.adobekey_get_passhash import passhash_keys + defaultkeys_ade, names = passhash_keys() + if isosx: + print("{0} v{1}: Dumping ADE PassHash data is not yet supported on MacOS.".format(PLUGIN_NAME, PLUGIN_VERSION)) + except: + print("{0} v{1}: Exception when getting PassHashes from ADE after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + traceback.print_exc() + ###### Check if one of the new keys decrypts the book: @@ -384,6 +397,10 @@ def ePubDecrypt(self,path_to_ebook): if keyvalue not in dedrmprefs['bandnkeys'].values() and keyvalue not in newkeys: newkeys.append(keyvalue) + for keyvalue in defaultkeys_ade: + if keyvalue not in dedrmprefs['bandnkeys'].values() and keyvalue not in newkeys: + newkeys.append(keyvalue) + if len(newkeys) > 0: try: for i,userkey in enumerate(newkeys): @@ -406,7 +423,10 @@ def ePubDecrypt(self,path_to_ebook): # Store the new successful key in the defaults print("{0} v{1}: Saving a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) try: - dedrmprefs.addnamedvaluetoprefs('bandnkeys','nook_key_'+time.strftime("%Y-%m-%d"),keyvalue) + if userkey in defaultkeys_ade: + dedrmprefs.addnamedvaluetoprefs('bandnkeys','ade_passhash_'+str(int(time.time())),keyvalue) + else: + dedrmprefs.addnamedvaluetoprefs('bandnkeys','nook_key_'+str(int(time.time())),keyvalue) dedrmprefs.writeprefs() print("{0} v{1}: Saved a new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except: diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py new file mode 100644 index 00000000..d575d130 --- /dev/null +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# adobekey_get_passhash.py, version 1 +# based on adobekey.pyw, version 7.2 +# Copyright © 2009-2021 i♥cabbages, Apprentice Harper et al. +# Copyright © 2021 noDRM + +# Released under the terms of the GNU General Public Licence, version 3 +# + +# Revision history: +# 1 - Initial release + +""" +Retrieve Adobe ADEPT user passhash keys +""" + +__license__ = 'GPL v3' +__version__ = '1' + +import sys, os, time +import base64, hashlib +try: + from Cryptodome.Cipher import AES +except: + from Crypto.Cipher import AES + +PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" + +def unpad(data): + + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + + +try: + from calibre.constants import iswindows, isosx +except: + iswindows = sys.platform.startswith('win') + isosx = sys.platform.startswith('darwin') + + +class ADEPTError(Exception): + pass + +def decrypt_passhash(passhash, fp): + + serial_number = base64.b64decode(fp).hex() + + hash_key = hashlib.sha1(bytearray.fromhex(serial_number + PASS_HASH_SECRET)).digest()[:16] + + encrypted_cc_hash = base64.b64decode(passhash) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + return base64.b64encode(cc_hash).decode("ascii") + + +if iswindows: + try: + import winreg + except ImportError: + import _winreg as winreg + + PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation' + + def passhash_keys(): + cuser = winreg.HKEY_CURRENT_USER + keys = [] + names = [] + try: + plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) + except WindowsError: + raise ADEPTError("Could not locate ADE activation") + + idx = 1 + + fp = None + + i = -1 + while True: + i = i + 1 # start with 0 + try: + plkparent = winreg.OpenKey(plkroot, "%04d" % (i,)) + except: + # No more keys + break + + ktype = winreg.QueryValueEx(plkparent, None)[0] + + if ktype == "activationToken": + # find fingerprint for hash decryption + j = -1 + while True: + j = j + 1 # start with 0 + try: + plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkkey, None)[0] + if ktype == 'fingerprint': + fp = winreg.QueryValueEx(plkkey, 'value')[0] + #print("Found fingerprint: " + fp) + + if ktype == 'passHashList': + + j = -1 + lastOperator = "Unknown" + while True: + j = j + 1 # start with 0 + try: + plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkkey, None)[0] + if ktype == 'operatorURL': + operatorURL = winreg.QueryValueEx(plkkey, 'value')[0] + #print("Found operator URL: " + operatorURL) + try: + lastOperator = operatorURL.split('//')[1].split('/')[0] + except: + lastOperator = "Unknown" + + elif ktype == "passHash": + passhash_encrypted = winreg.QueryValueEx(plkkey, 'value')[0] + names.append("ADE_key_" + lastOperator + "_" + str(int(time.time())) + "_" + str(idx)) + idx = idx + 1 + keys.append(passhash_encrypted) + + if fp is None: + #print("Didn't find fingerprint for decryption ...") + return [], [] + + print("Found {0:d} passhashes".format(len(keys))) + + keys_decrypted = [] + + for key in keys: + decrypted = decrypt_passhash(key, fp) + #print("Input key: " + key) + #print("Output key: " + decrypted) + keys_decrypted.append(decrypted) + + return keys_decrypted, names + + +else: + def passhash_keys(): + raise ADEPTError("This script only supports Windows.") + #TODO: Add MacOS support by parsing the activation.xml file. + return [], [] + + +if __name__ == '__main__': + print("This is a python calibre plugin. It can't be directly executed.") diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index c1850e03..62f34dbb 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -361,21 +361,57 @@ def add_key(self): if d.result() != d.Accepted: # New key generation cancelled. return - new_key_value = d.key_value - if type(self.plugin_keys) == dict: - if new_key_value in self.plugin_keys.values(): - old_key_name = [name for name, value in self.plugin_keys.items() if value == new_key_value][0] - info_dialog(None, "{0} {1}: Duplicate {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), - "The new {1} is the same as the existing {1} named {0} and has not been added.".format(old_key_name,self.key_type_name), show=True) - return - self.plugin_keys[d.key_name] = new_key_value + + if d.k_key_list is not None: + # importing multiple keys + idx = -1 + dup_key_count = 0 + added_key_count = 0 + + while True: + idx = idx + 1 + try: + new_key_value = d.k_key_list[idx] + except: + break + + if type(self.plugin_keys) == dict: + if new_key_value in self.plugin_keys.values(): + dup_key_count = dup_key_count + 1 + continue + print("Setting idx " + str(idx) + ", name " + d.k_name_list[idx] + " to " + new_key_value) + self.plugin_keys[d.k_name_list[idx]] = new_key_value + added_key_count = added_key_count + 1 + else: + if new_key_value in self.plugin_keys: + dup_key_count = dup_key_count + 1 + continue + self.plugin_keys.append(new_key_value) + added_key_count = added_key_count + 1 + + + if (added_key_count > 0): + info_dialog(None, "{0} {1}: Adding {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "Successfully added {0} key(s).".format(added_key_count), show=True) + else: - if new_key_value in self.plugin_keys: - info_dialog(None, "{0} {1}: Duplicate {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), - "This {0} is already in the list of {0}s has not been added.".format(self.key_type_name), show=True) - return + # Import single key + new_key_value = d.key_value + if type(self.plugin_keys) == dict: + if new_key_value in self.plugin_keys.values(): + old_key_name = [name for name, value in self.plugin_keys.items() if value == new_key_value][0] + info_dialog(None, "{0} {1}: Duplicate {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "The new {1} is the same as the existing {1} named {0} and has not been added.".format(old_key_name,self.key_type_name), show=True) + return + self.plugin_keys[d.key_name] = new_key_value + else: + if new_key_value in self.plugin_keys: + info_dialog(None, "{0} {1}: Duplicate {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "This {0} is already in the list of {0}s has not been added.".format(self.key_type_name), show=True) + return + + self.plugin_keys.append(d.key_value) - self.plugin_keys.append(d.key_value) self.listy.clear() self.populate_list() @@ -574,12 +610,35 @@ def update_form(self, idx): self.add_fields_for_passhash() elif idx == 2: self.add_fields_for_b64_passhash() - elif idx == 3: - self.add_fields_for_windows_nook() + elif idx == 3: + self.add_fields_for_ade_passhash() elif idx == 4: + self.add_fields_for_windows_nook() + elif idx == 5: self.add_fields_for_android_nook() + + def add_fields_for_ade_passhash(self): + + self.ade_extr_group_box = QGroupBox("", self) + ade_extr_group_box_layout = QVBoxLayout() + self.ade_extr_group_box.setLayout(ade_extr_group_box_layout) + + self.layout.addWidget(self.ade_extr_group_box) + + ade_extr_group_box_layout.addWidget(QLabel("Click \"OK\" to try and dump PassHash data \nfrom Adobe Digital Editions. This works if\nyou've opened your PassHash books in ADE before.", self)) + + self.button_box.hide() + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept_ade_dump_passhash) + self.button_box.rejected.connect(self.reject) + self.layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + def add_fields_for_android_nook(self): self.andr_nook_group_box = QGroupBox("", self) @@ -725,6 +784,7 @@ def __init__(self, parent=None,): self.cbType.addItem("--- Select key type ---") self.cbType.addItem("Adobe PassHash username & password") self.cbType.addItem("Base64-encoded PassHash key string") + self.cbType.addItem("Extract passhashes from Adobe Digital Editions") self.cbType.addItem("Extract key from Nook Windows application") self.cbType.addItem("Extract key from Nook Android application") self.cbType.currentIndexChanged.connect(self.update_form, self.cbType.currentIndex()) @@ -738,7 +798,10 @@ def __init__(self, parent=None,): @property def key_name(self): - return str(self.key_ledit.text()).strip() + try: + return str(self.key_ledit.text()).strip() + except: + return self.result_data_name @property def key_value(self): @@ -752,6 +815,23 @@ def user_name(self): def cc_number(self): return str(self.cc_ledit.text()).strip() + + @property + def k_name_list(self): + # If the plugin supports returning multiple keys, return a list of names. + if self.k_full_name_list is not None and self.k_full_key_list is not None: + return self.k_full_name_list + return None + + @property + def k_key_list(self): + # If the plugin supports returning multiple keys, return a list of keys. + if self.k_full_name_list is not None and self.k_full_key_list is not None: + return self.k_full_key_list + return None + + + def accept_android_nook(self): if len(self.key_name) < 4: @@ -775,10 +855,47 @@ def accept_android_nook(self): errmsg = "Failed to extract keys. Is this the correct folder?" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + # Take the first key we found. In the future it might be a good idea to import them all. + # See accept_ade_dump_passhash for an example on how to do that. self.result_data = store_result[0] QDialog.accept(self) + def accept_ade_dump_passhash(self): + + try: + from calibre_plugins.dedrm.adobekey_get_passhash import passhash_keys + keys, names = passhash_keys() + except: + errmsg = "Failed to grab PassHash keys from ADE." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + + # Take the first new key we found. + + idx = -1 + new_keys = [] + new_names = [] + for key in keys: + idx = idx + 1 + if key in self.parent.plugin_keys.values(): + continue + + new_keys.append(key) + new_names.append(names[idx]) + + if len(new_keys) == 0: + # Okay, we didn't find anything. How do we get rid of the window? + errmsg = "Didn't find any PassHash keys in ADE." + error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + QDialog.reject(self) + return + + # Add new keys to list. + self.k_full_name_list = new_names + self.k_full_key_list = new_keys + QDialog.accept(self) + return + def accept_win_nook(self): @@ -799,8 +916,8 @@ def accept_win_nook(self): from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys store_result = nookkeys() - # Take the first key we found. In the future it might be a good idea to import them all, - # but with how the import dialog is currently structured that's not easily possible. + # Take the first key we found. In the future it might be a good idea to import them all. + # See accept_ade_dump_passhash for an example on how to do that. if len(store_result) > 0: self.result_data = store_result[0] QDialog.accept(self) @@ -1012,6 +1129,9 @@ def __init__(self, parent=None,): # Right now this code only supports adding one key per each invocation, # so if the user has multiple keys, he's going to need to add the "plus" button multiple times. + # In the future it might be a good idea to import them all. + # See accept_ade_dump_passhash for an example on how to do that. + if len(self.new_keys)>0: self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) From 19589894874ac022483e9cb3e46472681fd50b66 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 25 Dec 2021 23:35:59 +0100 Subject: [PATCH 045/154] Key retrieval updates --- CHANGELOG.md | 2 +- DeDRM_plugin/adobekey_get_passhash.py | 19 ++- DeDRM_plugin/config.py | 161 ++++++++++++++------------ 3 files changed, 101 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4df06e4d..e14c4079 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,7 @@ List of changes since the fork of Apprentice Harper's repository: ## Fixes on master (not yet released): - Fix issue where importing a key from Adobe Digital Editions would fail in Python2 (Calibre < 5) if there were non-ASCII characters in the username. -- Add code to support importing multiple decryption keys from ADE (click the 'plus' button multiple times). +- Add code to support importing multiple decryption keys from ADE. - Improve epubtest.py to also detect Kobo & Apple DRM. - Small updates to the LCP DRM error messages. - Merge ignobleepub into ineptepub so there's no duplicate code. diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py index d575d130..5b4502a5 100644 --- a/DeDRM_plugin/adobekey_get_passhash.py +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -105,8 +105,11 @@ def passhash_keys(): fp = winreg.QueryValueEx(plkkey, 'value')[0] #print("Found fingerprint: " + fp) + + # Note: There can be multiple lists, with multiple entries each. if ktype == 'passHashList': + # Find operator (used in key name) j = -1 lastOperator = "Unknown" while True: @@ -118,13 +121,23 @@ def passhash_keys(): ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'operatorURL': operatorURL = winreg.QueryValueEx(plkkey, 'value')[0] - #print("Found operator URL: " + operatorURL) try: lastOperator = operatorURL.split('//')[1].split('/')[0] except: - lastOperator = "Unknown" + pass + + + # Find hashes + j = -1 + while True: + j = j + 1 # start with 0 + try: + plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) + except WindowsError: + break + ktype = winreg.QueryValueEx(plkkey, None)[0] - elif ktype == "passHash": + if ktype == "passHash": passhash_encrypted = winreg.QueryValueEx(plkkey, 'value')[0] names.append("ADE_key_" + lastOperator + "_" + str(int(time.time())) + "_" + str(idx)) idx = idx + 1 diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 62f34dbb..a09110f4 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -379,7 +379,6 @@ def add_key(self): if new_key_value in self.plugin_keys.values(): dup_key_count = dup_key_count + 1 continue - print("Setting idx " + str(idx) + ", name " + d.k_name_list[idx] + " to " + new_key_value) self.plugin_keys[d.k_name_list[idx]] = new_key_value added_key_count = added_key_count + 1 else: @@ -389,10 +388,16 @@ def add_key(self): self.plugin_keys.append(new_key_value) added_key_count = added_key_count + 1 - - if (added_key_count > 0): - info_dialog(None, "{0} {1}: Adding {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), - "Successfully added {0} key(s).".format(added_key_count), show=True) + if (added_key_count > 0 or dup_key_count > 0): + if (added_key_count == 0): + info_dialog(None, "{0} {1}: Adding {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "Skipped adding {0} duplicate / existing keys.".format(dup_key_count), show=True, show_copy_button=False) + elif (dup_key_count == 0): + info_dialog(None, "{0} {1}: Adding {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "Added {0} new keys.".format(added_key_count), show=True, show_copy_button=False) + else: + info_dialog(None, "{0} {1}: Adding {2}".format(PLUGIN_NAME, PLUGIN_VERSION,self.key_type_name), + "Added {0} new keys, skipped adding {1} existing keys.".format(added_key_count, dup_key_count), show=True, show_copy_button=False) else: # Import single key @@ -855,10 +860,25 @@ def accept_android_nook(self): errmsg = "Failed to extract keys. Is this the correct folder?" return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - # Take the first key we found. In the future it might be a good idea to import them all. - # See accept_ade_dump_passhash for an example on how to do that. - self.result_data = store_result[0] + if len(store_result) == 1: + # Found exactly one key. Store it with that name. + self.result_data = store_result[0] + QDialog.accept(self) + return + + # Found multiple keys + keys = [] + names = [] + idx = 1 + for key in store_result: + keys.append(key) + names.append(self.key_name + "_" + str(idx)) + idx = idx + 1 + + self.k_full_name_list = names + self.k_full_key_list = keys QDialog.accept(self) + return def accept_ade_dump_passhash(self): @@ -911,19 +931,36 @@ def accept_win_nook(self): errmsg = "Failed to import from Nook Microsoft Store app." return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - if len(store_result) == 0: - # Nothing found, try the Nook Study app + try: + # Try the Nook Study app from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys - store_result = nookkeys() + study_result = nookkeys() + except: + errmsg = "Failed to import from Nook Study app." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - # Take the first key we found. In the future it might be a good idea to import them all. - # See accept_ade_dump_passhash for an example on how to do that. - if len(store_result) > 0: - self.result_data = store_result[0] + # Add all found keys to a list + keys = [] + names = [] + idx = 1 + for key in store_result: + keys.append(key) + names.append(self.key_name + "_nookStore_" + str(idx)) + idx = idx + 1 + idx = 1 + for key in study_result: + keys.append(key) + names.append(self.key_name + "_nookStudy_" + str(idx)) + idx = idx + 1 + + if len(keys) > 0: + self.k_full_name_list = names + self.k_full_key_list = keys QDialog.accept(self) return - # Okay, we didn't find anything. How do we get rid of the window? + + # Okay, we didn't find anything. errmsg = "Didn't find any Nook keys in the Windows app." error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) QDialog.reject(self) @@ -1050,14 +1087,23 @@ def accept(self): QDialog.accept(self) -class AddAdeptDialog(QDialog): +class AddAdeptDialog(): + # We don't actually need to show a dialog, but the wrapper class is expecting a QDialog here. + # Emulate enough methods and parameters so that that works ... + + def exec_(self): + return + + def result(self): + return True + + @property + def Accepted(self): + return True + def __init__(self, parent=None,): - QDialog.__init__(self, parent) + self.parent = parent - self.setWindowTitle("{0} {1}: Getting Default Adobe Digital Editions Key".format(PLUGIN_NAME, PLUGIN_VERSION)) - layout = QVBoxLayout(self) - self.setLayout(layout) - self.new_keys = [] self.new_names = [] @@ -1119,55 +1165,11 @@ def __init__(self, parent=None,): if not self.new_keys[i] in new_keys_2: new_keys_2.append(self.new_keys[i]) new_names_2.append(self.new_names[i]) - i = i + 1 + i = i + 1 - self.new_keys = new_keys_2 - self.new_names = new_names_2 - - - # Okay, new_keys is now a list of new keys, and new_names has the names for these keys. - # Right now this code only supports adding one key per each invocation, - # so if the user has multiple keys, he's going to need to add the "plus" button multiple times. - - # In the future it might be a good idea to import them all. - # See accept_ade_dump_passhash for an example on how to do that. + self.k_full_key_list = new_keys_2 + self.k_full_name_list = new_names_2 - if len(self.new_keys)>0: - self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) - - data_group_box = QGroupBox("", self) - layout.addWidget(data_group_box) - data_group_box_layout = QVBoxLayout() - data_group_box.setLayout(data_group_box_layout) - - key_group = QHBoxLayout() - data_group_box_layout.addLayout(key_group) - key_group.addWidget(QLabel("Unique Key Name:", self)) - self.key_ledit = QLineEdit("ade_key_uuid_" + self.new_names[0], self) - self.key_ledit.setToolTip("

    Enter an identifying name for the current Adobe key. Note that it's recommended to leave the UUID (the random-looking digits and letters) as it is.") - key_group.addWidget(self.key_ledit) - - if len(self.new_keys) > 1: - # The code currently doesn't support adding multiple keys. - # If there are more keys, tell the user to trigger this again. - data_group_box_layout.addWidget(QLabel("

    There are more keys available.
    Click the 'plus' icon again after adding this key to add the other keys.

    ", self)) - - self.button_box.accepted.connect(self.accept) - else: - # No new key found - neither in ADE nor in the DeACSM plugin - - self.button_box = QDialogButtonBox(QDialogButtonBox.Ok) - - default_key_error = QLabel("No new ADE key could be found. Either ADE is not installed, or the key is already present in the plugin.", self) - default_key_error.setAlignment(Qt.AlignHCenter) - layout.addWidget(default_key_error) - # if no default, bot buttons do the same - self.button_box.accepted.connect(self.reject) - - self.button_box.rejected.connect(self.reject) - layout.addWidget(self.button_box) - - self.resize(self.sizeHint()) @property def key_name(self): @@ -1177,15 +1179,20 @@ def key_name(self): def key_value(self): return codecs.encode(self.new_keys[0],'hex').decode("utf-8") + + @property + def k_name_list(self): + # If the plugin supports returning multiple keys, return a list of names. + if self.k_full_name_list is not None and self.k_full_key_list is not None: + return self.k_full_name_list + return None - def accept(self): - if len(self.key_name) == 0 or self.key_name.isspace(): - errmsg = "Key name must not be empty!" - return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - if len(self.key_name) < 4: - errmsg = "Key name must be at least 4 characters long!" - return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - QDialog.accept(self) + @property + def k_key_list(self): + # If the plugin supports returning multiple keys, return a list of keys. + if self.k_full_name_list is not None and self.k_full_key_list is not None: + return self.k_full_key_list + return None class AddKindleDialog(QDialog): From 96cf14f3ec8b7bd5318c7e89d2c49df6d129dac8 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:26:39 +0100 Subject: [PATCH 046/154] Edit .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index e43b0f98..4564a126 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ +# Mac files .DS_Store + +# local test data +/user_data/ \ No newline at end of file From 586609bb2cc7e6b26a1df5faef7f5cdd6d79581f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:35:02 +0100 Subject: [PATCH 047/154] Remove ancient code to import keys from ancient plugins There were a couple specific DRM removal plugins before the DeDRM plugin was created. These are obsolete since a long time, there's no need to still have the code to import their config. If people are still using these ancient plugins, they'll have to update to an older version of DeDRM first, and then update to the current one. --- DeDRM_plugin/__init__.py | 13 +-- DeDRM_plugin/prefs.py | 219 ++------------------------------------- 2 files changed, 14 insertions(+), 218 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 23512203..f433949a 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -102,8 +102,13 @@ class DeDRMError(Exception): pass from calibre.customize import FileTypePlugin -from calibre.constants import iswindows, isosx -from calibre.gui2 import is_ok_to_use_qt + +try: + from calibre.constants import iswindows, isosx +except: + iswindows = sys.platform.startswith('win') + isosx = sys.platform.startswith('darwin') + from calibre.utils.config import config_dir @@ -197,10 +202,6 @@ def initialize(self): traceback.print_exc() pass - # convert old preferences, if necessary. - from calibre_plugins.dedrm.prefs import convertprefs - convertprefs() - # mark that this version has been initialized os.mkdir(self.verdir) except Exception as e: diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index 16a85229..c83e0a5e 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -5,13 +5,15 @@ __license__ = 'GPL v3' # Standard Python modules. -import os, sys, re, hashlib -import codecs, json +import os import traceback -from calibre.utils.config import dynamic, config_dir, JSONConfig -from calibre_plugins.dedrm.__init__ import PLUGIN_NAME, PLUGIN_VERSION -from calibre.constants import iswindows, isosx +from calibre.utils.config import JSONConfig + +try: + from calibre_plugins.dedrm.__init__ import PLUGIN_NAME +except: + PLUGIN_NAME = "DeDRM" class DeDRM_Prefs(): def __init__(self): @@ -91,210 +93,3 @@ def addvaluetoprefs(self, prefkind, prefsvalue): except: traceback.print_exc() return False - - -def convertprefs(always = False): - - def parseIgnobleString(keystuff): - from calibre_plugins.dedrm.ignoblekeygen import generate_key - userkeys = [] - ar = keystuff.split(':') - for keystring in ar: - try: - name, ccn = keystring.split(',') - # Generate Barnes & Noble EPUB user key from name and credit card number. - keyname = "{0}_{1}".format(name.strip(),ccn.strip()[-4:]) - keyvalue = generate_key(name, ccn) - userkeys.append([keyname,keyvalue]) - except Exception as e: - traceback.print_exc() - print(e.args[0]) - pass - return userkeys - - def parseeReaderString(keystuff): - from calibre_plugins.dedrm.erdr2pml import getuser_key - userkeys = [] - ar = keystuff.split(':') - for keystring in ar: - try: - name, cc = keystring.split(',') - # Generate eReader user key from name and credit card number. - keyname = "{0}_{1}".format(name.strip(),cc.strip()[-4:]) - keyvalue = codecs.encode(getuser_key(name,cc),'hex') - userkeys.append([keyname,keyvalue]) - except Exception as e: - traceback.print_exc() - print(e.args[0]) - pass - return userkeys - - def parseKindleString(keystuff): - pids = [] - serials = [] - ar = keystuff.split(',') - for keystring in ar: - keystring = str(keystring).strip().replace(" ","") - if len(keystring) == 10 or len(keystring) == 8 and keystring not in pids: - pids.append(keystring) - elif len(keystring) == 16 and keystring[0] == 'B' and keystring not in serials: - serials.append(keystring) - return (pids,serials) - - def getConfigFiles(extension, encoding = None): - # get any files with extension 'extension' in the config dir - userkeys = [] - files = [f for f in os.listdir(config_dir) if f.endswith(extension)] - for filename in files: - try: - fpath = os.path.join(config_dir, filename) - key = os.path.splitext(filename)[0] - value = open(fpath, 'rb').read() - if encoding is not None: - value = codecs.encode(value,encoding) - userkeys.append([key,value]) - except: - traceback.print_exc() - pass - return userkeys - - dedrmprefs = DeDRM_Prefs() - - if (not always) and dedrmprefs['configured']: - # We've already converted old preferences, - # and we're not being forced to do it again, so just return - return - - - print("{0} v{1}: Importing configuration data from old DeDRM plugins".format(PLUGIN_NAME, PLUGIN_VERSION)) - - IGNOBLEPLUGINNAME = "Ignoble Epub DeDRM" - EREADERPLUGINNAME = "eReader PDB 2 PML" - OLDKINDLEPLUGINNAME = "K4PC, K4Mac, Kindle Mobi and Topaz DeDRM" - - # get prefs from older tools - kindleprefs = JSONConfig(os.path.join("plugins", "K4MobiDeDRM")) - ignobleprefs = JSONConfig(os.path.join("plugins", "ignoble_epub_dedrm")) - - # Handle the old ignoble plugin's customization string by converting the - # old string to stored keys... get that personal data out of plain sight. - from calibre.customize.ui import config - sc = config['plugin_customization'] - val = sc.pop(IGNOBLEPLUGINNAME, None) - if val is not None: - print("{0} v{1}: Converting old Ignoble plugin configuration string.".format(PLUGIN_NAME, PLUGIN_VERSION)) - priorkeycount = len(dedrmprefs['bandnkeys']) - userkeys = parseIgnobleString(str(val)) - for keypair in userkeys: - name = keypair[0] - value = keypair[1] - dedrmprefs.addnamedvaluetoprefs('bandnkeys', name, value) - addedkeycount = len(dedrmprefs['bandnkeys'])-priorkeycount - print("{0} v{1}: {2:d} Barnes and Noble {3} imported from old Ignoble plugin configuration string".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, "key" if addedkeycount==1 else "keys")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # Handle the old eReader plugin's customization string by converting the - # old string to stored keys... get that personal data out of plain sight. - val = sc.pop(EREADERPLUGINNAME, None) - if val is not None: - print("{0} v{1}: Converting old eReader plugin configuration string.".format(PLUGIN_NAME, PLUGIN_VERSION)) - priorkeycount = len(dedrmprefs['ereaderkeys']) - userkeys = parseeReaderString(str(val)) - for keypair in userkeys: - name = keypair[0] - value = keypair[1] - dedrmprefs.addnamedvaluetoprefs('ereaderkeys', name, value) - addedkeycount = len(dedrmprefs['ereaderkeys'])-priorkeycount - print("{0} v{1}: {2:d} eReader {3} imported from old eReader plugin configuration string".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, "key" if addedkeycount==1 else "keys")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # get old Kindle plugin configuration string - val = sc.pop(OLDKINDLEPLUGINNAME, None) - if val is not None: - print("{0} v{1}: Converting old Kindle plugin configuration string.".format(PLUGIN_NAME, PLUGIN_VERSION)) - priorpidcount = len(dedrmprefs['pids']) - priorserialcount = len(dedrmprefs['serials']) - pids, serials = parseKindleString(val) - for pid in pids: - dedrmprefs.addvaluetoprefs('pids',pid) - for serial in serials: - dedrmprefs.addvaluetoprefs('serials',serial) - addedpidcount = len(dedrmprefs['pids']) - priorpidcount - addedserialcount = len(dedrmprefs['serials']) - priorserialcount - print("{0} v{1}: {2:d} {3} and {4:d} {5} imported from old Kindle plugin configuration string.".format(PLUGIN_NAME, PLUGIN_VERSION, addedpidcount, "PID" if addedpidcount==1 else "PIDs", addedserialcount, "serial number" if addedserialcount==1 else "serial numbers")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # copy the customisations back into calibre preferences, as we've now removed the nasty plaintext - config['plugin_customization'] = sc - - # get any .b64 files in the config dir - priorkeycount = len(dedrmprefs['bandnkeys']) - bandnfilekeys = getConfigFiles('.b64') - for keypair in bandnfilekeys: - name = keypair[0] - value = keypair[1] - dedrmprefs.addnamedvaluetoprefs('bandnkeys', name, value) - addedkeycount = len(dedrmprefs['bandnkeys'])-priorkeycount - if addedkeycount > 0: - print("{0} v{1}: {2:d} Barnes and Noble {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, "key file" if addedkeycount==1 else "key files")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # get any .der files in the config dir - priorkeycount = len(dedrmprefs['adeptkeys']) - adeptfilekeys = getConfigFiles('.der','hex') - for keypair in adeptfilekeys: - name = keypair[0] - value = keypair[1] - dedrmprefs.addnamedvaluetoprefs('adeptkeys', name, value) - addedkeycount = len(dedrmprefs['adeptkeys'])-priorkeycount - if addedkeycount > 0: - print("{0} v{1}: {2:d} Adobe Adept {3} imported from config folder.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, "keyfile" if addedkeycount==1 else "keyfiles")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # get ignoble json prefs - if 'keys' in ignobleprefs: - priorkeycount = len(dedrmprefs['bandnkeys']) - for name in ignobleprefs['keys']: - value = ignobleprefs['keys'][name] - dedrmprefs.addnamedvaluetoprefs('bandnkeys', name, value) - addedkeycount = len(dedrmprefs['bandnkeys']) - priorkeycount - # no need to delete old prefs, since they contain no recoverable private data - if addedkeycount > 0: - print("{0} v{1}: {2:d} Barnes and Noble {3} imported from Ignoble plugin preferences.".format(PLUGIN_NAME, PLUGIN_VERSION, addedkeycount, "key" if addedkeycount==1 else "keys")) - # Make the json write all the prefs to disk - dedrmprefs.writeprefs(False) - - # get kindle json prefs - priorpidcount = len(dedrmprefs['pids']) - priorserialcount = len(dedrmprefs['serials']) - if 'pids' in kindleprefs: - pids, serials = parseKindleString(kindleprefs['pids']) - for pid in pids: - dedrmprefs.addvaluetoprefs('pids',pid) - if 'serials' in kindleprefs: - pids, serials = parseKindleString(kindleprefs['serials']) - for serial in serials: - dedrmprefs.addvaluetoprefs('serials',serial) - addedpidcount = len(dedrmprefs['pids']) - priorpidcount - if addedpidcount > 0: - print("{0} v{1}: {2:d} {3} imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, addedpidcount, "PID" if addedpidcount==1 else "PIDs")) - addedserialcount = len(dedrmprefs['serials']) - priorserialcount - if addedserialcount > 0: - print("{0} v{1}: {2:d} {3} imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, addedserialcount, "serial number" if addedserialcount==1 else "serial numbers")) - try: - if 'wineprefix' in kindleprefs and kindleprefs['wineprefix'] != "": - dedrmprefs.set('adobewineprefix',kindleprefs['wineprefix']) - dedrmprefs.set('kindlewineprefix',kindleprefs['wineprefix']) - print("{0} v{1}: WINEPREFIX ‘(2)’ imported from Kindle plugin preferences".format(PLUGIN_NAME, PLUGIN_VERSION, kindleprefs['wineprefix'])) - except: - traceback.print_exc() - - - # Make the json write all the prefs to disk - dedrmprefs.writeprefs() - print("{0} v{1}: Finished setting up configuration data.".format(PLUGIN_NAME, PLUGIN_VERSION)) From 23a454205aad5156cc16171f48fcdd9bcba65591 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:39:41 +0100 Subject: [PATCH 048/154] Update watermark code --- DeDRM_plugin/__init__.py | 6 ++++-- DeDRM_plugin/epubwatermark.py | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index f433949a..0afa7125 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -232,7 +232,7 @@ def postProcessEPUB(self, path_to_ebook): # Remove watermarks (Amazon or LemonInk) from the OPF file path_to_ebook = watermark.removeOPFwatermarks(self, path_to_ebook) or path_to_ebook - # Remove watermarks (Adobe or LemonInk) from all HTML and XHTML files + # Remove watermarks (Adobe, Pocketbook or LemonInk) from all HTML and XHTML files path_to_ebook = watermark.removeHTMLwatermarks(self, path_to_ebook) or path_to_ebook @@ -606,7 +606,9 @@ def ePubDecrypt(self,path_to_ebook): return self.postProcessEPUB(inf.name) #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - def PDFDecrypt(self,path_to_ebook): + + # No DRM? + return self.postProcessEPUB(inf.name) import calibre_plugins.dedrm.prefs as prefs import calibre_plugins.dedrm.ineptpdf as ineptpdf import calibre_plugins.dedrm.lcpdedrm as lcpdedrm diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py index 95459758..176c77fd 100644 --- a/DeDRM_plugin/epubwatermark.py +++ b/DeDRM_plugin/epubwatermark.py @@ -30,7 +30,7 @@ def removeHTMLwatermarks(object, path_to_ebook): modded_contents = [] count_adept = 0 - + count_pocketbook = 0 count_lemonink_invisible = 0 count_lemonink_visible = 0 lemonink_trackingID = None @@ -53,6 +53,14 @@ def removeHTMLwatermarks(object, path_to_ebook): if (str_new != pre_remove): count_adept += 1 + # Remove Pocketbook watermarks + pre_remove = str_new + str_new = re.sub(r'\
    (.*?)\<\/div\>', '', str_new) + + if (str_new != pre_remove): + count_pocketbook += 1 + + # Remove eLibri / LemonInk watermark # Run this in a loop, as it is possible a file has been watermarked twice ... while True: @@ -143,6 +151,9 @@ def removeHTMLwatermarks(object, path_to_ebook): if (count_lemonink_invisible > 0 or count_lemonink_visible > 0): print("Watermark: Successfully stripped {0} visible and {1} invisible LemonInk watermark(s) (\"{2}\") from ebook." .format(count_lemonink_visible, count_lemonink_invisible, lemonink_trackingID)) + + if (count_pocketbook > 0): + print("Watermark: Successfully stripped {0} Pocketbook watermark(s) from ebook.".format(count_pocketbook)) return output From fbe9b5ea890b07bce4a1bc0e57ea91778c833efd Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:45:12 +0100 Subject: [PATCH 049/154] Ton of PDF DeDRM updates - Support "Standard" and "Adobe.APS" encryptions - Support decrypting with owner password instead of user password - New function to return encryption filter name - Support for V=5, R=5 and R=6 PDF files - Support for AES256-encrypted PDF files - Disable broken cross-reference streams in output --- DeDRM_plugin/DeDRM_PDF passphrase_Help.htm | 39 +++ DeDRM_plugin/__init__.py | 116 +++++-- DeDRM_plugin/config.py | 62 +++- DeDRM_plugin/ignoblekeyNookStudy.py | 2 +- DeDRM_plugin/ineptpdf.py | 368 ++++++++++++++++++--- DeDRM_plugin/prefs.py | 3 + 6 files changed, 513 insertions(+), 77 deletions(-) create mode 100644 DeDRM_plugin/DeDRM_PDF passphrase_Help.htm diff --git a/DeDRM_plugin/DeDRM_PDF passphrase_Help.htm b/DeDRM_plugin/DeDRM_PDF passphrase_Help.htm new file mode 100644 index 00000000..77337e45 --- /dev/null +++ b/DeDRM_plugin/DeDRM_PDF passphrase_Help.htm @@ -0,0 +1,39 @@ + + + + + + +Managing PDF passwords + + + + + +

    Managing PDF passwords

    + +

    PDF files can be protected with a password / passphrase that will be required to open the PDF file. Enter your passphrases in the plugin settings to have the plugin automatically remove this encryption / restriction from PDF files you import.

    + + +

    Entering a passphrase:

    + +

    On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a green plus sign (+). Clicking this button will open a new dialog for entering a new passphrase.

    + +

    Just enter your passphrase for the PDF file, then click the OK button to save the passphrase.

    + +

    Deleting a passphrase:

    + +

    On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a red "X". Clicking this button will delete the highlighted passphrase from the list. You will be prompted once to be sure that’s what you truly mean to do. Once gone, it’s permanently gone.

    + +

    Once done entering/deleting passphrases, click Close to exit the customization dialogue. Your changes will only be saved permanently when you click OK in the main configuration dialog.

    + + + + diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 0afa7125..1571931c 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -609,23 +609,14 @@ def ePubDecrypt(self,path_to_ebook): # No DRM? return self.postProcessEPUB(inf.name) + + + def PDFIneptDecrypt(self, path_to_ebook): + # Sub function to prevent PDFDecrypt from becoming too large ... import calibre_plugins.dedrm.prefs as prefs import calibre_plugins.dedrm.ineptpdf as ineptpdf - import calibre_plugins.dedrm.lcpdedrm as lcpdedrm dedrmprefs = prefs.DeDRM_Prefs() - if (lcpdedrm.isLCPbook(path_to_ebook)): - try: - retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) - except: - print("Looks like that didn't work:") - raise - - return retval - - - # Not an LCP book, do the normal Adobe handling. - book_uuid = None try: # Try to figure out which Adobe account this book is licensed for. @@ -633,12 +624,8 @@ def ePubDecrypt(self,path_to_ebook): except: pass - if book_uuid is None: - print("{0} v{1}: {2} is a PDF ebook".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - else: - print("{0} v{1}: {2} is a PDF ebook for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) - - if book_uuid is not None: + if book_uuid is not None: + print("{0} v{1}: {2} is a PDF ebook (EBX) for UUID {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), book_uuid)) # Check if we have a key for that UUID for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): if not book_uuid.lower() in keyname.lower(): @@ -800,10 +787,89 @@ def ePubDecrypt(self,path_to_ebook): print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) + def PDFStandardDecrypt(self, path_to_ebook): + # Sub function to prevent PDFDecrypt from becoming too large ... + import calibre_plugins.dedrm.prefs as prefs + import calibre_plugins.dedrm.ineptpdf as ineptpdf + dedrmprefs = prefs.DeDRM_Prefs() - # Something went wrong with decryption. - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + # Attempt to decrypt PDF with each encryption key (generated or provided). + i = -1 + for userpassword in [""] + dedrmprefs['adobe_pdf_passphrases']: + # Try the empty password, too. + i = i + 1 + userpassword = bytearray(userpassword, "utf-8") + if i == 0: + print("{0} v{1}: Trying empty password ... ".format(PLUGIN_NAME, PLUGIN_VERSION), end="") + else: + print("{0} v{1}: Trying password {2} ... ".format(PLUGIN_NAME, PLUGIN_VERSION, i), end="") + of = self.temporary_file(".pdf") + + # Give the user password, ebook and TemporaryPersistent file to the decryption function. + msg = False + try: + result = ineptpdf.decryptBook(userpassword, path_to_ebook, of.name) + print("done") + msg = True + except ineptpdf.ADEPTInvalidPasswordError: + print("invalid password".format(PLUGIN_NAME, PLUGIN_VERSION)) + msg = True + result = 1 + except: + print("exception\n{0} v{1}: Exception when decrypting after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + msg = True + traceback.print_exc() + result = 1 + if not msg: + print("error\n{0} v{1}: Failed to decrypt after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + + of.close() + + if result == 0: + # Decryption was successful. + # Return the modified PersistentTemporary file to calibre. + print("{0} v{1}: Successfully decrypted with password {3} after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime, i)) + return of.name + + print("{0} v{1}: Didn't manage to decrypt PDF. Make sure the correct password is entered in the settings.".format(PLUGIN_NAME, PLUGIN_VERSION)) + + + + def PDFDecrypt(self,path_to_ebook): + import calibre_plugins.dedrm.prefs as prefs + import calibre_plugins.dedrm.ineptpdf as ineptpdf + import calibre_plugins.dedrm.lcpdedrm as lcpdedrm + dedrmprefs = prefs.DeDRM_Prefs() + + if (lcpdedrm.isLCPbook(path_to_ebook)): + try: + retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) + except: + print("Looks like that didn't work:") + raise + + return retval + + # Not an LCP book, do the normal Adobe handling. + + pdf_encryption = ineptpdf.getPDFencryptionType(path_to_ebook) + if pdf_encryption is None: + print("{0} v{1}: {2} is an unencrypted PDF file - returning as is.".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) + return path_to_ebook + + print("{0} v{1}: {2} is a PDF ebook with encryption {3}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook), pdf_encryption)) + + if pdf_encryption == "EBX_HANDLER": + # Adobe eBook / ADEPT (normal or B&N) + return self.PDFIneptDecrypt(path_to_ebook) + elif pdf_encryption == "Standard" or pdf_encryption == "Adobe.APS": + return self.PDFStandardDecrypt(path_to_ebook) + elif pdf_encryption == "FOPN_fLock" or pdf_encryption == "FOPN_foweb": + print("{0} v{1}: FileOpen encryption '{2}' is unsupported.".format(PLUGIN_NAME, PLUGIN_VERSION, pdf_encryption)) + print("{0} v{1}: Try the standalone script from the 'Tetrachroma_FileOpen_ineptpdf' folder in the Github repo.".format(PLUGIN_NAME, PLUGIN_VERSION)) + else: + print("{0} v{1}: Encryption '{2}' is unsupported.".format(PLUGIN_NAME, PLUGIN_VERSION, pdf_encryption)) + return path_to_ebook def KindleMobiDecrypt(self,path_to_ebook): @@ -815,7 +881,7 @@ def KindleMobiDecrypt(self,path_to_ebook): # extracted to the appropriate places beforehand these routines # look for them. import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.k4mobidedrm + import calibre_plugins.dedrm.k4mobidedrm as k4mobidedrm dedrmprefs = prefs.DeDRM_Prefs() pids = dedrmprefs['pids'] @@ -883,7 +949,7 @@ def KindleMobiDecrypt(self,path_to_ebook): def eReaderDecrypt(self,path_to_ebook): import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.erdr2pml + import calibre_plugins.dedrm.erdr2pml as erdr2pml dedrmprefs = prefs.DeDRM_Prefs() # Attempt to decrypt epub with each encryption key (generated or provided). @@ -927,7 +993,7 @@ def run(self, path_to_ebook): decrypted_ebook = self.eReaderDecrypt(path_to_ebook) pass elif booktype == 'pdf': - # Adobe Adept PDF (hopefully) + # Adobe PDF (hopefully) decrypted_ebook = self.PDFDecrypt(path_to_ebook) pass elif booktype == 'epub': diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index a09110f4..1c556842 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -90,6 +90,7 @@ def __init__(self, plugin_path, alfdir): self.tempdedrmprefs['deobfuscate_fonts'] = self.dedrmprefs['deobfuscate_fonts'] self.tempdedrmprefs['remove_watermarks'] = self.dedrmprefs['remove_watermarks'] self.tempdedrmprefs['lcp_passphrases'] = list(self.dedrmprefs['lcp_passphrases']) + self.tempdedrmprefs['adobe_pdf_passphrases'] = list(self.dedrmprefs['adobe_pdf_passphrases']) # Start Qt Gui dialog layout layout = QVBoxLayout(self) @@ -122,7 +123,7 @@ def __init__(self, plugin_path, alfdir): self.kindle_android_button.clicked.connect(self.kindle_android) self.kindle_serial_button = QtGui.QPushButton(self) self.kindle_serial_button.setToolTip(_("Click to manage eInk Kindle serial numbers for Kindle ebooks")) - self.kindle_serial_button.setText("eInk Kindle ebooks") + self.kindle_serial_button.setText("Kindle eInk ebooks") self.kindle_serial_button.clicked.connect(self.kindle_serials) self.kindle_key_button = QtGui.QPushButton(self) self.kindle_key_button.setToolTip(_("Click to manage keys for Kindle for Mac/PC ebooks")) @@ -144,14 +145,23 @@ def __init__(self, plugin_path, alfdir): self.lcp_button.setToolTip(_("Click to manage passphrases for Readium LCP ebooks")) self.lcp_button.setText("Readium LCP ebooks") self.lcp_button.clicked.connect(self.readium_lcp_keys) + self.pdf_keys_button = QtGui.QPushButton(self) + self.pdf_keys_button.setToolTip(_("Click to manage PDF file passphrases")) + self.pdf_keys_button.setText("Adobe PDF passwords") + self.pdf_keys_button.clicked.connect(self.pdf_passphrases) + button_layout.addWidget(self.kindle_serial_button) button_layout.addWidget(self.kindle_android_button) + button_layout.addWidget(self.kindle_key_button) + button_layout.addSpacing(15) + button_layout.addWidget(self.adept_button) button_layout.addWidget(self.bandn_button) + button_layout.addWidget(self.pdf_keys_button) + button_layout.addSpacing(15) button_layout.addWidget(self.mobi_button) button_layout.addWidget(self.ereader_button) - button_layout.addWidget(self.adept_button) - button_layout.addWidget(self.kindle_key_button) button_layout.addWidget(self.lcp_button) + self.chkFontObfuscation = QtGui.QCheckBox(_("Deobfuscate EPUB fonts")) self.chkFontObfuscation.setToolTip("Deobfuscates fonts in EPUB files after DRM removal") @@ -207,6 +217,10 @@ def readium_lcp_keys(self): d = ManageKeysDialog(self,"Readium LCP passphrase",self.tempdedrmprefs['lcp_passphrases'], AddLCPKeyDialog) d.exec_() + def pdf_passphrases(self): + d = ManageKeysDialog(self,"PDF passphrase",self.tempdedrmprefs['adobe_pdf_passphrases'], AddPDFPassDialog) + d.exec_() + def help_link_activated(self, url): def get_help_file_resource(): # Copy the HTML helpfile to the plugin directory each time the @@ -232,6 +246,7 @@ def save_settings(self): self.dedrmprefs.set('deobfuscate_fonts', self.chkFontObfuscation.isChecked()) self.dedrmprefs.set('remove_watermarks', self.chkRemoveWatermarks.isChecked()) self.dedrmprefs.set('lcp_passphrases', self.tempdedrmprefs['lcp_passphrases']) + self.dedrmprefs.set('adobe_pdf_passphrases', self.tempdedrmprefs['adobe_pdf_passphrases']) self.dedrmprefs.writeprefs() def load_resource(self, name): @@ -1480,3 +1495,44 @@ def accept(self): errmsg = "Please enter your LCP passphrase or click Cancel in the dialog." return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) QDialog.accept(self) + +class AddPDFPassDialog(QDialog): + def __init__(self, parent=None,): + QDialog.__init__(self, parent) + self.parent = parent + self.setWindowTitle("{0} {1}: Add new PDF passphrase".format(PLUGIN_NAME, PLUGIN_VERSION)) + layout = QVBoxLayout(self) + self.setLayout(layout) + + data_group_box = QGroupBox("", self) + layout.addWidget(data_group_box) + data_group_box_layout = QVBoxLayout() + data_group_box.setLayout(data_group_box_layout) + + key_group = QHBoxLayout() + data_group_box_layout.addLayout(key_group) + key_group.addWidget(QLabel("PDF password:", self)) + self.key_ledit = QLineEdit("", self) + self.key_ledit.setToolTip("Enter the PDF file password.") + key_group.addWidget(self.key_ledit) + + self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.button_box.accepted.connect(self.accept) + self.button_box.rejected.connect(self.reject) + layout.addWidget(self.button_box) + + self.resize(self.sizeHint()) + + @property + def key_name(self): + return None + + @property + def key_value(self): + return str(self.key_ledit.text()) + + def accept(self): + if len(self.key_value) == 0 or self.key_value.isspace(): + errmsg = "Please enter a PDF password or click Cancel in the dialog." + return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) + QDialog.accept(self) diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index ea9785a1..4152093d 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# ignoblekey.py +# ignoblekeyNookStudy.py # Copyright © 2015-2020 Apprentice Alf, Apprentice Harper et al. # Based on kindlekey.py, Copyright © 2010-2013 by some_updates and Apprentice Alf diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 51ca17e3..9a100963 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -3,6 +3,7 @@ # ineptpdf.py # Copyright © 2009-2020 by i♥cabbages, Apprentice Harper et al. +# Copyright © 2021 by noDRM # Released under the terms of the GNU General Public Licence, version 3 # @@ -46,13 +47,14 @@ # 8.0.5 - Do not process DRM-free documents # 8.0.6 - Replace use of float by Decimal for greater precision, and import tkFileDialog # 9.0.0 - Add Python 3 compatibility for calibre 5 +# 9.1.0 - Support for decrypting with owner password, support for V=5, R=5 and R=6 PDF files, support for AES256-encrypted PDFs. """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "9.0.0" +__version__ = "9.1.0" import codecs import sys @@ -131,6 +133,9 @@ def unicode_argv(): class ADEPTError(Exception): pass +class ADEPTInvalidPasswordError(Exception): + pass + class ADEPTNewVersionError(Exception): pass @@ -184,6 +189,7 @@ def F(restype, name, argtypes): AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p,c_int]) AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) + AES_set_encrypt_key = F(c_int, 'AES_set_encrypt_key',[c_char_p, c_int, AES_KEY_p]) RC4_set_key = F(None,'RC4_set_key',[RC4_KEY_p, c_int, c_char_p]) RC4_crypt = F(None,'RC4',[RC4_KEY_p, c_int, c_char_p, c_char_p]) @@ -236,7 +242,7 @@ def decrypt(self, data): class AES(object): MODE_CBC = 0 @classmethod - def new(cls, userkey, mode, iv): + def new(cls, userkey, mode, iv, decrypt=True): self = AES() self._blocksize = len(userkey) # mode is ignored since CBCMODE is only thing supported/used so far @@ -246,7 +252,11 @@ def new(cls, userkey, mode, iv): return keyctx = self._keyctx = AES_KEY() self._iv = iv - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) + self._isDecrypt = decrypt + if decrypt: + rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) + else: + rv = AES_set_encrypt_key(userkey, len(userkey) * 8, keyctx) if rv < 0: raise ADEPTError('Failed to initialize AES key') return self @@ -255,12 +265,23 @@ def __init__(self): self._keyctx = None self._iv = 0 self._mode = 0 + self._isDecrypt = None def decrypt(self, data): + if not self._isDecrypt: + raise ADEPTError("AES not ready for decryption") out = create_string_buffer(len(data)) rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 0) if rv == 0: raise ADEPTError('AES decryption failed') return out.raw + def encrypt(self, data): + if self._isDecrypt: + raise ADEPTError("AES not ready for encryption") + out = create_string_buffer(len(data)) + rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 1) + if rv == 0: + raise ADEPTError('AES decryption failed') + return out.raw return (ARC4, RSA, AES) @@ -373,14 +394,23 @@ def decrypt(self, data): class AES(object): MODE_CBC = _AES.MODE_CBC @classmethod - def new(cls, userkey, mode, iv): + def new(cls, userkey, mode, iv, decrypt=True): self = AES() self._aes = _AES.new(userkey, mode, iv) + self._decrypt = decrypt return self def __init__(self): self._aes = None + self._decrypt = None def decrypt(self, data): + if not self._decrypt: + raise ADEPTError("AES not ready for decrypt.") + return self._aes.decrypt(data) + def encrypt(self, data): + if self._decrypt: + raise ADEPTError("AES not ready for encrypt.") + return self._aes.encrypt(data) class RSA(object): def __init__(self, der): @@ -422,7 +452,7 @@ def _load_crypto(): # 1 = only if present in input # 2 = always -GEN_XREF_STM = 1 +GEN_XREF_STM = 0 # This is the value for the current document gen_xref_stm = False # will be set in PDFSerializer @@ -1507,6 +1537,16 @@ def initialize(self, password=b'', inept=True): raise PDFEncryptionError('Unknown filter: param=%r' % param) + def initialize_and_return_filter(self): + if not self.encryption: + self.is_printable = self.is_modifiable = self.is_extractable = True + self.ready = True + return None + + (docid, param) = self.encryption + type = literal_name(param['Filter']) + return type + def initialize_adobe_ps(self, password, docid, param): global KEYFILEPATH self.decrypt_key = self.genkey_adobe_ps(param) @@ -1549,30 +1589,178 @@ def genkey_adobe_ps(self, param): PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ b'\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' # experimental aes pw support - def initialize_standard(self, password, docid, param): - # copy from a global variable + + def check_user_password(self, password, docid, param): + V = int_value(param.get('V', 0)) + if V < 5: + return self.check_user_password_V4(password, docid, param) + else: + return self.check_user_password_V5(password, param) + + def check_owner_password(self, password, docid, param): + V = int_value(param.get('V', 0)) + if V < 5: + return self.check_owner_password_V4(password, docid, param) + else: + return self.check_owner_password_V5(password, param) + + def check_user_password_V5(self, password, param): + U = str_value(param['U']) + userdata = U[:32] + salt = U[32:32+8] + # Truncate password: + password = password[:min(127, len(password))] + if self.hash_V5(password, salt, b"", param) == userdata: + return True + return None + + def check_owner_password_V5(self, password, param): + U = str_value(param['U']) + O = str_value(param['O']) + userdata = U[:48] + ownerdata = O[:32] + salt = O[32:32+8] + # Truncate password: + password = password[:min(127, len(password))] + if self.hash_V5(password, salt, userdata, param) == ownerdata: + return True + return None + + def recover_encryption_key_with_password(self, password, docid, param): + # Truncate password: + key_password = password[:min(127, len(password))] + + if self.check_owner_password_V5(key_password, param): + O = str_value(param['O']) + U = str_value(param['U']) + OE = str_value(param['OE']) + key_salt = O[40:40+8] + user_data = U[:48] + encrypted_file_key = OE[:32] + elif self.check_user_password_V5(key_password, param): + U = str_value(param['U']) + UE = str_value(param['UE']) + key_salt = U[40:40+8] + user_data = b"" + encrypted_file_key = UE[:32] + else: + raise Exception("Trying to recover key, but neither user nor owner pass is correct.") + + intermediate_key = self.hash_V5(key_password, key_salt, user_data, param) + + file_key = self.process_with_aes(intermediate_key, False, encrypted_file_key) + + return file_key + + + def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: int = 1, iv: bytes = None): + if iv is None: + keylen = len(key) + iv = bytes([0x00]*keylen) + + if not encrypt: + plaintext = AES.new(key,AES.MODE_CBC,iv, True).decrypt(data) + return plaintext + else: + aes = AES.new(key, AES.MODE_CBC, iv, False) + new_data = bytes(data * repetitions) + crypt = aes.encrypt(new_data) + return crypt + + + def hash_V5(self, password, salt, userdata, param): + R = int_value(param['R']) + K = SHA256(password + salt + userdata) + if R < 6: + return K + elif R == 6: + round_number = 0 + done = False + while (not done): + round_number = round_number + 1 + K1 = password + K + userdata + if len(K1) < 32: + raise Exception("K1 < 32 ...") + #def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: int = 1, iv: bytes = None): + E = self.process_with_aes(K[:16], True, K1, 64, K[16:32]) + + E_mod_3 = 0 + for i in range(16): + E_mod_3 += E[i] + E_mod_3 = E_mod_3 % 3 + + if E_mod_3 == 0: + ctx = hashlib.sha256() + ctx.update(E) + K = ctx.digest() + elif E_mod_3 == 1: + ctx = hashlib.sha384() + ctx.update(E) + K = ctx.digest() + else: + ctx = hashlib.sha512() + ctx.update(E) + K = ctx.digest() + + if round_number >= 64: + ch = int.from_bytes(E[-1:], "big", signed=False) + if ch <= round_number - 32: + done = True + + result = K[0:32] + return result + else: + raise NotImplementedError("Revision > 6 not supported.") + + + def check_owner_password_V4(self, password, docid, param): + + # compute_O_rc4_key: + V = int_value(param.get('V', 0)) + if V >= 5: + raise Exception("compute_O_rc4_key not possible with V>= 5") + + R = int_value(param.get('R', 0)) + + length = int_value(param.get('Length', 40)) # Key length (bits) + password = (password+self.PASSWORD_PADDING)[:32] + hash = hashlib.md5(password) + if R >= 3: + for _ in range(50): + hash = hashlib.md5(hash.digest()[:length//8]) + hash = hash.digest()[:length//8] + + # "hash" is the return value of compute_O_rc4_key + + Odata = str_value(param.get('O')) + # now call iterate_rc4 ... + x = ARC4.new(hash).decrypt(Odata) # 4 + if R >= 3: + for i in range(1,19+1): + k = b''.join(bytes([c ^ i]) for c in hash ) + x = ARC4.new(k).decrypt(x) + + # TODO: remove the padding string from the end of the data! + for ct in range(1, len(x)): + new_x = x[:ct] + enc_key = self.check_user_password(new_x, docid, param) + if enc_key is not None: + return enc_key + + return False + + + + + def check_user_password_V4(self, password, docid, param): + V = int_value(param.get('V', 0)) - if (V <=0 or V > 4): - 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']) - try: - EncMetadata = str_value(param['EncryptMetadata']) - except: - EncMetadata = b'True' - self.is_printable = bool(P & 4) - self.is_modifiable = bool(P & 8) - self.is_extractable = bool(P & 16) - self.is_annotationable = bool(P & 32) - self.is_formsenabled = bool(P & 256) - self.is_textextractable = bool(P & 512) - self.is_assemblable = bool(P & 1024) - self.is_formprintable = bool(P & 2048) + # Algorithm 3.2 password = (password+self.PASSWORD_PADDING)[:32] # 1 hash = hashlib.md5(password) # 2 @@ -1580,9 +1768,13 @@ def initialize_standard(self, password, docid, param): hash.update(struct.pack('= 4: hash.update(codecs.decode(b'ffffffff','hex')) - if 5 <= R: + if R >= 3: # 8 for _ in range(50): hash = hashlib.md5(hash.digest()[:length//8]) @@ -1603,25 +1795,100 @@ def initialize_standard(self, password, docid, param): is_authenticated = (u1 == U) else: is_authenticated = (u1[:16] == U[:16]) - if not is_authenticated: - raise ADEPTError('Password is not correct.') - self.decrypt_key = key + + if is_authenticated: + return key + + return None + + def initialize_standard(self, password, docid, param): + + self.decrypt_key = None + + + # copy from a global variable + V = int_value(param.get('V', 0)) + if (V <=0 or V > 5): + raise PDFEncryptionError('Unknown algorithm: %r' % V) + R = int_value(param['R']) # Revision + if R >= 7: + raise PDFEncryptionError('Unknown revision: %r' % R) + + # check owner pass: + retval = self.check_owner_password(password, docid, param) + if retval is True or retval is not None: + #print("Owner pass is valid - " + str(retval)) + if retval is True: + self.decrypt_key = self.recover_encryption_key_with_password(password, docid, param) + else: + self.decrypt_key = retval + + if self.decrypt_key is None or self.decrypt_key is True or self.decrypt_key is False: + # That's not the owner password. Check if it's the user password. + retval = self.check_user_password(password, docid, param) + if retval is True or retval is not None: + #print("User pass is valid") + if retval is True: + self.decrypt_key = self.recover_encryption_key_with_password(password, docid, param) + else: + self.decrypt_key = retval + + if self.decrypt_key is None or self.decrypt_key is True or self.decrypt_key is False: + raise ADEPTInvalidPasswordError("Password invalid.") + + + P = int_value(param['P']) + + self.is_printable = bool(P & 4) + self.is_modifiable = bool(P & 8) + self.is_extractable = bool(P & 16) + self.is_annotationable = bool(P & 32) + self.is_formsenabled = bool(P & 256) + self.is_textextractable = bool(P & 512) + self.is_assemblable = bool(P & 1024) + self.is_formprintable = bool(P & 2048) + + # genkey method - if V == 1 or V == 2: + if V == 1 or V == 2 or V == 4: self.genkey = self.genkey_v2 elif V == 3: self.genkey = self.genkey_v3 - elif V == 4: - self.genkey = self.genkey_v2 - #self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 + elif V >= 5: + self.genkey = self.genkey_v5 + + set_decipher = False + + if V >= 4: + # Check if we need new genkey_v4 - only if we're using AES. + try: + for key in param['CF']: + algo = str(param["CF"][key]["CFM"]) + if algo == "/AESV2": + if V == 4: + self.genkey = self.genkey_v4 + set_decipher = True + self.decipher = self.decrypt_aes + elif algo == "/AESV3": + if V == 4: + self.genkey = self.genkey_v4 + set_decipher = True + self.decipher = self.decrypt_aes + elif algo == "/V2": + set_decipher = True + self.decipher = self.decrypt_rc4 + except: + pass + # rc4 - if V != 4: - self.decipher = self.decipher_rc4 # XXX may be AES + if V < 4: + self.decipher = self.decrypt_rc4 # XXX may be AES # aes - elif V == 4 and length == 128: - self.decipher = self.decipher_aes - elif V == 4 and length == 256: - raise PDFNotImplementedError('AES256 encryption is currently unsupported') + if not set_decipher: + # This should usually already be set by now. + # If it's not, assume that V4 and newer are using AES + if V >= 4: + self.decipher = self.decrypt_aes self.ready = True return @@ -1776,17 +2043,11 @@ def genkey_v4(self, objid, genno): key = hash.digest()[:min(len(self.decrypt_key) + 5, 16)] return key - def decrypt_aes(self, objid, genno, data): - key = self.genkey(objid, genno) - ivector = data[:16] - data = data[16:] - plaintext = AES.new(key,AES.MODE_CBC,ivector).decrypt(data) - # remove pkcs#5 aes padding - cutter = -1 * plaintext[-1] - plaintext = plaintext[:cutter] - return plaintext + def genkey_v5(self, objid, genno): + # Looks like they stopped this useless obfuscation. + return self.decrypt_key - def decrypt_aes256(self, objid, genno, data): + def decrypt_aes(self, objid, genno, data): key = self.genkey(objid, genno) ivector = data[:16] data = data[16:] @@ -2330,6 +2591,17 @@ def decryptBook(userkey, inpath, outpath, inept=True): return 0 +def getPDFencryptionType(inpath): + if RSA is None: + raise ADEPTError("PyCryptodome or OpenSSL must be installed.") + with open(inpath, 'rb') as inf: + doc = doc = PDFDocument() + parser = PDFParser(doc, inf) + filter = doc.initialize_and_return_filter() + return filter + + + def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index c83e0a5e..aee4846d 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -31,6 +31,7 @@ def __init__(self): self.dedrmprefs.defaults['pids'] = [] self.dedrmprefs.defaults['serials'] = [] self.dedrmprefs.defaults['lcp_passphrases'] = [] + self.dedrmprefs.defaults['adobe_pdf_passphrases'] = [] self.dedrmprefs.defaults['adobewineprefix'] = "" self.dedrmprefs.defaults['kindlewineprefix'] = "" @@ -54,6 +55,8 @@ def __init__(self): self.dedrmprefs['serials'] = [] if self.dedrmprefs['lcp_passphrases'] == []: self.dedrmprefs['lcp_passphrases'] = [] + if self.dedrmprefs['adobe_pdf_passphrases'] == []: + self.dedrmprefs['adobe_pdf_passphrases'] = [] def __getitem__(self,kind = None): if kind is not None: From 9c6f4ecc3b6e5ddf5e180df149ee0bc1f581f9fc Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:45:36 +0100 Subject: [PATCH 050/154] Fix broken key management --- DeDRM_plugin/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 1c556842..9a7c4934 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -377,7 +377,7 @@ def add_key(self): # New key generation cancelled. return - if d.k_key_list is not None: + if hasattr(d, "k_key_list") and d.k_key_list is not None: # importing multiple keys idx = -1 dup_key_count = 0 From c11db59150fe0dd05d274b37daf9cc0cd4b8a716 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 10:46:27 +0100 Subject: [PATCH 051/154] Update Changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e14c4079..2f3a65d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,3 +46,11 @@ List of changes since the fork of Apprentice Harper's repository: - Support extracting the B&N / Nook key from a data dump of the NOOK Android application. - Support adding an existing PassHash / B&N key base64 string without having to write it to a file first. - Support extracting PassHash keys from Adobe Digital Editions. +- Fix a bug that might have stopped the eReader PDB DRM removal from working (untested, I don't have any PDB books) +- Fix a bug where the watermark removal code wouldn't run for DRM-free files. +- ineptpdf: Add code to plugin to support "Standard" (tested) and "Adobe.APS" (untested) encrypted PDFs using the ineptpdf implementation (PDF passwords can be entered in the plugin settings) +- ineptpdf: Support for decrypting PDF with owner password instead of user password. +- ineptpdf: Add function to return Filter name. +- ineptpdf: Support for V=5, R=5 and R=6 PDF files, and for AES256-encrypted PDFs. +- ineptpdf: Disable cross-reference streams in the output file. This may make PDFs slightly larger, but the current code for cross-reference streams seems to be buggy and sometimes creates corrupted PDFs. +- Drop support for importing key data from the ancient, pre "DeDRM" Calibre plugins ("Ignoble Epub DeDRM", "eReader PDB 2 PML" and "K4MobiDeDRM"). These are from 2011, I doubt anyone still has these installed, I can't even find a working link for these to test them. If you still have encryption keys in one of these plugins, you will need to update to DeDRM v10.0.2 or older (to convert the keys) before updating to DeDRM v10.0.3 or newer. From 80f511ade93cebbf93a3d32bb1f7e8ab64335dd5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 27 Dec 2021 14:23:26 +0100 Subject: [PATCH 052/154] Correct user pass padding, fix PDFStream export --- DeDRM_plugin/__init__.py | 1 + DeDRM_plugin/ineptpdf.py | 23 ++++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 1571931c..b0a5e4b4 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -867,6 +867,7 @@ def PDFDecrypt(self,path_to_ebook): elif pdf_encryption == "FOPN_fLock" or pdf_encryption == "FOPN_foweb": print("{0} v{1}: FileOpen encryption '{2}' is unsupported.".format(PLUGIN_NAME, PLUGIN_VERSION, pdf_encryption)) print("{0} v{1}: Try the standalone script from the 'Tetrachroma_FileOpen_ineptpdf' folder in the Github repo.".format(PLUGIN_NAME, PLUGIN_VERSION)) + return path_to_ebook else: print("{0} v{1}: Encryption '{2}' is unsupported.".format(PLUGIN_NAME, PLUGIN_VERSION, pdf_encryption)) return path_to_ebook diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 9a100963..9bbf0921 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -67,6 +67,7 @@ from decimal import Decimal import itertools import xml.etree.ElementTree as etree +import traceback # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get @@ -1740,12 +1741,19 @@ def check_owner_password_V4(self, password, docid, param): k = b''.join(bytes([c ^ i]) for c in hash ) x = ARC4.new(k).decrypt(x) - # TODO: remove the padding string from the end of the data! - for ct in range(1, len(x)): - new_x = x[:ct] - enc_key = self.check_user_password(new_x, docid, param) - if enc_key is not None: - return enc_key + + # "x" is now the padded user password. + + # If we wanted to recover / extract the user password, + # we'd need to trim off the padding string from the end. + # As we just want to get access to the encryption key, + # we can just hand the password into the check_user_password + # as it is, as that function would be adding padding anyways. + # This trick only works with V4 and lower. + + enc_key = self.check_user_password(x, docid, param) + if enc_key is not None: + return enc_key return False @@ -2553,7 +2561,7 @@ def serialize_object(self, obj): ### are no longer useful, as we have extracted all objects from ### them. Therefore leave them out from the output. if obj.dic.get('Type') == LITERAL_OBJSTM and not gen_xref_stm: - self.write('(deleted)') + self.write(b'(deleted)') else: data = obj.get_decdata() self.serialize_object(obj.dic) @@ -2587,6 +2595,7 @@ def decryptBook(userkey, inpath, outpath, inept=True): serializer.dump(outf) except Exception as e: print("error writing pdf: {0}".format(e)) + traceback.print_exc() return 2 return 0 From 9c40b3ce5a0e2d3f0c74e6a816947a81778a3c4b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 29 Dec 2021 09:14:35 +0100 Subject: [PATCH 053/154] Cleanup --- .gitignore | 6 +- CALIBRE_CLI_INSTRUCTIONS.md | 6 +- DeDRM_plugin/DeDRM_Help.htm | 2 +- DeDRM_plugin/__init__.py | 4 +- ...{activitybar.py => _unused_activitybar.py} | 2 + ...twidget.py => _unused_scrolltextwidget.py} | 3 + DeDRM_plugin/ignobleepub.py | 448 ------------------ DeDRM_plugin/scriptinterface.py | 12 +- DeDRM_plugin/topazextract.py | 4 +- 9 files changed, 24 insertions(+), 463 deletions(-) rename DeDRM_plugin/{activitybar.py => _unused_activitybar.py} (98%) rename DeDRM_plugin/{scrolltextwidget.py => _unused_scrolltextwidget.py} (97%) delete mode 100644 DeDRM_plugin/ignobleepub.py diff --git a/.gitignore b/.gitignore index 4564a126..f3f3d471 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,8 @@ .DS_Store # local test data -/user_data/ \ No newline at end of file +/user_data/ + +# Cache +/DeDRM_plugin/__pycache__ +/DeDRM_plugin/standalone/__pycache__ \ No newline at end of file diff --git a/CALIBRE_CLI_INSTRUCTIONS.md b/CALIBRE_CLI_INSTRUCTIONS.md index 9c1359f8..0d7dbd4c 100644 --- a/CALIBRE_CLI_INSTRUCTIONS.md +++ b/CALIBRE_CLI_INSTRUCTIONS.md @@ -13,16 +13,16 @@ platforms. #### Install plugins - Download the DeDRM `.zip` archive from DeDRM_tools' - [latest release](https://github.com/apprenticeharper/DeDRM_tools/releases/latest). + [latest release](https://github.com/noDRM/DeDRM_tools/releases/latest). Then unzip it. - Add the DeDRM plugin to Calibre: ``` cd *the unzipped DeDRM_tools folder* - calibre-customize --add DeDRM_calibre_plugin/DeDRM_plugin.zip + calibre-customize --add DeDRM_plugin.zip ``` - Add the Obok plugin: ``` - calibre-customize --add Obok_calibre_plugin/obok_plugin.zip + calibre-customize --add Obok_plugin.zip ``` #### Enter your keys diff --git a/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_plugin/DeDRM_Help.htm index 6ec385ca..c5a92ac6 100644 --- a/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_plugin/DeDRM_Help.htm @@ -46,7 +46,7 @@

    Troubleshooting:

    Credits:

      -
    • NoDRM for a bunch of updates and the Readium LCP support
    • +
    • NoDRM for a bunch of updates and maintenance since November 2021, and the Readium LCP support
    • The Dark Reverser for the Mobipocket and eReader scripts
    • i♥cabbages for the Adobe Digital Editions scripts
    • Skindle aka Bart Simpson for the Amazon Kindle for PC script
    • diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index b0a5e4b4..ab9bcf74 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -994,11 +994,11 @@ def run(self, path_to_ebook): decrypted_ebook = self.eReaderDecrypt(path_to_ebook) pass elif booktype == 'pdf': - # Adobe PDF (hopefully) + # Adobe PDF (hopefully) or LCP PDF decrypted_ebook = self.PDFDecrypt(path_to_ebook) pass elif booktype == 'epub': - # Adobe Adept or B&N ePub + # Adobe Adept, PassHash (B&N) or LCP ePub decrypted_ebook = self.ePubDecrypt(path_to_ebook) else: print("Unknown booktype {0}. Passing back to calibre unchanged".format(booktype)) diff --git a/DeDRM_plugin/activitybar.py b/DeDRM_plugin/_unused_activitybar.py similarity index 98% rename from DeDRM_plugin/activitybar.py rename to DeDRM_plugin/_unused_activitybar.py index bec991aa..8ebc10c8 100644 --- a/DeDRM_plugin/activitybar.py +++ b/DeDRM_plugin/_unused_activitybar.py @@ -1,3 +1,5 @@ +# I think this file is unused? + import sys import tkinter import tkinter.constants diff --git a/DeDRM_plugin/scrolltextwidget.py b/DeDRM_plugin/_unused_scrolltextwidget.py similarity index 97% rename from DeDRM_plugin/scrolltextwidget.py rename to DeDRM_plugin/_unused_scrolltextwidget.py index c95a2641..5969ea1b 100644 --- a/DeDRM_plugin/scrolltextwidget.py +++ b/DeDRM_plugin/_unused_scrolltextwidget.py @@ -1,6 +1,9 @@ #!/usr/bin/env python # vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab +# I think this file is unused? + + import tkinter import tkinter.constants diff --git a/DeDRM_plugin/ignobleepub.py b/DeDRM_plugin/ignobleepub.py deleted file mode 100644 index e1cd88fa..00000000 --- a/DeDRM_plugin/ignobleepub.py +++ /dev/null @@ -1,448 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# ignobleepub.py -# Copyright © 2009-2020 by i♥cabbages, Apprentice Harper et al. - -# Released under the terms of the GNU General Public Licence, version 3 -# - -# -# Revision history: -# 1 - Initial release -# 2 - Added OS X support by using OpenSSL when available -# 3 - screen out improper key lengths to prevent segfaults on Linux -# 3.1 - Allow Windows versions of libcrypto to be found -# 3.2 - add support for encoding to 'utf-8' when building up list of files to decrypt from encryption.xml -# 3.3 - On Windows try PyCrypto first, OpenSSL next -# 3.4 - Modify interface to allow use with import -# 3.5 - Fix for potential problem with PyCrypto -# 3.6 - Revised to allow use in calibre plugins to eliminate need for duplicate code -# 3.7 - Tweaked to match ineptepub more closely -# 3.8 - Fixed to retain zip file metadata (e.g. file modification date) -# 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility -# 4.0 - Work if TkInter is missing -# 4.1 - Import tkFileDialog, don't assume something else will import it. -# 5.0 - Python 3 for calibre 5.0 - -""" -Decrypt Barnes & Noble encrypted ePub books. -""" - -__license__ = 'GPL v3' -__version__ = "5.0" - -import sys -import os -import traceback -import base64 -import zlib -import zipfile -from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED -from contextlib import closing -import xml.etree.ElementTree as etree - -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - return ["ineptepub.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - - -class IGNOBLEError(Exception): - pass - -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if iswindows: - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise IGNOBLEError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', - [c_char_p, c_int, AES_KEY_p]) - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', - [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, - c_int]) - - class AES(object): - def __init__(self, userkey): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise IGNOBLEError('AES improper key used') - return - key = self._key = AES_KEY() - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) - if rv < 0: - raise IGNOBLEError('Failed to initialize AES key') - - def decrypt(self, data): - out = create_string_buffer(len(data)) - iv = (b'\x00' * self._blocksize) - rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0) - if rv == 0: - raise IGNOBLEError('AES decryption failed') - return out.raw - - return AES - -def _load_crypto_pycrypto(): - from Crypto.Cipher import AES as _AES - - class AES(object): - def __init__(self, key): - self._aes = _AES.new(key, _AES.MODE_CBC, b'\x00'*16) - - def decrypt(self, data): - return self._aes.decrypt(data) - - return AES - -def _load_crypto(): - AES = None - cryptolist = (_load_crypto_libcrypto, _load_crypto_pycrypto) - if sys.platform.startswith('win'): - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - AES = loader() - break - except (ImportError, IGNOBLEError): - pass - return AES - -AES = _load_crypto() - -META_NAMES = ('mimetype', 'META-INF/rights.xml', 'META-INF/encryption.xml') -NSMAP = {'adept': 'http://ns.adobe.com/adept', - 'enc': 'http://www.w3.org/2001/04/xmlenc#'} - -class Decryptor(object): - def __init__(self, bookkey, encryption): - enc = lambda tag: '{%s}%s' % (NSMAP['enc'], tag) - self._aes = AES(bookkey) - encryption = etree.fromstring(encryption) - self._encrypted = encrypted = set() - expr = './%s/%s/%s' % (enc('EncryptedData'), enc('CipherData'), - enc('CipherReference')) - for elem in encryption.findall(expr): - path = elem.get('URI', None) - if path is not None: - path = path.encode('utf-8') - encrypted.add(path) - - def decompress(self, bytes): - dc = zlib.decompressobj(-15) - bytes = dc.decompress(bytes) - ex = dc.decompress(b'Z') + dc.flush() - if ex: - bytes = bytes + ex - return bytes - - def decrypt(self, path, data): - if bytes(path,'utf-8') in self._encrypted: - data = self._aes.decrypt(data)[16:] - data = data[:-data[-1]] - data = self.decompress(data) - return data - -# check file to make check whether it's probably an Adobe Adept encrypted ePub -def ignobleBook(inpath): - with closing(ZipFile(open(inpath, 'rb'))) as inf: - namelist = set(inf.namelist()) - if 'META-INF/rights.xml' not in namelist or \ - 'META-INF/encryption.xml' not in namelist: - return False - try: - rights = etree.fromstring(inf.read('META-INF/rights.xml')) - adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) - expr = './/%s' % (adept('encryptedKey'),) - bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) == 64: - return True - except: - # if we couldn't check, assume it is - return True - return False - -def decryptBook(keyb64, inpath, outpath): - if AES is None: - raise IGNOBLEError("PyCrypto or OpenSSL must be installed.") - key = base64.b64decode(keyb64)[:16] - aes = AES(key) - with closing(ZipFile(open(inpath, 'rb'))) as inf: - namelist = set(inf.namelist()) - if 'META-INF/rights.xml' not in namelist or \ - 'META-INF/encryption.xml' not in namelist: - print("{0:s} is DRM-free.".format(os.path.basename(inpath))) - return 1 - for name in META_NAMES: - namelist.remove(name) - try: - rights = etree.fromstring(inf.read('META-INF/rights.xml')) - adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) - expr = './/%s' % (adept('encryptedKey'),) - bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) != 64: - print("{0:s} is not a secure Barnes & Noble ePub.".format(os.path.basename(inpath))) - return 1 - bookkey = aes.decrypt(base64.b64decode(bookkey)) - bookkey = bookkey[:-bookkey[-1]] - encryption = inf.read('META-INF/encryption.xml') - decryptor = Decryptor(bookkey[-16:], encryption) - kwds = dict(compression=ZIP_DEFLATED, allowZip64=False) - with closing(ZipFile(open(outpath, 'wb'), 'w', **kwds)) as outf: - zi = ZipInfo('mimetype') - zi.compress_type=ZIP_STORED - try: - # if the mimetype is present, get its info, including time-stamp - oldzi = inf.getinfo('mimetype') - # copy across fields to be preserved - zi.date_time = oldzi.date_time - zi.comment = oldzi.comment - zi.extra = oldzi.extra - zi.internal_attr = oldzi.internal_attr - # external attributes are dependent on the create system, so copy both. - zi.external_attr = oldzi.external_attr - zi.create_system = oldzi.create_system - except: - pass - outf.writestr(zi, inf.read('mimetype')) - for path in namelist: - data = inf.read(path) - zi = ZipInfo(path) - zi.compress_type=ZIP_DEFLATED - try: - # get the file info, including time-stamp - oldzi = inf.getinfo(path) - # copy across useful fields - zi.date_time = oldzi.date_time - zi.comment = oldzi.comment - zi.extra = oldzi.extra - zi.internal_attr = oldzi.internal_attr - # external attributes are dependent on the create system, so copy both. - zi.external_attr = oldzi.external_attr - zi.create_system = oldzi.create_system - except: - pass - outf.writestr(zi, decryptor.decrypt(path, data)) - except: - print("Could not decrypt {0:s} because of an exception:\n{1:s}".format(os.path.basename(inpath), traceback.format_exc())) - return 2 - return 0 - - -def cli_main(): - sys.stdout=SafeUnbuffered(sys.stdout) - sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() - progname = os.path.basename(argv[0]) - if len(argv) != 4: - print("usage: {0} ".format(progname)) - return 1 - keypath, inpath, outpath = argv[1:] - userkey = open(keypath,'rb').read() - result = decryptBook(userkey, inpath, outpath) - if result == 0: - print("Successfully decrypted {0:s} as {1:s}".format(os.path.basename(inpath),os.path.basename(outpath))) - return result - -def gui_main(): - try: - import tkinter - import tkinter.constants - import tkinter.filedialog - import tkinter.messagebox - import traceback - except: - return cli_main() - - class DecryptionDialog(tkinter.Frame): - def __init__(self, root): - tkinter.Frame.__init__(self, root, border=5) - self.status = tkinter.Label(self, text="Select files for decryption") - self.status.pack(fill=tkinter.constants.X, expand=1) - body = tkinter.Frame(self) - body.pack(fill=tkinter.constants.X, expand=1) - sticky = tkinter.constants.E + tkinter.constants.W - body.grid_columnconfigure(1, weight=2) - tkinter.Label(body, text="Key file").grid(row=0) - self.keypath = tkinter.Entry(body, width=30) - self.keypath.grid(row=0, column=1, sticky=sticky) - if os.path.exists("bnepubkey.b64"): - self.keypath.insert(0, "bnepubkey.b64") - button = tkinter.Button(body, text="...", command=self.get_keypath) - button.grid(row=0, column=2) - tkinter.Label(body, text="Input file").grid(row=1) - self.inpath = tkinter.Entry(body, width=30) - self.inpath.grid(row=1, column=1, sticky=sticky) - button = tkinter.Button(body, text="...", command=self.get_inpath) - button.grid(row=1, column=2) - tkinter.Label(body, text="Output file").grid(row=2) - self.outpath = tkinter.Entry(body, width=30) - self.outpath.grid(row=2, column=1, sticky=sticky) - button = tkinter.Button(body, text="...", command=self.get_outpath) - button.grid(row=2, column=2) - buttons = tkinter.Frame(self) - buttons.pack() - botton = tkinter.Button( - buttons, text="Decrypt", width=10, command=self.decrypt) - botton.pack(side=tkinter.constants.LEFT) - tkinter.Frame(buttons, width=10).pack(side=tkinter.constants.LEFT) - button = tkinter.Button( - buttons, text="Quit", width=10, command=self.quit) - button.pack(side=tkinter.constants.RIGHT) - - def get_keypath(self): - keypath = tkinter.filedialog.askopenfilename( - parent=None, title="Select Barnes & Noble \'.b64\' key file", - defaultextension=".b64", - filetypes=[('base64-encoded files', '.b64'), - ('All Files', '.*')]) - if keypath: - keypath = os.path.normpath(keypath) - self.keypath.delete(0, tkinter.constants.END) - self.keypath.insert(0, keypath) - return - - def get_inpath(self): - inpath = tkinter.filedialog.askopenfilename( - parent=None, title="Select B&N-encrypted ePub file to decrypt", - defaultextension=".epub", filetypes=[('ePub files', '.epub')]) - if inpath: - inpath = os.path.normpath(inpath) - self.inpath.delete(0, tkinter.constants.END) - self.inpath.insert(0, inpath) - return - - def get_outpath(self): - outpath = tkinter.filedialog.asksaveasfilename( - parent=None, title="Select unencrypted ePub file to produce", - defaultextension=".epub", filetypes=[('ePub files', '.epub')]) - if outpath: - outpath = os.path.normpath(outpath) - self.outpath.delete(0, tkinter.constants.END) - self.outpath.insert(0, outpath) - return - - def decrypt(self): - keypath = self.keypath.get() - inpath = self.inpath.get() - outpath = self.outpath.get() - if not keypath or not os.path.exists(keypath): - self.status['text'] = "Specified key file does not exist" - return - if not inpath or not os.path.exists(inpath): - self.status['text'] = "Specified input file does not exist" - return - if not outpath: - self.status['text'] = "Output file not specified" - return - if inpath == outpath: - self.status['text'] = "Must have different input and output files" - return - userkey = open(keypath,'rb').read() - self.status['text'] = "Decrypting..." - try: - decrypt_status = decryptBook(userkey, inpath, outpath) - except Exception as e: - self.status['text'] = "Error: {0}".format(e.args[0]) - return - if decrypt_status == 0: - self.status['text'] = "File successfully decrypted" - else: - self.status['text'] = "The was an error decrypting the file." - - root = tkinter.Tk() - root.title("Barnes & Noble ePub Decrypter v.{0}".format(__version__)) - root.resizable(True, False) - root.minsize(300, 0) - DecryptionDialog(root).pack(fill=tkinter.constants.X, expand=1) - root.mainloop() - return 0 - -if __name__ == '__main__': - if len(sys.argv) > 1: - sys.exit(cli_main()) - sys.exit(gui_main()) diff --git a/DeDRM_plugin/scriptinterface.py b/DeDRM_plugin/scriptinterface.py index 25a6c094..1810237e 100644 --- a/DeDRM_plugin/scriptinterface.py +++ b/DeDRM_plugin/scriptinterface.py @@ -50,8 +50,8 @@ def decryptepub(infile, outdir, rscpath): errlog += traceback.format_exc() errlog += str(e) rv = 1 - # now try with ignoble epub - elif ignobleepub.ignobleBook(zippath): + + # now try with ignoble epub # try with any keyfiles (*.b64) in the rscpath files = os.listdir(rscpath) filefilter = re.compile("\.b64$", re.IGNORECASE) @@ -62,7 +62,7 @@ def decryptepub(infile, outdir, rscpath): userkey = open(keypath,'r').read() #print userkey try: - rv = ignobleepub.decryptBook(userkey, zippath, outfile) + rv = ineptepub.decryptBook(userkey, zippath, outfile) if rv == 0: print("Decrypted B&N ePub with key file {0}".format(filename)) break @@ -121,7 +121,7 @@ def decryptpdb(infile, outdir, rscpath): rv = 1 socialpath = os.path.join(rscpath,'sdrmlist.txt') if os.path.exists(socialpath): - keydata = file(socialpath,'r').read() + keydata = open(socialpath,'r').read() keydata = keydata.rstrip(os.linesep) ar = keydata.split(',') for i in ar: @@ -148,7 +148,7 @@ def decryptk4mobi(infile, outdir, rscpath): pidnums = [] pidspath = os.path.join(rscpath,'pidlist.txt') if os.path.exists(pidspath): - pidstr = file(pidspath,'r').read() + pidstr = open(pidspath,'r').read() pidstr = pidstr.rstrip(os.linesep) pidstr = pidstr.strip() if pidstr != '': @@ -156,7 +156,7 @@ def decryptk4mobi(infile, outdir, rscpath): serialnums = [] serialnumspath = os.path.join(rscpath,'seriallist.txt') if os.path.exists(serialnumspath): - serialstr = file(serialnumspath,'r').read() + serialstr = open(serialnumspath,'r').read() serialstr = serialstr.rstrip(os.linesep) serialstr = serialstr.strip() if serialstr != '': diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 98db615c..55fa2ffc 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -332,7 +332,7 @@ def processBook(self, pidlst): keydata = self.getBookPayloadRecord(b'dkey', 0) except DrmException as e: print("no dkey record found, book may not be encrypted") - print("attempting to extrct files without a book key") + print("attempting to extract files without a book key") self.createBookDirectory() self.extractFiles() print("Successfully Extracted Topaz contents") @@ -364,7 +364,7 @@ def processBook(self, pidlst): break if not bookKey: - raise DrmException("No key found in {0:d} keys tried. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(len(pidlst))) + raise DrmException("No key found in {0:d} keys tried. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(len(pidlst))) self.setBookKey(bookKey) self.createBookDirectory() From dbf4b5402614d2f714559f91e7b7d414efa892a5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 29 Dec 2021 09:26:29 +0100 Subject: [PATCH 054/154] Begin work on standalone version Now the plugin ZIP file (DeDRM_plugin.zip) can be run with a normal Python interpreter as if it were a Python file (try `python3 DeDRM_plugin.zip --help`). This way I can begin building a standalone version (that can run without Calibre) without having to duplicate a ton of code. --- DeDRM_plugin/__init__.py | 81 ++++++----- DeDRM_plugin/__main__.py | 23 +++ DeDRM_plugin/config.py | 32 ++-- DeDRM_plugin/erdr2pml.py | 35 ++--- DeDRM_plugin/genbook.py | 23 +-- DeDRM_plugin/k4mobidedrm.py | 28 ++-- DeDRM_plugin/kfxdedrm.py | 12 +- DeDRM_plugin/prefs.py | 12 +- DeDRM_plugin/scriptinterface.py | 18 ++- DeDRM_plugin/standalone/__init__.py | 217 ++++++++++++++++++++++++++++ DeDRM_plugin/topazextract.py | 27 ++-- DeDRM_plugin/utilities.py | 7 +- DeDRM_plugin/zipfix.py | 13 +- 13 files changed, 379 insertions(+), 149 deletions(-) create mode 100644 DeDRM_plugin/__main__.py create mode 100644 DeDRM_plugin/standalone/__init__.py diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index ab9bcf74..80f7f288 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -97,11 +97,19 @@ import time import traceback +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + class DeDRMError(Exception): pass -from calibre.customize import FileTypePlugin +try: + from calibre.customize import FileTypePlugin +except: + # Allow import without Calibre. + class FileTypePlugin: + pass try: from calibre.constants import iswindows, isosx @@ -109,7 +117,10 @@ class DeDRMError(Exception): iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -from calibre.utils.config import config_dir +try: + from calibre.utils.config import config_dir +except: + config_dir = "" # Wrap a stream so that output gets flushed immediately @@ -150,6 +161,10 @@ class DeDRM(FileTypePlugin): priority = 600 + def cli_main(self, data): + from standalone import main + main(data) + def initialize(self): """ Dynamic modules can't be imported/loaded from a zipfile. @@ -216,7 +231,7 @@ def postProcessEPUB(self, path_to_ebook): postProcessStart = time.time() try: - import calibre_plugins.dedrm.prefs as prefs + import prefs dedrmprefs = prefs.DeDRM_Prefs() if dedrmprefs["deobfuscate_fonts"] is True: @@ -224,7 +239,7 @@ def postProcessEPUB(self, path_to_ebook): path_to_ebook = self.checkFonts(path_to_ebook) or path_to_ebook if dedrmprefs["remove_watermarks"] is True: - import calibre_plugins.dedrm.epubwatermark as watermark + import epubwatermark as watermark # Remove Tolino's CDP watermark file path_to_ebook = watermark.removeCDPwatermark(self, path_to_ebook) or path_to_ebook @@ -251,7 +266,7 @@ def checkFonts(self, path_to_ebook): # It checks if there's fonts that need to be deobfuscated try: - import calibre_plugins.dedrm.epubfontdecrypt as epubfontdecrypt + import epubfontdecrypt output = self.temporary_file(".epub").name ret = epubfontdecrypt.decryptFontsBook(path_to_ebook, output) @@ -272,7 +287,7 @@ def checkFonts(self, path_to_ebook): def ePubDecrypt(self,path_to_ebook): # Create a TemporaryPersistent file to work with. # Check original epub archive for zip errors. - import calibre_plugins.dedrm.zipfix as zipfix + import zipfix inf = self.temporary_file(".epub") try: @@ -284,12 +299,12 @@ def ePubDecrypt(self,path_to_ebook): raise # import the decryption keys - import calibre_plugins.dedrm.prefs as prefs + import prefs dedrmprefs = prefs.DeDRM_Prefs() # import the LCP handler - import calibre_plugins.dedrm.lcpdedrm as lcpdedrm + import lcpdedrm if (lcpdedrm.isLCPbook(path_to_ebook)): try: @@ -304,7 +319,7 @@ def ePubDecrypt(self,path_to_ebook): # Not an LCP book, do the normal EPUB (Adobe) handling. # import the Adobe ePub handler - import calibre_plugins.dedrm.ineptepub as ineptepub + import ineptepub if ineptepub.adeptBook(inf.name): @@ -345,11 +360,11 @@ def ePubDecrypt(self,path_to_ebook): try: if iswindows or isosx: - from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys + from ignoblekeyNookStudy import nookkeys defaultkeys_study = nookkeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"ignoblekeyNookStudy.py") defaultkeys_study = WineGetKeys(scriptpath, ".b64",dedrmprefs['adobewineprefix']) @@ -365,7 +380,7 @@ def ePubDecrypt(self,path_to_ebook): if iswindows: # That's a Windows store app, it won't run on Linux or MacOS anyways. # No need to waste time running Wine. - from calibre_plugins.dedrm.ignoblekeyWindowsStore import dump_keys as dump_nook_keys + from ignoblekeyWindowsStore import dump_keys as dump_nook_keys defaultkeys_store = dump_nook_keys(False) except: @@ -377,7 +392,7 @@ def ePubDecrypt(self,path_to_ebook): try: if iswindows: # Right now this is only implemented for Windows. MacOS support still needs to be added. - from calibre_plugins.dedrm.adobekey_get_passhash import passhash_keys + from adobekey_get_passhash import passhash_keys defaultkeys_ade, names = passhash_keys() if isosx: print("{0} v{1}: Dumping ADE PassHash data is not yet supported on MacOS.".format(PLUGIN_NAME, PLUGIN_VERSION)) @@ -522,11 +537,11 @@ def ePubDecrypt(self,path_to_ebook): try: if iswindows or isosx: - from calibre_plugins.dedrm.adobekey import adeptkeys + from adobekey import adeptkeys defaultkeys, defaultnames = adeptkeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) @@ -546,7 +561,7 @@ def ePubDecrypt(self,path_to_ebook): # Check for DeACSM keys: try: - from calibre_plugins.dedrm.config import checkForDeACSMkeys + from config import checkForDeACSMkeys newkey, newname = checkForDeACSMkeys() @@ -613,8 +628,8 @@ def ePubDecrypt(self,path_to_ebook): def PDFIneptDecrypt(self, path_to_ebook): # Sub function to prevent PDFDecrypt from becoming too large ... - import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.ineptpdf as ineptpdf + import prefs + import ineptpdf dedrmprefs = prefs.DeDRM_Prefs() book_uuid = None @@ -688,11 +703,11 @@ def PDFIneptDecrypt(self, path_to_ebook): try: if iswindows or isosx: - from calibre_plugins.dedrm.adobekey import adeptkeys + from adobekey import adeptkeys defaultkeys, defaultnames = adeptkeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",dedrmprefs['adobewineprefix']) @@ -712,7 +727,7 @@ def PDFIneptDecrypt(self, path_to_ebook): # Check for DeACSM keys: try: - from calibre_plugins.dedrm.config import checkForDeACSMkeys + from config import checkForDeACSMkeys newkey, newname = checkForDeACSMkeys() @@ -789,8 +804,8 @@ def PDFIneptDecrypt(self, path_to_ebook): def PDFStandardDecrypt(self, path_to_ebook): # Sub function to prevent PDFDecrypt from becoming too large ... - import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.ineptpdf as ineptpdf + import prefs + import ineptpdf dedrmprefs = prefs.DeDRM_Prefs() # Attempt to decrypt PDF with each encryption key (generated or provided). @@ -836,9 +851,9 @@ def PDFStandardDecrypt(self, path_to_ebook): def PDFDecrypt(self,path_to_ebook): - import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.ineptpdf as ineptpdf - import calibre_plugins.dedrm.lcpdedrm as lcpdedrm + import prefs + import ineptpdf + import lcpdedrm dedrmprefs = prefs.DeDRM_Prefs() if (lcpdedrm.isLCPbook(path_to_ebook)): @@ -881,8 +896,8 @@ def KindleMobiDecrypt(self,path_to_ebook): # Had to move this import here so the custom libs can be # extracted to the appropriate places beforehand these routines # look for them. - import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.k4mobidedrm as k4mobidedrm + import prefs + import k4mobidedrm dedrmprefs = prefs.DeDRM_Prefs() pids = dedrmprefs['pids'] @@ -905,11 +920,11 @@ def KindleMobiDecrypt(self,path_to_ebook): try: if iswindows or isosx: - from calibre_plugins.dedrm.kindlekey import kindlekeys + from kindlekey import kindlekeys defaultkeys = kindlekeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"kindlekey.py") defaultkeys = WineGetKeys(scriptpath, ".k4i",dedrmprefs['kindlewineprefix']) @@ -949,8 +964,8 @@ def KindleMobiDecrypt(self,path_to_ebook): def eReaderDecrypt(self,path_to_ebook): - import calibre_plugins.dedrm.prefs as prefs - import calibre_plugins.dedrm.erdr2pml as erdr2pml + import prefs + import erdr2pml dedrmprefs = prefs.DeDRM_Prefs() # Attempt to decrypt epub with each encryption key (generated or provided). @@ -1011,7 +1026,7 @@ def is_customizable(self): return True def config_widget(self): - import calibre_plugins.dedrm.config as config + import config return config.ConfigWidget(self.plugin_path, self.alfdir) def save_settings(self, config_widget): diff --git a/DeDRM_plugin/__main__.py b/DeDRM_plugin/__main__.py new file mode 100644 index 00000000..96b42179 --- /dev/null +++ b/DeDRM_plugin/__main__.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# __main__.py for DeDRM_plugin +# (CLI interface without Calibre) +# Copyright © 2021 NoDRM + +__license__ = 'GPL v3' +__docformat__ = 'restructuredtext en' + +# For revision history see __init__.py + +""" +Run DeDRM plugin without Calibre. +""" + +# Import __init__.py from the standalone folder so we can have all the +# standalone / non-Calibre code in that subfolder. + +import standalone.__init__ as mdata +import sys + +mdata.main(sys.argv) \ No newline at end of file diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 9a7c4934..4cdb2eab 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -16,19 +16,23 @@ from PyQt5 import Qt as QtGui from zipfile import ZipFile +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + + # calibre modules and constants. from calibre.gui2 import (error_dialog, question_dialog, info_dialog, open_url, choose_dir, choose_files, choose_save_file) from calibre.utils.config import dynamic, config_dir, JSONConfig from calibre.constants import iswindows, isosx -# modules from this plugin's zipfile. -from calibre_plugins.dedrm.__init__ import PLUGIN_NAME, PLUGIN_VERSION -from calibre_plugins.dedrm.__init__ import RESOURCE_NAME as help_file_name -from calibre_plugins.dedrm.utilities import uStrCmp -import calibre_plugins.dedrm.prefs as prefs -import calibre_plugins.dedrm.androidkindlekey as androidkindlekey +from __init__ import PLUGIN_NAME, PLUGIN_VERSION +from __init__ import RESOURCE_NAME as help_file_name +from utilities import uStrCmp + +import prefs +import androidkindlekey def checkForDeACSMkeys(): try: @@ -868,7 +872,7 @@ def accept_android_nook(self): errmsg = "This isn't the correct path, or the data is invalid." return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) - from calibre_plugins.dedrm.ignoblekeyAndroid import dump_keys + from ignoblekeyAndroid import dump_keys store_result = dump_keys(path_to_ade_data) if len(store_result) == 0: @@ -899,7 +903,7 @@ def accept_android_nook(self): def accept_ade_dump_passhash(self): try: - from calibre_plugins.dedrm.adobekey_get_passhash import passhash_keys + from adobekey_get_passhash import passhash_keys keys, names = passhash_keys() except: errmsg = "Failed to grab PassHash keys from ADE." @@ -940,7 +944,7 @@ def accept_win_nook(self): return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) try: - from calibre_plugins.dedrm.ignoblekeyWindowsStore import dump_keys + from ignoblekeyWindowsStore import dump_keys store_result = dump_keys(False) except: errmsg = "Failed to import from Nook Microsoft Store app." @@ -948,7 +952,7 @@ def accept_win_nook(self): try: # Try the Nook Study app - from calibre_plugins.dedrm.ignoblekeyNookStudy import nookkeys + from ignoblekeyNookStudy import nookkeys study_result = nookkeys() except: errmsg = "Failed to import from Nook Study app." @@ -1009,7 +1013,7 @@ def accept_passhash(self): return error_dialog(None, "{0} {1}".format(PLUGIN_NAME, PLUGIN_VERSION), errmsg, show=True, show_copy_button=False) try: - from calibre_plugins.dedrm.ignoblekeyGenPassHash import generate_key + from ignoblekeyGenPassHash import generate_key self.result_data = generate_key(self.user_name, self.cc_number) except: errmsg = "Key generation failed." @@ -1077,7 +1081,7 @@ def key_name(self): @property def key_value(self): - from calibre_plugins.dedrm.erdr2pml import getuser_key as generate_ereader_key + from erdr2pml import getuser_key as generate_ereader_key return codecs.encode(generate_ereader_key(self.user_name, self.cc_number),'hex') @property @@ -1124,7 +1128,7 @@ def __init__(self, parent=None,): try: if iswindows or isosx: - from calibre_plugins.dedrm.adobekey import adeptkeys + from adobekey import adeptkeys defaultkeys, defaultnames = adeptkeys() else: # linux @@ -1220,7 +1224,7 @@ def __init__(self, parent=None,): try: if iswindows or isosx: - from calibre_plugins.dedrm.kindlekey import kindlekeys + from kindlekey import kindlekeys defaultkeys = kindlekeys() else: # linux diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index c32431a6..70d7b469 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # erdr2pml.py -# Copyright © 2008-2020 The Dark Reverser, Apprentice Harper et al. +# Copyright © 2008-2021 The Dark Reverser, Apprentice Harper, noDRM et al. # # Changelog # @@ -64,16 +64,16 @@ # 0.22 - Unicode and plugin support, different image folders for PMLZ and source # 0.23 - moved unicode_argv call inside main for Windows DeDRM compatibility # 1.00 - Added Python 3 compatibility for calibre 5.0 +# 1.01 - Bugfixes for standalone version. __version__='1.00' import sys, re import struct, binascii, getopt, zlib, os, os.path, urllib, tempfile, traceback -if 'calibre' in sys.modules: - inCalibre = True -else: - inCalibre = False +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get @@ -141,40 +141,25 @@ def unicode_argv(): Des = None if iswindows: # first try with pycrypto - if inCalibre: - from calibre_plugins.dedrm import pycrypto_des - else: - import pycrypto_des + import pycrypto_des Des = pycrypto_des.load_pycrypto() if Des == None: # they try with openssl - if inCalibre: - from calibre_plugins.dedrm import openssl_des - else: - import openssl_des + import openssl_des Des = openssl_des.load_libcrypto() else: # first try with openssl - if inCalibre: - from calibre_plugins.dedrm import openssl_des - else: - import openssl_des + import openssl_des Des = openssl_des.load_libcrypto() if Des == None: # then try with pycrypto - if inCalibre: - from calibre_plugins.dedrm import pycrypto_des - else: - import pycrypto_des + import pycrypto_des Des = pycrypto_des.load_pycrypto() # if that did not work then use pure python implementation # of DES and try to speed it up with Psycho if Des == None: - if inCalibre: - from calibre_plugins.dedrm import python_des - else: - import python_des + import python_des Des = python_des.Des # Import Psyco if available try: diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index 6f3f57d1..a0e0d0d6 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -35,25 +35,18 @@ def __getattr__(self, attr): from struct import pack from struct import unpack +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + + class TpzDRMError(Exception): pass # local support routines -if 'calibre' in sys.modules: - inCalibre = True -else: - inCalibre = False - -if inCalibre : - from calibre_plugins.dedrm import convert2xml - from calibre_plugins.dedrm import flatxml2html - from calibre_plugins.dedrm import flatxml2svg - from calibre_plugins.dedrm import stylexml2css -else : - import convert2xml - import flatxml2html - import flatxml2svg - import stylexml2css +import convert2xml +import flatxml2html +import flatxml2svg +import stylexml2css # global switch buildXML = False diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index 4a305359..1a6465bb 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -72,26 +72,18 @@ import html.entities import json +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + + class DrmException(Exception): pass -if 'calibre' in sys.modules: - inCalibre = True -else: - inCalibre = False - -if inCalibre: - from calibre_plugins.dedrm import mobidedrm - from calibre_plugins.dedrm import topazextract - from calibre_plugins.dedrm import kgenpids - from calibre_plugins.dedrm import androidkindlekey - from calibre_plugins.dedrm import kfxdedrm -else: - import mobidedrm - import topazextract - import kgenpids - import androidkindlekey - import kfxdedrm +import mobidedrm +import topazextract +import kgenpids +import androidkindlekey +import kfxdedrm # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get @@ -243,7 +235,7 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime try: mb.processBook(totalpids) except: - mb.cleanup + mb.cleanup() raise print("Decryption succeeded after {0:.1f} seconds".format(time.time()-starttime)) diff --git a/DeDRM_plugin/kfxdedrm.py b/DeDRM_plugin/kfxdedrm.py index 23e46dc7..0674d630 100644 --- a/DeDRM_plugin/kfxdedrm.py +++ b/DeDRM_plugin/kfxdedrm.py @@ -8,16 +8,18 @@ # 2.1.1 - Whitespace! -import os +import os, sys import shutil import traceback import zipfile from io import BytesIO -try: - from ion import DrmIon, DrmIonVoucher -except: - from calibre_plugins.dedrm.ion import DrmIon, DrmIonVoucher + +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from ion import DrmIon, DrmIonVoucher + __license__ = 'GPL v3' diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index aee4846d..ae442132 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -5,15 +5,15 @@ __license__ = 'GPL v3' # Standard Python modules. -import os +import os, sys import traceback -from calibre.utils.config import JSONConfig +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + -try: - from calibre_plugins.dedrm.__init__ import PLUGIN_NAME -except: - PLUGIN_NAME = "DeDRM" +from calibre.utils.config import JSONConfig +from __init__ import PLUGIN_NAME class DeDRM_Prefs(): def __init__(self): diff --git a/DeDRM_plugin/scriptinterface.py b/DeDRM_plugin/scriptinterface.py index 1810237e..3351ee72 100644 --- a/DeDRM_plugin/scriptinterface.py +++ b/DeDRM_plugin/scriptinterface.py @@ -5,15 +5,19 @@ import sys import os + +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + + import re import traceback -import calibre_plugins.dedrm.ineptepub -import calibre_plugins.dedrm.ignobleepub -import calibre_plugins.dedrm.epubtest -import calibre_plugins.dedrm.zipfix -import calibre_plugins.dedrm.ineptpdf -import calibre_plugins.dedrm.erdr2pml -import calibre_plugins.dedrm.k4mobidedrm +import ineptepub +import epubtest +import zipfix +import ineptpdf +import erdr2pml +import k4mobidedrm def decryptepub(infile, outdir, rscpath): errlog = '' diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py new file mode 100644 index 00000000..fceda3b4 --- /dev/null +++ b/DeDRM_plugin/standalone/__init__.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# CLI interface for the DeDRM plugin (useable without Calibre, too) + +# Copyright © 2021 NoDRM + +OPT_SHORT_TO_LONG = [ + ["h", "help"], + ["t", "test"], + ["v", "verbose"], + ["q", "quiet"], + ["u", "username"], + ["p", "password"], + ["d", "dest"], + ["f", "force"] +] + +import sys, os +IS_CALIBRE = False +if "calibre" in sys.modules: + IS_CALIBRE = True + +# Explicitly allow importing the parent folder +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# Explicitly set the package identifier so we are allowed to import stuff ... +__package__ = "DeDRM_plugin" + + +global _additional_data +global _additional_params +global _function +_additional_data = [] +_additional_params = [] +_function = None + +def print_err_header(): + from __init__ import PLUGIN_NAME, PLUGIN_VERSION # type: ignore + + print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - DRM removal plugin by noDRM") + print() + +def print_help(): + from __init__ import PLUGIN_NAME, PLUGIN_VERSION + print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - DRM removal plugin by noDRM") + print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") + print("See https://github.com/noDRM/DeDRM_tools for more information.") + print() + if IS_CALIBRE: + print("This plugin can be run through Calibre - like you are doing right now - ") + print("but it can also be executed with a standalone Python interpreter.") + else: + print("This plugin can either be imported into Calibre, or be executed directly") + print("through Python like you are doing right now.") + print() + print("TODO: Parameters here ...") + +def print_credits(): + from __init__ import PLUGIN_NAME, PLUGIN_VERSION + print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM") + print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") + print("See https://github.com/noDRM/DeDRM_tools for more information.") + print() + print("Credits:") + print(" - noDRM for the current release of the DeDRM plugin") + print(" - Apprentice Alf and Apprentice Harper for the previous versions of the DeDRM plugin") + print(" - The Dark Reverser for the Mobipocket and eReader script") + print(" - i ♥ cabbages for the Adobe Digital Editions scripts") + print(" - Skindle aka Bart Simpson for the Amazon Kindle for PC script") + print(" - CMBDTC for Amazon Topaz DRM removal script") + print(" - some_updates, clarknova and Bart Simpson for Amazon Topaz conversion scripts") + print(" - DiapDealer for the first calibre plugin versions of the tools") + print(" - some_updates, DiapDealer, Apprentice Alf and mdlnx for Amazon Kindle/Mobipocket tools") + print(" - some_updates for the DeDRM all-in-one Python tool") + print(" - Apprentice Alf for the DeDRM all-in-one AppleScript tool") + + +def handle_single_argument(arg, next): + used_up = 0 + global _additional_params + + if arg == "--help": + print_help() + exit(0) + + elif arg == "--credits": + print_credits() + exit(0) + + elif arg in ["--username", "--password"]: + used_up = 1 + _additional_params.append(arg) + if next is None: + print_err_header() + print("Missing parameter for argument " + arg) + exit(1) + else: + _additional_params.append(next[0]) + + elif arg in ["--verbose", "--quiet"]: + _additional_params.append(arg) + + + else: + print_err_header() + print("Unknown argument: " + arg) + exit(1) + + + # Used up 0 additional arguments + return used_up + + + +def handle_data(data): + global _function + global _additional_data + + if _function is None: + _function = str(data) + else: + _additional_data.append(str(data)) + +def execute_action(action, filenames, params): + print("Executing '{0}' on file(s) {1} with parameters {2}".format(action, str(filenames), str(params))) + + print("ERROR: This feature is still in development. Right now it can't be used yet.") + + +def main(argv): + arguments = argv + skip_opts = False + + # First element is always the ZIP name, remove that. + if not arguments[0].lower().endswith(".zip") and not IS_CALIBRE: + print("Warning: File name does not end in .zip ...") + print(arguments) + arguments.pop(0) + + while len(arguments) > 0: + arg = arguments.pop(0) + + if arg == "--": + skip_opts = True + continue + + if not skip_opts: + if arg.startswith("--"): + # Give the current arg, plus all remaining ones. + # Return the number of additional args we used. + used = handle_single_argument(arg, arguments) + for _ in range(used): + # Function returns number of additional arguments that were + # "used up" by that argument. + # Remove that amount of arguments from the list. + try: + arguments.pop(0) + except: + pass + continue + elif arg.startswith("-"): + single_args = list(arg[1:]) + # single_args is now a list of single chars, for when you call the program like "ls -alR" + # with multiple single-letter options combined. + while len(single_args) > 0: + c = single_args.pop(0) + + # See if we have a long name for that option. + for wrapper in OPT_SHORT_TO_LONG: + if wrapper[0] == c: + c = "--" + wrapper[1] + break + else: + c = "-" + c + # c is now the long term (unless there is no long version, then it's the short version). + + if len(single_args) > 0: + # If we have more short arguments, the argument for this one must be None. + handle_single_argument(c, None) + used = 0 + else: + # If not, then there might be parameters for this short argument. + used = handle_single_argument(c, arguments) + + for _ in range(used): + # Function returns number of additional arguments that were + # "used up" by that argument. + # Remove that amount of arguments from the list. + try: + arguments.pop(0) + except: + pass + + continue + + handle_data(arg) + + + if _function is None: + print_help() + return(1) + + # Okay, now actually begin doing stuff. + # This function gets told what to do and gets additional data (filenames). + # It also receives additional parameters. + # The rest of the code will be in different Python files. + execute_action(_function, _additional_data, _additional_params) + + + + + +if __name__ == "__main__": + # NOTE: This MUST not do anything else other than calling main() + # All the code must be in main(), not in here. + import sys + main(sys.argv) \ No newline at end of file diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 55fa2ffc..4db50723 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -13,14 +13,16 @@ import sys import os, csv, getopt + +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + import zlib, zipfile, tempfile, shutil import traceback from struct import pack from struct import unpack -try: - from calibre_plugins.dedrm.alfcrypto import Topaz_Cipher -except: - from alfcrypto import Topaz_Cipher + +from alfcrypto import Topaz_Cipher # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get @@ -88,12 +90,7 @@ def unicode_argv(): #global switch debug = False -if 'calibre' in sys.modules: - inCalibre = True - from calibre_plugins.dedrm import kgenpids -else: - inCalibre = False - import kgenpids +import kgenpids class DrmException(Exception): @@ -336,10 +333,7 @@ def processBook(self, pidlst): self.createBookDirectory() self.extractFiles() print("Successfully Extracted Topaz contents") - if inCalibre: - from calibre_plugins.dedrm import genbook - else: - import genbook + import genbook rv = genbook.generateBook(self.outdir, raw, fixedimage) if rv == 0: @@ -370,10 +364,7 @@ def processBook(self, pidlst): self.createBookDirectory() self.extractFiles() print("Successfully Extracted Topaz contents") - if inCalibre: - from calibre_plugins.dedrm import genbook - else: - import genbook + import genbook rv = genbook.generateBook(self.outdir, raw, fixedimage) if rv == 0: diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index 47d6106b..1efd8ce5 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -1,7 +1,12 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from calibre_plugins.dedrm.ignoblekeyGenPassHash import generate_key +import sys, os +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + + +from ignoblekeyGenPassHash import generate_key __license__ = 'GPL v3' diff --git a/DeDRM_plugin/zipfix.py b/DeDRM_plugin/zipfix.py index 54469d88..079e49ac 100644 --- a/DeDRM_plugin/zipfix.py +++ b/DeDRM_plugin/zipfix.py @@ -20,14 +20,13 @@ __license__ = 'GPL v3' __version__ = "1.1" -import sys +import sys, os + +# Calibre stuff - so we can import from our ZIP without absolute module name +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + import zlib -try: - import zipfilerugged -except: - import calibre_plugins.dedrm.zipfilerugged as zipfilerugged -import os -import os.path +import zipfilerugged import getopt from struct import unpack From b11aadcca6e80621c421a644ec1cd305c2b0a479 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 29 Dec 2021 11:36:59 +0100 Subject: [PATCH 055/154] Bugfixes in standalone code for Calibre < 5 / Python 2 --- DeDRM_plugin/__calibre_compat_code.py | 14 ++++++++ DeDRM_plugin/__init__.py | 8 ++--- DeDRM_plugin/config.py | 4 +-- DeDRM_plugin/erdr2pml.py | 4 +-- DeDRM_plugin/genbook.py | 3 +- DeDRM_plugin/k4mobidedrm.py | 3 +- DeDRM_plugin/kfxdedrm.py | 5 +-- DeDRM_plugin/prefs.py | 4 +-- DeDRM_plugin/scriptinterface.py | 4 +-- DeDRM_plugin/standalone/__init__.py | 22 ++++++------ DeDRM_plugin/topazextract.py | 4 +-- DeDRM_plugin/utilities.py | 5 +-- DeDRM_plugin/wineutils.py | 5 ++- DeDRM_plugin/zipfix.py | 3 +- Obok_plugin/obok/obok.py | 2 +- Other_Tools/Kobo/obok.py | 2 +- make_release.py | 51 ++++++++++++++++++++++++++- 17 files changed, 100 insertions(+), 43 deletions(-) create mode 100644 DeDRM_plugin/__calibre_compat_code.py diff --git a/DeDRM_plugin/__calibre_compat_code.py b/DeDRM_plugin/__calibre_compat_code.py new file mode 100644 index 00000000..4896dd67 --- /dev/null +++ b/DeDRM_plugin/__calibre_compat_code.py @@ -0,0 +1,14 @@ + +#@@CALIBRE_COMPAT_CODE_START@@ +import sys, os + +# Explicitly allow importing the parent folder +if os.path.dirname(os.path.dirname(os.path.abspath(__file__))) not in sys.path: + sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Bugfix for Calibre < 5: +if "calibre" in sys.modules and sys.version_info[0] == 2: + from calibre.utils.config import config_dir + if os.path.join(config_dir, "plugins", "DeDRM.zip") not in sys.path: + sys.path.insert(0, os.path.join(config_dir, "plugins", "DeDRM.zip")) +#@@CALIBRE_COMPAT_CODE_END@@ diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 80f7f288..ac11d0fc 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from __future__ import print_function + # __init__.py for DeDRM_plugin # Copyright © 2008-2020 Apprentice Harper et al. # Copyright © 2021 NoDRM @@ -97,9 +99,7 @@ import time import traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ class DeDRMError(Exception): pass @@ -162,7 +162,7 @@ class DeDRM(FileTypePlugin): def cli_main(self, data): - from standalone import main + from .standalone import main main(data) def initialize(self): diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 4cdb2eab..79e7c4d5 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -16,8 +16,8 @@ from PyQt5 import Qt as QtGui from zipfile import ZipFile -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ # calibre modules and constants. diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 70d7b469..26c947d4 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -71,9 +71,7 @@ import sys, re import struct, binascii, getopt, zlib, os, os.path, urllib, tempfile, traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index a0e0d0d6..21186b8c 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -35,8 +35,7 @@ def __getattr__(self, attr): from struct import pack from struct import unpack -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ class TpzDRMError(Exception): diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index 1a6465bb..ec108d4d 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -72,8 +72,7 @@ import html.entities import json -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ class DrmException(Exception): diff --git a/DeDRM_plugin/kfxdedrm.py b/DeDRM_plugin/kfxdedrm.py index 0674d630..cec764c2 100644 --- a/DeDRM_plugin/kfxdedrm.py +++ b/DeDRM_plugin/kfxdedrm.py @@ -15,8 +15,9 @@ from io import BytesIO -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ + from ion import DrmIon, DrmIonVoucher diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index ae442132..4db9618e 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -8,8 +8,8 @@ import os, sys import traceback -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ from calibre.utils.config import JSONConfig diff --git a/DeDRM_plugin/scriptinterface.py b/DeDRM_plugin/scriptinterface.py index 3351ee72..e65f4263 100644 --- a/DeDRM_plugin/scriptinterface.py +++ b/DeDRM_plugin/scriptinterface.py @@ -6,8 +6,8 @@ import sys import os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +#@@CALIBRE_COMPAT_CODE@@ import re diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py index fceda3b4..dbf0cab6 100644 --- a/DeDRM_plugin/standalone/__init__.py +++ b/DeDRM_plugin/standalone/__init__.py @@ -3,6 +3,8 @@ # CLI interface for the DeDRM plugin (useable without Calibre, too) +from __future__ import absolute_import, print_function + # Copyright © 2021 NoDRM OPT_SHORT_TO_LONG = [ @@ -16,15 +18,11 @@ ["f", "force"] ] -import sys, os -IS_CALIBRE = False -if "calibre" in sys.modules: - IS_CALIBRE = True +#@@CALIBRE_COMPAT_CODE@@ -# Explicitly allow importing the parent folder -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Explicitly set the package identifier so we are allowed to import stuff ... __package__ = "DeDRM_plugin" +import os, sys global _additional_data @@ -46,7 +44,7 @@ def print_help(): print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") print("See https://github.com/noDRM/DeDRM_tools for more information.") print() - if IS_CALIBRE: + if "calibre" in sys.modules: print("This plugin can be run through Calibre - like you are doing right now - ") print("but it can also be executed with a standalone Python interpreter.") else: @@ -81,11 +79,11 @@ def handle_single_argument(arg, next): if arg == "--help": print_help() - exit(0) + sys.exit(0) elif arg == "--credits": print_credits() - exit(0) + sys.exit(0) elif arg in ["--username", "--password"]: used_up = 1 @@ -93,7 +91,7 @@ def handle_single_argument(arg, next): if next is None: print_err_header() print("Missing parameter for argument " + arg) - exit(1) + sys.exit(1) else: _additional_params.append(next[0]) @@ -104,7 +102,7 @@ def handle_single_argument(arg, next): else: print_err_header() print("Unknown argument: " + arg) - exit(1) + sys.exit(1) # Used up 0 additional arguments @@ -132,7 +130,7 @@ def main(argv): skip_opts = False # First element is always the ZIP name, remove that. - if not arguments[0].lower().endswith(".zip") and not IS_CALIBRE: + if not arguments[0].lower().endswith(".zip") and not "calibre" in sys.modules: print("Warning: File name does not end in .zip ...") print(arguments) arguments.pop(0) diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 4db50723..8be96a24 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -14,8 +14,8 @@ import sys import os, csv, getopt -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ + import zlib, zipfile, tempfile, shutil import traceback diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index 1efd8ce5..bd008b59 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -1,10 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import sys, os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) - +#@@CALIBRE_COMPAT_CODE@@ from ignoblekeyGenPassHash import generate_key diff --git a/DeDRM_plugin/wineutils.py b/DeDRM_plugin/wineutils.py index 071e0da1..cd79b4c4 100644 --- a/DeDRM_plugin/wineutils.py +++ b/DeDRM_plugin/wineutils.py @@ -5,7 +5,10 @@ # Standard Python modules. import os, sys, re, hashlib, traceback -from calibre_plugins.dedrm.__init__ import PLUGIN_NAME, PLUGIN_VERSION + +#@@CALIBRE_COMPAT_CODE@@ + +from __init__ import PLUGIN_NAME, PLUGIN_VERSION class NoWinePython3Exception(Exception): diff --git a/DeDRM_plugin/zipfix.py b/DeDRM_plugin/zipfix.py index 079e49ac..3fbfbcea 100644 --- a/DeDRM_plugin/zipfix.py +++ b/DeDRM_plugin/zipfix.py @@ -22,8 +22,7 @@ import sys, os -# Calibre stuff - so we can import from our ZIP without absolute module name -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +#@@CALIBRE_COMPAT_CODE@@ import zlib import zipfilerugged diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index f680341f..e80e9aed 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -788,7 +788,7 @@ def cli_main(): books = [lib.books[num - 1]] except (ValueError, IndexError): print("Invalid choice. Exiting...") - exit() + sys.exit() results = [decrypt_book(book, lib) for book in books] lib.close() diff --git a/Other_Tools/Kobo/obok.py b/Other_Tools/Kobo/obok.py index 6f871149..ae088008 100644 --- a/Other_Tools/Kobo/obok.py +++ b/Other_Tools/Kobo/obok.py @@ -739,7 +739,7 @@ def cli_main(): books = [lib.books[num - 1]] except (ValueError, IndexError): print("Invalid choice. Exiting...") - exit() + sys.exit() results = [decrypt_book(book, lib) for book in books] lib.close() diff --git a/make_release.py b/make_release.py index e600af8a..95bebf66 100755 --- a/make_release.py +++ b/make_release.py @@ -14,19 +14,65 @@ DEDRM_SRC_DIR = 'DeDRM_plugin' +DEDRM_SRC_TMP_DIR = 'DeDRM_plugin_temp' DEDRM_README= 'DeDRM_plugin_ReadMe.txt' OBOK_SRC_DIR = 'Obok_plugin' OBOK_README = 'obok_plugin_ReadMe.txt' RELEASE_DIR = 'release' +def patch_file(filepath): + f = open(filepath, "rb") + fn = open(filepath + ".tmp", "wb") + patch = open(os.path.join(DEDRM_SRC_DIR, "__calibre_compat_code.py"), "rb") + patchdata = patch.read() + patch.close() + + while True: + line = f.readline() + if len(line) == 0: + break + + if line.strip().startswith(b"#@@CALIBRE_COMPAT_CODE@@"): + fn.write(patchdata) + else: + fn.write(line) + + f.close() + fn.close() + shutil.move(filepath + ".tmp", filepath) + + def make_release(version): try: shutil.rmtree(RELEASE_DIR) except: pass + try: + shutil.rmtree(DEDRM_SRC_TMP_DIR) + except: + pass + os.mkdir(RELEASE_DIR) - shutil.make_archive(DEDRM_SRC_DIR, 'zip', DEDRM_SRC_DIR) + + # Copy folder + shutil.copytree(DEDRM_SRC_DIR, DEDRM_SRC_TMP_DIR) + + # Modify folder + try: + shutil.rmtree(os.path.join(os.path.abspath(DEDRM_SRC_TMP_DIR), "__pycache__")) + except: + pass + + # Patch file to add compat code. + for root, dirs, files in os.walk(DEDRM_SRC_TMP_DIR): + for name in files: + if name.endswith(".py"): + patch_file(os.path.join(root, name)) + + + # Package + shutil.make_archive(DEDRM_SRC_DIR, 'zip', DEDRM_SRC_TMP_DIR) shutil.make_archive(OBOK_SRC_DIR, 'zip', OBOK_SRC_DIR) shutil.move(DEDRM_SRC_DIR+'.zip', RELEASE_DIR) shutil.move(OBOK_SRC_DIR+'.zip', RELEASE_DIR) @@ -34,6 +80,9 @@ def make_release(version): shutil.copy(OBOK_README, RELEASE_DIR) shutil.copy("ReadMe_Overview.txt", RELEASE_DIR) + # Remove temp folder: + shutil.rmtree(DEDRM_SRC_TMP_DIR) + if version is not None: release_name = 'DeDRM_tools_{}'.format(version) else: From e0fcd99bcb44adb648d5999b886f4a486decd84d Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 29 Dec 2021 13:00:45 +0100 Subject: [PATCH 056/154] Add passhash interface to CLI --- DeDRM_plugin/adobekey_get_passhash.py | 2 +- DeDRM_plugin/ignoblekeyNookStudy.py | 18 ++--- DeDRM_plugin/standalone/__init__.py | 76 +++++++++++++------ DeDRM_plugin/standalone/passhash.py | 102 ++++++++++++++++++++++++++ 4 files changed, 167 insertions(+), 31 deletions(-) create mode 100644 DeDRM_plugin/standalone/passhash.py diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py index 5b4502a5..adb0965c 100644 --- a/DeDRM_plugin/adobekey_get_passhash.py +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -147,7 +147,7 @@ def passhash_keys(): #print("Didn't find fingerprint for decryption ...") return [], [] - print("Found {0:d} passhashes".format(len(keys))) + print("Found {0:d} passhashes".format(len(keys)), file=sys.stderr) keys_decrypted = [] diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index 4152093d..93c691b0 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -157,7 +157,7 @@ def getNookLogFiles(): logpath = path +'\\Barnes & Noble\\NOOKstudy\\logs\\BNClientLog.txt' if os.path.isfile(logpath): found = True - print('Found nookStudy log file: ' + logpath.encode('ascii','ignore')) + print('Found nookStudy log file: ' + logpath.encode('ascii','ignore'), file=sys.stderr) logFiles.append(logpath) else: home = os.getenv('HOME') @@ -165,26 +165,26 @@ def getNookLogFiles(): testpath = home + '/Library/Application Support/Barnes & Noble/DesktopReader/logs/BNClientLog.txt' if os.path.isfile(testpath): logFiles.append(testpath) - print('Found nookStudy log file: ' + testpath) + print('Found nookStudy log file: ' + testpath, file=sys.stderr) found = True testpath = home + '/Library/Application Support/Barnes & Noble/DesktopReader/indices/BNClientLog.txt' if os.path.isfile(testpath): logFiles.append(testpath) - print('Found nookStudy log file: ' + testpath) + print('Found nookStudy log file: ' + testpath, file=sys.stderr) found = True testpath = home + '/Library/Application Support/Barnes & Noble/BNDesktopReader/logs/BNClientLog.txt' if os.path.isfile(testpath): logFiles.append(testpath) - print('Found nookStudy log file: ' + testpath) + print('Found nookStudy log file: ' + testpath, file=sys.stderr) found = True testpath = home + '/Library/Application Support/Barnes & Noble/BNDesktopReader/indices/BNClientLog.txt' if os.path.isfile(testpath): logFiles.append(testpath) - print('Found nookStudy log file: ' + testpath) + print('Found nookStudy log file: ' + testpath, file=sys.stderr) found = True if not found: - print('No nook Study log files have been found.') + print('No nook Study log files have been found.', file=sys.stderr) return logFiles @@ -205,7 +205,7 @@ def nookkeys(files = []): for file in files: fileKeys = getKeysFromLog(file) if fileKeys: - print("Found {0} keys in the Nook Study log files".format(len(fileKeys))) + print("Found {0} keys in the Nook Study log files".format(len(fileKeys)), file=sys.stderr) keys.extend(fileKeys) return list(set(keys)) @@ -218,7 +218,7 @@ def getkey(outpath, files=[]): outfile = outpath with open(outfile, 'w') as keyfileout: keyfileout.write(keys[-1]) - print("Saved a key to {0}".format(outfile)) + print("Saved a key to {0}".format(outfile), file=sys.stderr) else: keycount = 0 for key in keys: @@ -229,7 +229,7 @@ def getkey(outpath, files=[]): break with open(outfile, 'w') as keyfileout: keyfileout.write(key) - print("Saved a key to {0}".format(outfile)) + print("Saved a key to {0}".format(outfile), file=sys.stderr) return True return False diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py index dbf0cab6..fe74bb31 100644 --- a/DeDRM_plugin/standalone/__init__.py +++ b/DeDRM_plugin/standalone/__init__.py @@ -8,14 +8,16 @@ # Copyright © 2021 NoDRM OPT_SHORT_TO_LONG = [ + ["c", "config"], + ["d", "dest"], + ["e", "extract"], + ["f", "force"], ["h", "help"], - ["t", "test"], - ["v", "verbose"], + ["p", "password"], ["q", "quiet"], + ["t", "test"], ["u", "username"], - ["p", "password"], - ["d", "dest"], - ["f", "force"] + ["v", "verbose"], ] #@@CALIBRE_COMPAT_CODE@@ @@ -32,6 +34,29 @@ _additional_params = [] _function = None +def print_fname(f, info): + print(" " + f.ljust(15) + " " + info) + +def print_opt(short, long, info): + if short is None: + short = " " + else: + short = " -" + short + + if long is None: + long = " " + else: + long = "--" + long.ljust(16) + + print(short + " " + long + " " + info, file=sys.stderr) + +def print_std_usage(name, param_string): + print("Usage: ", file=sys.stderr) + if "calibre" in sys.modules: + print(" calibre-debug -r \"DeDRM\" -- "+name+" " + param_string, file=sys.stderr) + else: + print(" python3 DeDRM_plugin.zip "+name+" "+param_string, file=sys.stderr) + def print_err_header(): from __init__ import PLUGIN_NAME, PLUGIN_VERSION # type: ignore @@ -51,7 +76,11 @@ def print_help(): print("This plugin can either be imported into Calibre, or be executed directly") print("through Python like you are doing right now.") print() - print("TODO: Parameters here ...") + print("Available functions:") + print_fname("passhash", "Manage Adobe PassHashes") + print() + + # TODO: All parameters that are global should be listed here. def print_credits(): from __init__ import PLUGIN_NAME, PLUGIN_VERSION @@ -77,31 +106,23 @@ def handle_single_argument(arg, next): used_up = 0 global _additional_params - if arg == "--help": - print_help() - sys.exit(0) - - elif arg == "--credits": - print_credits() - sys.exit(0) - - elif arg in ["--username", "--password"]: + if arg in ["--username", "--password"]: used_up = 1 _additional_params.append(arg) if next is None: print_err_header() - print("Missing parameter for argument " + arg) + print("Missing parameter for argument " + arg, file=sys.stderr) sys.exit(1) else: _additional_params.append(next[0]) - elif arg in ["--verbose", "--quiet"]: + elif arg in ["--help", "--credits", "--verbose", "--quiet", "--extract"]: _additional_params.append(arg) else: print_err_header() - print("Unknown argument: " + arg) + print("Unknown argument: " + arg, file=sys.stderr) sys.exit(1) @@ -120,9 +141,14 @@ def handle_data(data): _additional_data.append(str(data)) def execute_action(action, filenames, params): - print("Executing '{0}' on file(s) {1} with parameters {2}".format(action, str(filenames), str(params))) + print("Executing '{0}' on file(s) {1} with parameters {2}".format(action, str(filenames), str(params)), file=sys.stderr) - print("ERROR: This feature is still in development. Right now it can't be used yet.") + if action == "passhash": + from standalone.passhash import perform_action + perform_action(params, filenames) + + else: + print("ERROR: This feature is still in development. Right now it can't be used yet.", file=sys.stderr) def main(argv): @@ -194,9 +220,17 @@ def main(argv): handle_data(arg) + if _function is None and "--credits" in _additional_params: + print_credits() + sys.exit(0) + + if _function is None and "--help" in _additional_params: + print_help() + sys.exit(0) + if _function is None: print_help() - return(1) + sys.exit(1) # Okay, now actually begin doing stuff. # This function gets told what to do and gets additional data (filenames). diff --git a/DeDRM_plugin/standalone/passhash.py b/DeDRM_plugin/standalone/passhash.py new file mode 100644 index 00000000..215f2831 --- /dev/null +++ b/DeDRM_plugin/standalone/passhash.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# CLI interface for the DeDRM plugin (useable without Calibre, too) +# Adobe PassHash implementation + +from __future__ import absolute_import, print_function + +# Copyright © 2021 NoDRM + +#@@CALIBRE_COMPAT_CODE@@ + +import os, sys + +from standalone.__init__ import print_opt, print_std_usage + +iswindows = sys.platform.startswith('win') +isosx = sys.platform.startswith('darwin') + +def print_passhash_help(): + from __init__ import PLUGIN_NAME, PLUGIN_VERSION + print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM") + print() + print("passhash: Manage Adobe PassHashes") + print() + print_std_usage("passhash", "[ -u username -p password | -e ]") + + print() + print("Options: ") + print_opt("u", "username", "Generate a PassHash with the given username") + print_opt("p", "password", "Generate a PassHash with the given username") + print_opt("e", "extract", "Extract PassHashes found on this machine") + +def perform_action(params, files): + user = None + pwd = None + + if len(params) == 0: + print_passhash_help() + return 0 + + extract = False + + while len(params) > 0: + p = params.pop(0) + if p == "--username": + user = params.pop(0) + elif p == "--password": + pwd = params.pop(0) + elif p == "--extract": + extract = True + elif p == "--help": + print_passhash_help() + return 0 + + if not extract: + if user is None: + print("Missing parameter: --username", file=sys.stderr) + if pwd is None: + print("Missing parameter: --password", file=sys.stderr) + if user is None or pwd is None: + return 1 + + if user is not None and pwd is not None: + from ignoblekeyGenPassHash import generate_key + key = generate_key(user, pwd) + print(key.decode("utf-8")) + + if extract: + if not iswindows and not isosx: + print("Extracting PassHash keys not supported on Linux.", file=sys.stderr) + return 1 + + keys = [] + + from ignoblekeyNookStudy import nookkeys + keys.extend(nookkeys()) + + if iswindows: + from ignoblekeyWindowsStore import dump_keys + keys.extend(dump_keys()) + + from adobekey_get_passhash import passhash_keys + ade_keys, ade_names = passhash_keys() + keys.extend(ade_keys) + + # Trim duplicates + newkeys = [] + for k in keys: + if not k in newkeys: + newkeys.append(k) + + # Print all found keys + for k in newkeys: + print(k) + + + return 0 + + +if __name__ == "__main__": + print("This code is not intended to be executed directly!") \ No newline at end of file From 5ace15e912a432c88d5fbb947fac53d397e45a5c Mon Sep 17 00:00:00 2001 From: Aldo Bleeker <2095835+ableeker@users.noreply.github.com> Date: Tue, 28 Dec 2021 18:34:11 +0100 Subject: [PATCH 057/154] Python 3 fixes --- DeDRM_plugin/alfcrypto.py | 10 ++++++---- DeDRM_plugin/flatxml2html.py | 10 ++++++---- DeDRM_plugin/topazextract.py | 8 ++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/alfcrypto.py b/DeDRM_plugin/alfcrypto.py index 5c197a72..5a31d095 100644 --- a/DeDRM_plugin/alfcrypto.py +++ b/DeDRM_plugin/alfcrypto.py @@ -207,8 +207,9 @@ def __init__(self): def ctx_init(self, key): ctx1 = 0x0CAFFE19E - for keyChar in key: - keyByte = ord(keyChar) + if isinstance(key, str): + key = key.encode('latin-1') + for keyByte in key: ctx2 = ctx1 ctx1 = ((((ctx1 >>2) * (ctx1 >>7))&0xFFFFFFFF) ^ (keyByte * keyByte * 0x0F902007)& 0xFFFFFFFF ) self._ctx = [ctx1, ctx2] @@ -220,8 +221,9 @@ def decrypt(self, data, ctx=None): ctx1 = ctx[0] ctx2 = ctx[1] plainText = "" - for dataChar in data: - dataByte = ord(dataChar) + if isinstance(data, str): + data = data.encode('latin-1') + for dataByte in data: m = (dataByte ^ ((ctx1 >> 3) &0xFF) ^ ((ctx2<<3) & 0xFF)) &0xFF ctx2 = ctx1 ctx1 = (((ctx1 >> 2) * (ctx1 >> 7)) &0xFFFFFFFF) ^((m * m * 0x0F902007) &0xFFFFFFFF) diff --git a/DeDRM_plugin/flatxml2html.py b/DeDRM_plugin/flatxml2html.py index 2fe80c36..63cd8f68 100644 --- a/DeDRM_plugin/flatxml2html.py +++ b/DeDRM_plugin/flatxml2html.py @@ -473,8 +473,10 @@ def buildParagraph(self, pclass, pdesc, type, regtype) : if (link > 0): linktype = self.link_type[link-1] title = self.link_title[link-1] - if (title == b"") or (parares.rfind(title.decode('utf-8')) < 0): - title=parares[lstart:].encode('utf-8') + if isinstance(title, bytes): + title = title.decode('utf-8') + if (title == "") or (parares.rfind(title) < 0): + title=parares[lstart:] if linktype == 'external' : linkhref = self.link_href[link-1] linkhtml = '' % linkhref @@ -485,9 +487,9 @@ def buildParagraph(self, pclass, pdesc, type, regtype) : else : # just link to the current page linkhtml = '' - linkhtml += title.decode('utf-8') + linkhtml += title linkhtml += '' - pos = parares.rfind(title.decode('utf-8')) + pos = parares.rfind(title) if pos >= 0: parares = parares[0:pos] + linkhtml + parares[pos+len(title):] else : diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 8be96a24..f65d25ac 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -175,6 +175,8 @@ def decryptRecord(data,PID): # Try to decrypt a dkey record (contains the bookPID) def decryptDkeyRecord(data,PID): record = decryptRecord(data,PID) + if isinstance(record, str): + record = record.encode('latin-1') fields = unpack('3sB8sB8s3s',record) if fields[0] != b'PID' or fields[5] != b'pid' : raise DrmException("Didn't find PID magic numbers in record") @@ -318,6 +320,8 @@ def getBookPayloadRecord(self, name, index): raise DrmException("Error: Attempt to decrypt without bookKey") if compressed: + if isinstance(record, str): + record = bytes(record, 'latin-1') record = zlib.decompress(record) return record @@ -345,6 +349,8 @@ def processBook(self, pidlst): for pid in pidlst: # use 8 digit pids here pid = pid[0:8] + if isinstance(pid, str): + pid = pid.encode('latin-1') print("Trying: {0}".format(pid)) bookKeys = [] data = keydata @@ -412,6 +418,8 @@ def extractFiles(self): outputFile = os.path.join(destdir,fname) print(".", end=' ') record = self.getBookPayloadRecord(name,index) + if isinstance(record, str): + record=bytes(record, 'latin-1') if record != b'': open(outputFile, 'wb').write(record) print(" ") From a275d5d819d9755015397e91fedd263bdf586d99 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 1 Jan 2022 14:09:56 +0100 Subject: [PATCH 058/154] More work on standalone version, fix plugin --- CHANGELOG.md | 1 + DeDRM_plugin/DeDRM_Help.htm | 2 +- DeDRM_plugin/__calibre_compat_code.py | 8 +- DeDRM_plugin/__init__.py | 13 +- DeDRM_plugin/__version.py | 12 ++ DeDRM_plugin/config.py | 2 +- DeDRM_plugin/prefs.py | 14 +- DeDRM_plugin/standalone/__init__.py | 51 +++++-- DeDRM_plugin/standalone/jsonconfig.py | 140 +++++++++++++++++ DeDRM_plugin/standalone/passhash.py | 36 ++++- DeDRM_plugin/standalone/remove_drm.py | 209 ++++++++++++++++++++++++++ 11 files changed, 456 insertions(+), 32 deletions(-) create mode 100644 DeDRM_plugin/__version.py create mode 100644 DeDRM_plugin/standalone/jsonconfig.py create mode 100644 DeDRM_plugin/standalone/remove_drm.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f3a65d5..a8007250 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,3 +54,4 @@ List of changes since the fork of Apprentice Harper's repository: - ineptpdf: Support for V=5, R=5 and R=6 PDF files, and for AES256-encrypted PDFs. - ineptpdf: Disable cross-reference streams in the output file. This may make PDFs slightly larger, but the current code for cross-reference streams seems to be buggy and sometimes creates corrupted PDFs. - Drop support for importing key data from the ancient, pre "DeDRM" Calibre plugins ("Ignoble Epub DeDRM", "eReader PDB 2 PML" and "K4MobiDeDRM"). These are from 2011, I doubt anyone still has these installed, I can't even find a working link for these to test them. If you still have encryption keys in one of these plugins, you will need to update to DeDRM v10.0.2 or older (to convert the keys) before updating to DeDRM v10.0.3 or newer. +- Some Python3 bugfixes for Amazon books (merged #10 by ableeker). \ No newline at end of file diff --git a/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_plugin/DeDRM_Help.htm index c5a92ac6..c94d074b 100644 --- a/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_plugin/DeDRM_Help.htm @@ -17,7 +17,7 @@ -

      DeDRM Plugin (v10.0.0)

      +

      DeDRM Plugin (v10.0.2)

      This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.

      diff --git a/DeDRM_plugin/__calibre_compat_code.py b/DeDRM_plugin/__calibre_compat_code.py index 4896dd67..a535a424 100644 --- a/DeDRM_plugin/__calibre_compat_code.py +++ b/DeDRM_plugin/__calibre_compat_code.py @@ -2,13 +2,19 @@ #@@CALIBRE_COMPAT_CODE_START@@ import sys, os -# Explicitly allow importing the parent folder +# Explicitly allow importing everything ... if os.path.dirname(os.path.dirname(os.path.abspath(__file__))) not in sys.path: sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +if os.path.dirname(os.path.abspath(__file__)) not in sys.path: + sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # Bugfix for Calibre < 5: if "calibre" in sys.modules and sys.version_info[0] == 2: from calibre.utils.config import config_dir if os.path.join(config_dir, "plugins", "DeDRM.zip") not in sys.path: sys.path.insert(0, os.path.join(config_dir, "plugins", "DeDRM.zip")) + +# Explicitly set the package identifier so we are allowed to import stuff ... +#__package__ = "DeDRM_plugin" + #@@CALIBRE_COMPAT_CODE_END@@ diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index ac11d0fc..651647e8 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -8,7 +8,6 @@ # Copyright © 2021 NoDRM __license__ = 'GPL v3' -__version__ = '10.0.2' __docformat__ = 'restructuredtext en' @@ -88,12 +87,6 @@ Decrypt DRMed ebooks. """ -PLUGIN_NAME = "DeDRM" -PLUGIN_VERSION_TUPLE = tuple([int(x) for x in __version__.split(".")]) -PLUGIN_VERSION = ".".join([str(x)for x in PLUGIN_VERSION_TUPLE]) -# Include an html helpfile in the plugin's zipfile with the following name. -RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' - import codecs import sys, os import time @@ -101,6 +94,8 @@ #@@CALIBRE_COMPAT_CODE@@ +import __version + class DeDRMError(Exception): pass @@ -147,6 +142,10 @@ def write(self, data): def __getattr__(self, attr): return getattr(self.stream, attr) +PLUGIN_NAME = __version.PLUGIN_NAME +PLUGIN_VERSION = __version.PLUGIN_VERSION +PLUGIN_VERSION_TUPLE = __version.PLUGIN_VERSION_TUPLE + class DeDRM(FileTypePlugin): name = PLUGIN_NAME description = "Removes DRM from Amazon Kindle, Adobe Adept (including Kobo), Readium LCP, Barnes & Noble, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." diff --git a/DeDRM_plugin/__version.py b/DeDRM_plugin/__version.py new file mode 100644 index 00000000..db5eaa1e --- /dev/null +++ b/DeDRM_plugin/__version.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +#@@CALIBRE_COMPAT_CODE@@ + +PLUGIN_NAME = "DeDRM" +__version__ = '10.0.2' + +PLUGIN_VERSION_TUPLE = tuple([int(x) for x in __version__.split(".")]) +PLUGIN_VERSION = ".".join([str(x)for x in PLUGIN_VERSION_TUPLE]) +# Include an html helpfile in the plugin's zipfile with the following name. +RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' \ No newline at end of file diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 79e7c4d5..fa92fa26 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -28,7 +28,7 @@ from __init__ import PLUGIN_NAME, PLUGIN_VERSION -from __init__ import RESOURCE_NAME as help_file_name +from __version import RESOURCE_NAME as help_file_name from utilities import uStrCmp import prefs diff --git a/DeDRM_plugin/prefs.py b/DeDRM_plugin/prefs.py index 4db9618e..0ae39434 100755 --- a/DeDRM_plugin/prefs.py +++ b/DeDRM_plugin/prefs.py @@ -12,12 +12,20 @@ #@@CALIBRE_COMPAT_CODE@@ -from calibre.utils.config import JSONConfig +try: + from calibre.utils.config import JSONConfig +except: + from standalone.jsonconfig import JSONConfig + from __init__ import PLUGIN_NAME class DeDRM_Prefs(): - def __init__(self): - JSON_PATH = os.path.join("plugins", PLUGIN_NAME.strip().lower().replace(' ', '_') + '.json') + def __init__(self, json_path=None): + if json_path is None: + JSON_PATH = os.path.join("plugins", PLUGIN_NAME.strip().lower().replace(' ', '_') + '.json') + else: + JSON_PATH = json_path + self.dedrmprefs = JSONConfig(JSON_PATH) self.dedrmprefs.defaults['configured'] = False diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py index fe74bb31..e5149bc2 100644 --- a/DeDRM_plugin/standalone/__init__.py +++ b/DeDRM_plugin/standalone/__init__.py @@ -9,10 +9,11 @@ OPT_SHORT_TO_LONG = [ ["c", "config"], - ["d", "dest"], ["e", "extract"], ["f", "force"], ["h", "help"], + ["i", "import"], + ["o", "output"], ["p", "password"], ["q", "quiet"], ["t", "test"], @@ -22,8 +23,6 @@ #@@CALIBRE_COMPAT_CODE@@ -# Explicitly set the package identifier so we are allowed to import stuff ... -__package__ = "DeDRM_plugin" import os, sys @@ -34,6 +33,9 @@ _additional_params = [] _function = None +global config_file_path +config_file_path = "dedrm.json" + def print_fname(f, info): print(" " + f.ljust(15) + " " + info) @@ -64,7 +66,7 @@ def print_err_header(): print() def print_help(): - from __init__ import PLUGIN_NAME, PLUGIN_VERSION + from __version import PLUGIN_NAME, PLUGIN_VERSION print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - DRM removal plugin by noDRM") print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") print("See https://github.com/noDRM/DeDRM_tools for more information.") @@ -78,12 +80,13 @@ def print_help(): print() print("Available functions:") print_fname("passhash", "Manage Adobe PassHashes") + print_fname("remove_drm", "Remove DRM from one or multiple books") print() # TODO: All parameters that are global should be listed here. def print_credits(): - from __init__ import PLUGIN_NAME, PLUGIN_VERSION + from __version import PLUGIN_NAME, PLUGIN_VERSION print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM") print("Based on DeDRM Calibre plugin by Apprentice Harper, Apprentice Alf and others.") print("See https://github.com/noDRM/DeDRM_tools for more information.") @@ -105,18 +108,28 @@ def print_credits(): def handle_single_argument(arg, next): used_up = 0 global _additional_params + global config_file_path - if arg in ["--username", "--password"]: + if arg in ["--username", "--password", "--output", "--outputdir"]: used_up = 1 _additional_params.append(arg) - if next is None: + if next is None or len(next) == 0: print_err_header() print("Missing parameter for argument " + arg, file=sys.stderr) sys.exit(1) else: _additional_params.append(next[0]) + + elif arg == "--config": + if next is None or len(next) == 0: + print_err_header() + print("Missing parameter for argument " + arg, file=sys.stderr) + sys.exit(1) + + config_file_path = next[0] + used_up = 1 - elif arg in ["--help", "--credits", "--verbose", "--quiet", "--extract"]: + elif arg in ["--help", "--credits", "--verbose", "--quiet", "--extract", "--import", "--overwrite", "--force"]: _additional_params.append(arg) @@ -143,12 +156,28 @@ def handle_data(data): def execute_action(action, filenames, params): print("Executing '{0}' on file(s) {1} with parameters {2}".format(action, str(filenames), str(params)), file=sys.stderr) - if action == "passhash": + if action == "help": + print_help() + sys.exit(0) + + elif action == "passhash": from standalone.passhash import perform_action perform_action(params, filenames) + + elif action == "remove_drm": + if not os.path.isfile(os.path.abspath(config_file_path)): + print("Config file missing ...") + + from standalone.remove_drm import perform_action + perform_action(params, filenames) + + elif action == "config": + import prefs + config = prefs.DeDRM_Prefs(os.path.abspath(config_file_path)) + print(config["adeptkeys"]) else: - print("ERROR: This feature is still in development. Right now it can't be used yet.", file=sys.stderr) + print("Command '"+action+"' is unknown.", file=sys.stderr) def main(argv): @@ -236,7 +265,7 @@ def main(argv): # This function gets told what to do and gets additional data (filenames). # It also receives additional parameters. # The rest of the code will be in different Python files. - execute_action(_function, _additional_data, _additional_params) + execute_action(_function.lower(), _additional_data, _additional_params) diff --git a/DeDRM_plugin/standalone/jsonconfig.py b/DeDRM_plugin/standalone/jsonconfig.py new file mode 100644 index 00000000..a4149bfe --- /dev/null +++ b/DeDRM_plugin/standalone/jsonconfig.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# CLI interface for the DeDRM plugin (useable without Calibre, too) +# Config implementation + +from __future__ import absolute_import, print_function + +# Taken from Calibre code - Copyright © 2008, Kovid Goyal kovid@kovidgoyal.net, GPLv3 + +#@@CALIBRE_COMPAT_CODE@@ + +import sys, os, codecs, json + +config_dir = "/" +CONFIG_DIR_MODE = 0o700 +iswindows = sys.platform.startswith('win') + + +filesystem_encoding = sys.getfilesystemencoding() +if filesystem_encoding is None: + filesystem_encoding = 'utf-8' +else: + try: + if codecs.lookup(filesystem_encoding).name == 'ascii': + filesystem_encoding = 'utf-8' + # On linux, unicode arguments to os file functions are coerced to an ascii + # bytestring if sys.getfilesystemencoding() == 'ascii', which is + # just plain dumb. This is fixed by the icu.py module which, when + # imported changes ascii to utf-8 + except Exception: + filesystem_encoding = 'utf-8' + + +class JSONConfig(dict): + + EXTENSION = '.json' + + + def __init__(self, rel_path_to_cf_file, base_path=config_dir): + dict.__init__(self) + self.no_commit = False + self.defaults = {} + self.file_path = os.path.join(base_path, + *(rel_path_to_cf_file.split('/'))) + self.file_path = os.path.abspath(self.file_path) + if not self.file_path.endswith(self.EXTENSION): + self.file_path += self.EXTENSION + + self.refresh() + + def mtime(self): + try: + return os.path.getmtime(self.file_path) + except OSError: + return 0 + + def touch(self): + try: + os.utime(self.file_path, None) + except OSError: + pass + + + def decouple(self, prefix): + self.file_path = os.path.join(os.path.dirname(self.file_path), prefix + os.path.basename(self.file_path)) + self.refresh() + + def refresh(self, clear_current=True): + d = {} + if os.path.exists(self.file_path): + with open(self.file_path, "rb") as f: + raw = f.read() + try: + d = self.raw_to_object(raw) if raw.strip() else {} + except SystemError: + pass + except: + import traceback + traceback.print_exc() + d = {} + if clear_current: + self.clear() + self.update(d) + + def has_key(self, key): + return dict.__contains__(self, key) + + def set(self, key, val): + self.__setitem__(key, val) + + def __delitem__(self, key): + try: + dict.__delitem__(self, key) + except KeyError: + pass # ignore missing keys + else: + self.commit() + + def commit(self): + if self.no_commit: + return + if hasattr(self, 'file_path') and self.file_path: + dpath = os.path.dirname(self.file_path) + if not os.path.exists(dpath): + os.makedirs(dpath, mode=CONFIG_DIR_MODE) + with open(self.file_path, "w") as f: + raw = self.to_raw() + f.seek(0) + f.truncate() + f.write(raw) + + def __enter__(self): + self.no_commit = True + + def __exit__(self, *args): + self.no_commit = False + self.commit() + + def raw_to_object(self, raw): + return json.loads(raw) + + def to_raw(self): + return json.dumps(self, ensure_ascii=False) + + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.defaults[key] + + def get(self, key, default=None): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.defaults.get(key, default) + + def __setitem__(self, key, val): + dict.__setitem__(self, key, val) + self.commit() \ No newline at end of file diff --git a/DeDRM_plugin/standalone/passhash.py b/DeDRM_plugin/standalone/passhash.py index 215f2831..f7bf565f 100644 --- a/DeDRM_plugin/standalone/passhash.py +++ b/DeDRM_plugin/standalone/passhash.py @@ -18,18 +18,19 @@ isosx = sys.platform.startswith('darwin') def print_passhash_help(): - from __init__ import PLUGIN_NAME, PLUGIN_VERSION + from __version import PLUGIN_NAME, PLUGIN_VERSION print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM") print() print("passhash: Manage Adobe PassHashes") print() - print_std_usage("passhash", "[ -u username -p password | -e ]") + print_std_usage("passhash", "[ -u username -p password | -b base64str ] [ -i ] ") print() print("Options: ") print_opt("u", "username", "Generate a PassHash with the given username") - print_opt("p", "password", "Generate a PassHash with the given username") - print_opt("e", "extract", "Extract PassHashes found on this machine") + print_opt("p", "password", "Generate a PassHash with the given password") + print_opt("e", "extract", "Display PassHashes found on this machine") + print_opt("i", "import", "Import hashes into the JSON config file") def perform_action(params, files): user = None @@ -40,6 +41,7 @@ def perform_action(params, files): return 0 extract = False + import_to_json = True while len(params) > 0: p = params.pop(0) @@ -52,21 +54,34 @@ def perform_action(params, files): elif p == "--help": print_passhash_help() return 0 + elif p == "--import": + import_to_json = True - if not extract: + if not extract and not import_to_json: if user is None: print("Missing parameter: --username", file=sys.stderr) if pwd is None: print("Missing parameter: --password", file=sys.stderr) if user is None or pwd is None: return 1 + + if user is None and pwd is not None: + print("Parameter --password also requires --username", file=sys.stderr) + return 1 + if user is not None and pwd is None: + print("Parameter --username also requires --password", file=sys.stderr) + return 1 if user is not None and pwd is not None: from ignoblekeyGenPassHash import generate_key key = generate_key(user, pwd) + if import_to_json: + # TODO: Import the key to the JSON + pass + print(key.decode("utf-8")) - if extract: + if extract or import_to_json: if not iswindows and not isosx: print("Extracting PassHash keys not supported on Linux.", file=sys.stderr) return 1 @@ -92,11 +107,16 @@ def perform_action(params, files): # Print all found keys for k in newkeys: - print(k) + if import_to_json: + # TODO: Add keys to json + pass + + if extract: + print(k) return 0 if __name__ == "__main__": - print("This code is not intended to be executed directly!") \ No newline at end of file + print("This code is not intended to be executed directly!", file=sys.stderr) \ No newline at end of file diff --git a/DeDRM_plugin/standalone/remove_drm.py b/DeDRM_plugin/standalone/remove_drm.py new file mode 100644 index 00000000..5ab5f336 --- /dev/null +++ b/DeDRM_plugin/standalone/remove_drm.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# CLI interface for the DeDRM plugin (useable without Calibre, too) +# DRM removal + +from __future__ import absolute_import, print_function + +# Copyright © 2021 NoDRM + +#@@CALIBRE_COMPAT_CODE@@ + +import os, sys + +from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from contextlib import closing + +from standalone.__init__ import print_opt, print_std_usage + +iswindows = sys.platform.startswith('win') +isosx = sys.platform.startswith('darwin') + +def print_removedrm_help(): + from __init__ import PLUGIN_NAME, PLUGIN_VERSION + print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM") + print() + print("remove_drm: Remove DRM from one or multiple files") + print() + print_std_usage("remove_drm", " ... [ -o ] [ -f ]") + + print() + print("Options: ") + print_opt(None, "outputdir", "Folder to export the file(s) to") + print_opt("o", "output", "File name to export the file to") + print_opt("f", "force", "Overwrite output file if it already exists") + print_opt(None, "overwrite", "Replace DRMed file with DRM-free file (implies --force)") + + +def determine_file_type(file): + # Returns a file type: + # "PDF", "PDB", "MOBI", "TPZ", "LCP", "ADEPT", "ADEPT-PassHash", "KFX-ZIP", "ZIP" or None + + f = open(file, "rb") + fdata = f.read(100) + f.close() + + if fdata.startswith(b"PK\x03\x04"): + pass + # Either LCP, Adobe, or Amazon + elif fdata.startswith(b"%PDF"): + return "PDF" + elif fdata[0x3c:0x3c+8] == b"PNRdPPrs" or fdata[0x3c:0x3c+8] == b"PDctPPrs": + return "PDB" + elif fdata[0x3c:0x3c+8] == b"BOOKMOBI" or fdata[0x3c:0x3c+8] == b"TEXtREAd": + return "MOBI" + elif fdata.startswith(b"TPZ"): + return "TPZ" + else: + return None + # Unknown file type + + + # If it's a ZIP, determine the type. + + from lcpdedrm import isLCPbook + if isLCPbook(file): + return "LCP" + + from ineptepub import adeptBook, isPassHashBook + if adeptBook(file): + if isPassHashBook(file): + return "ADEPT-PassHash" + else: + return "ADEPT" + + try: + # Amazon / KFX-ZIP has a file that starts with b'\xeaDRMION\xee' in the ZIP. + with closing(ZipFile(open(file, "rb"))) as book: + for subfilename in book.namelist(): + with book.open(subfilename) as subfile: + data = subfile.read(8) + if data == b'\xeaDRMION\xee': + return "KFX-ZIP" + except: + pass + + return "ZIP" + + + + +def dedrm_single_file(input_file, output_file): + # When this runs, all the stupid file handling is done. + # Just take the file at the absolute path "input_file" + # and export it, DRM-free, to "output_file". + + # Use a temp file as input_file and output_file + # might be identical. + + # The output directory might not exist yet. + + print("File " + input_file + " to " + output_file) + + # Okay, first check the file type and don't rely on the extension. + try: + ftype = determine_file_type(input_file) + except: + print("Can't determine file type for this file.") + ftype = None + + if ftype is None: + return + + + + + +def perform_action(params, files): + output = None + outputdir = None + force = False + overwrite_original = False + + + if len(files) == 0: + print_removedrm_help() + return 0 + + while len(params) > 0: + p = params.pop(0) + if p == "--output": + output = params.pop(0) + elif p == "--outputdir": + outputdir = params.pop(0) + elif p == "--force": + force = True + elif p == "--overwrite": + overwrite_original = True + force = True + elif p == "--help": + print_removedrm_help() + return 0 + + if overwrite_original and (output is not None or outputdir is not None): + print("Can't use --overwrite together with --output or --outputdir.") + return 1 + + if output is not None and os.path.isfile(output) and not force: + print("Output file already exists. Use --force to overwrite.", file=sys.stderr) + return 1 + + + if output is not None and len(files) > 1: + print("Cannot set output file name if there's multiple input files.", file=sys.stderr) + return 1 + + if outputdir is not None and output is not None and os.path.isabs(output): + print("--output parameter is absolute path despite --outputdir being set.") + print("Remove --outputdir, or give a relative path to --output.") + return 1 + + + + for file in files: + + file = os.path.abspath(file) + + if not os.path.isfile(file): + print("Skipping file " + file + " - not found.") + continue + + if overwrite_original: + output_filename = file + else: + if output is not None: + # Due to the check above, we DO only have one file here. + if outputdir is not None and not os.path.isabs(output): + output_filename = os.path.join(outputdir, output) + else: + output_filename = os.path.abspath(output) + else: + if outputdir is None: + outputdir = os.getcwd() + output_filename = os.path.join(outputdir, os.path.basename(file)) + output_filename = os.path.abspath(output_filename) + + if output_filename == file: + # If we export to the import folder, add a suffix to the file name. + fn, f_ext = os.path.splitext(output_filename) + output_filename = fn + "_nodrm" + f_ext + + + + if os.path.isfile(output_filename) and not force: + print("Skipping file " + file + " because output file already exists (use --force).", file=sys.stderr) + continue + + + + dedrm_single_file(file, output_filename) + + + + + return 0 + + +if __name__ == "__main__": + print("This code is not intended to be executed directly!", file=sys.stderr) \ No newline at end of file From d5473f1db0f699d3936edd95fc8b5db9145f1de8 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 2 Jan 2022 16:23:36 +0100 Subject: [PATCH 059/154] Try to fix B&N issues --- DeDRM_plugin/__init__.py | 48 +++++++++++++++------------ DeDRM_plugin/adobekey_get_passhash.py | 8 +++++ DeDRM_plugin/ineptepub.py | 17 ++++++---- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 651647e8..050fefb8 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -328,8 +328,7 @@ def ePubDecrypt(self,path_to_ebook): # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkey in dedrmprefs['bandnkeys'].items(): - keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".epub") # Give the user key, ebook and TemporaryPersistent file to the decryption function. @@ -347,7 +346,7 @@ def ePubDecrypt(self,path_to_ebook): # Return the modified PersistentTemporary file to calibre. return self.postProcessEPUB(of.name) - print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) + print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) # perhaps we should see if we can get a key from a log file print("{0} v{1}: Looking for new NOOK Keys after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) @@ -358,6 +357,7 @@ def ePubDecrypt(self,path_to_ebook): ###### Add keys from the NOOK Study application (ignoblekeyNookStudy.py) try: + defaultkeys_study = [] if iswindows or isosx: from ignoblekeyNookStudy import nookkeys @@ -376,6 +376,7 @@ def ePubDecrypt(self,path_to_ebook): ###### Add keys from the NOOK Microsoft Store application (ignoblekeyNookStudy.py) try: + defaultkeys_store = [] if iswindows: # That's a Windows store app, it won't run on Linux or MacOS anyways. # No need to waste time running Wine. @@ -389,12 +390,14 @@ def ePubDecrypt(self,path_to_ebook): ###### Add keys from Adobe PassHash ADE activation data (adobekey_get_passhash.py) try: + defaultkeys_ade = [] if iswindows: # Right now this is only implemented for Windows. MacOS support still needs to be added. from adobekey_get_passhash import passhash_keys defaultkeys_ade, names = passhash_keys() if isosx: print("{0} v{1}: Dumping ADE PassHash data is not yet supported on MacOS.".format(PLUGIN_NAME, PLUGIN_VERSION)) + defaultkeys_ade = [] except: print("{0} v{1}: Exception when getting PassHashes from ADE after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() @@ -419,6 +422,11 @@ def ePubDecrypt(self,path_to_ebook): if len(newkeys) > 0: try: for i,userkey in enumerate(newkeys): + + if len(userkey) == 0: + print("{0} v{1}: Skipping empty key.".format(PLUGIN_NAME, PLUGIN_VERSION)) + continue + print("{0} v{1}: Trying a new default key".format(PLUGIN_NAME, PLUGIN_VERSION)) of = self.temporary_file(".epub") @@ -451,10 +459,14 @@ def ePubDecrypt(self,path_to_ebook): return self.postProcessEPUB(of.name) print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + return inf.name except: pass + # Looks like we were unable to decrypt the book ... + return inf.name + else: # This is a "normal" Adobe eBook. @@ -611,17 +623,13 @@ def ePubDecrypt(self,path_to_ebook): pass # Something went wrong with decryption. - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - # Not a Barnes & Noble nor an Adobe Adept - # Probably a DRM-free EPUB, but we should still check for fonts. - print("{0} v{1}: “{2}” is neither an Adobe Adept nor a Barnes & Noble encrypted ePub".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) - return self.postProcessEPUB(inf.name) - #raise DeDRMError("{0} v{1}: Couldn't decrypt after {2:.1f} seconds. DRM free perhaps?".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - # No DRM? + # Not a Barnes & Noble nor an Adobe Adept + # Probably a DRM-free EPUB, but we should still check for fonts. return self.postProcessEPUB(inf.name) @@ -776,8 +784,7 @@ def PDFIneptDecrypt(self, path_to_ebook): # Unable to decrypt the PDF with any of the existing keys. Is it a B&N PDF? # Attempt to decrypt PDF with each encryption key (generated or provided). for keyname, userkey in dedrmprefs['bandnkeys'].items(): - keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".pdf") # Give the user key, ebook and TemporaryPersistent file to the decryption function. @@ -951,8 +958,8 @@ def KindleMobiDecrypt(self,path_to_ebook): pass if not decoded: #if you reached here then no luck raise and exception - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) of = self.temporary_file(book.getBookExtension()) book.getFile(of.name) @@ -969,8 +976,7 @@ def eReaderDecrypt(self,path_to_ebook): dedrmprefs = prefs.DeDRM_Prefs() # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkey in dedrmprefs['ereaderkeys'].items(): - keyname_masked = "".join(("X" if (x.isdigit()) else x) for x in keyname) - print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname_masked)) + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".pmlz") # Give the userkey, ebook and TemporaryPersistent file to the decryption function. @@ -981,13 +987,13 @@ def eReaderDecrypt(self,path_to_ebook): # Decryption was successful return the modified PersistentTemporary # file to Calibre's import process. if result == 0: - print("{0} v{1}: Successfully decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) + print("{0} v{1}: Successfully decrypted with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) return of.name - print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname_masked,time.time()-self.starttime)) + print("{0} v{1}: Failed to decrypt with key {2:s} after {3:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,keyname,time.time()-self.starttime)) - print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) - raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at Harper's repository: https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) + print("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) + raise DeDRMError("{0} v{1}: Ultimately failed to decrypt after {2:.1f} seconds. Read the FAQs at noDRM's repository: https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) def run(self, path_to_ebook): diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py index adb0965c..05f4c325 100644 --- a/DeDRM_plugin/adobekey_get_passhash.py +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -75,6 +75,8 @@ def passhash_keys(): plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) except WindowsError: raise ADEPTError("Could not locate ADE activation") + except FileNotFoundError: + raise ADEPTError("Could not locate ADE activation") idx = 1 @@ -100,6 +102,8 @@ def passhash_keys(): plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) except WindowsError: break + except FileNotFoundError: + break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'fingerprint': fp = winreg.QueryValueEx(plkkey, 'value')[0] @@ -118,6 +122,8 @@ def passhash_keys(): plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) except WindowsError: break + except FileNotFoundError: + break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'operatorURL': operatorURL = winreg.QueryValueEx(plkkey, 'value')[0] @@ -135,6 +141,8 @@ def passhash_keys(): plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) except WindowsError: break + except FileNotFoundError: + break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == "passHash": diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 2c6cecac..7f343575 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -521,6 +521,15 @@ def decryptBook(userkey, inpath, outpath): # Normal Adobe ADEPT rsa = RSA(userkey) bookkey = rsa.decrypt(base64.b64decode(bookkey.encode('ascii'))) + + # Verify key: + if len(bookkey) > 16: + # Padded as per RSAES-PKCS1-v1_5 + if verify_book_key(bookkey): + bookkey = bookkey[-16:] + else: + print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) + return 2 else: # Adobe PassHash / B&N key = base64.b64decode(userkey)[:16] @@ -533,14 +542,8 @@ def decryptBook(userkey, inpath, outpath): bookkey = bookkey[:-pad] - - # Padded as per RSAES-PKCS1-v1_5 - if len(bookkey) > 16: - if verify_book_key(bookkey): + if len(bookkey) > 16: bookkey = bookkey[-16:] - else: - print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) - return 2 encryption = inf.read('META-INF/encryption.xml') decryptor = Decryptor(bookkey, encryption) From b84cf9aeb85f67b840c6b2cf84b1717e65edd5cd Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 2 Jan 2022 17:29:27 +0100 Subject: [PATCH 060/154] Fix libcrypto DLL path search (see #13 and #14) Co-authored-by: Adriano Caloiaro --- DeDRM_plugin/adobekey.py | 27 +++++++++++++++++++++++---- DeDRM_plugin/config.py | 4 ++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 9871edaf..e696b8fe 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -124,11 +124,27 @@ class ADEPTError(Exception): except ImportError: import _winreg as winreg + def get_fake_windows_libcrypto_path(): + # There seems to be a bug in Wine where a `find_library('libcrypto-1_1')` + # will not return the path to the libcrypto-1_1.dll file. + # So if we're on Windows, and we didn't find the libcrypto the normal way, + # lets try a hack-y workaround. It's already over anyways at this + # point, can't really make it worse. + import sys, os + for p in sys.path: + if os.path.isfile(os.path.join(p, "libcrypto-1_1.dll")): + return os.path.join(p, "libcrypto-1_1.dll") + if os.path.isfile(os.path.join(p, "libeay32.dll")): + return os.path.join(p, "libeay.dll") + return None + def _load_crypto_libcrypto(): from ctypes.util import find_library libcrypto = find_library('libcrypto-1_1') if libcrypto is None: libcrypto = find_library('libeay32') + if libcrypto is None: + libcrypto = get_fake_windows_libcrypto_path() if libcrypto is None: raise ADEPTError('libcrypto not found') libcrypto = CDLL(libcrypto) @@ -170,7 +186,10 @@ def decrypt(self, data): return AES def _load_crypto_pycrypto(): - from Crypto.Cipher import AES as _AES + try: + from Crypto.Cipher import AES as _AES + except (ImportError, ModuleNotFoundError): + from Cryptodome.Cipher import AES as _AES class AES(object): def __init__(self, key): self._aes = _AES.new(key, _AES.MODE_CBC, b'\x00'*16) @@ -184,7 +203,7 @@ def _load_crypto(): try: AES = loader() break - except (ImportError, ADEPTError): + except (ImportError, ModuleNotFoundError, ADEPTError): pass return AES @@ -396,7 +415,7 @@ def adeptkeys(): try: regkey = winreg.OpenKey(cuser, DEVICE_KEY_PATH) device = winreg.QueryValueEx(regkey, 'key')[0] - except WindowsError: + except WindowsError, FileNotFoundError: raise ADEPTError("Adobe Digital Editions not activated") keykey = CryptUnprotectData(device, entropy) userkey = None @@ -404,7 +423,7 @@ def adeptkeys(): names = [] try: plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) - except WindowsError: + except WindowsError, FileNotFoundError: raise ADEPTError("Could not locate ADE activation") i = -1 diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index fa92fa26..40f645b3 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -1132,7 +1132,7 @@ def __init__(self, parent=None,): defaultkeys, defaultnames = adeptkeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(parent.parent.alfdir,"adobekey.py") defaultkeys, defaultnames = WineGetKeys(scriptpath, ".der",parent.getwineprefix()) @@ -1228,7 +1228,7 @@ def __init__(self, parent=None,): defaultkeys = kindlekeys() else: # linux - from .wineutils import WineGetKeys + from wineutils import WineGetKeys scriptpath = os.path.join(parent.parent.alfdir,"kindlekey.py") defaultkeys = WineGetKeys(scriptpath, ".k4i",parent.getwineprefix()) From b2b55531d39d8a34c98bdc98c70218502e4f546b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 2 Jan 2022 18:52:07 +0100 Subject: [PATCH 061/154] Fix FileNotFoundError during PassHash handling --- DeDRM_plugin/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 050fefb8..83b4b7ac 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -393,8 +393,11 @@ def ePubDecrypt(self,path_to_ebook): defaultkeys_ade = [] if iswindows: # Right now this is only implemented for Windows. MacOS support still needs to be added. - from adobekey_get_passhash import passhash_keys - defaultkeys_ade, names = passhash_keys() + from adobekey_get_passhash import passhash_keys, ADEPTError + try: + defaultkeys_ade, names = passhash_keys() + except ADEPTError: + defaultkeys_ade = [] if isosx: print("{0} v{1}: Dumping ADE PassHash data is not yet supported on MacOS.".format(PLUGIN_NAME, PLUGIN_VERSION)) defaultkeys_ade = [] From f17b255159305c6681b9dcdee3240c912c7889d8 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 2 Jan 2022 19:13:15 +0100 Subject: [PATCH 062/154] Add "MemoryError" to FAQ --- CHANGELOG.md | 3 ++- DeDRM_plugin/adobekey.py | 5 +++-- FAQs.md | 7 ++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8007250..7bca4f48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,4 +54,5 @@ List of changes since the fork of Apprentice Harper's repository: - ineptpdf: Support for V=5, R=5 and R=6 PDF files, and for AES256-encrypted PDFs. - ineptpdf: Disable cross-reference streams in the output file. This may make PDFs slightly larger, but the current code for cross-reference streams seems to be buggy and sometimes creates corrupted PDFs. - Drop support for importing key data from the ancient, pre "DeDRM" Calibre plugins ("Ignoble Epub DeDRM", "eReader PDB 2 PML" and "K4MobiDeDRM"). These are from 2011, I doubt anyone still has these installed, I can't even find a working link for these to test them. If you still have encryption keys in one of these plugins, you will need to update to DeDRM v10.0.2 or older (to convert the keys) before updating to DeDRM v10.0.3 or newer. -- Some Python3 bugfixes for Amazon books (merged #10 by ableeker). \ No newline at end of file +- Some Python3 bugfixes for Amazon books (merged #10 by ableeker). +- Fix a bug where extracting an Adobe key from ADE on Linux through Wine did fail when using the OpenSSL backend (instead of PyCrypto). See #13 and #14 for details, thanks acaloiaro for the bugfix. \ No newline at end of file diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index e696b8fe..d8e68d86 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -31,13 +31,14 @@ # 7.0 - Python 3 for calibre 5 # 7.1 - Fix "failed to decrypt user key key" error (read username from registry) # 7.2 - Fix decryption error on Python2 if there's unicode in the username +# 7.3 - Fix OpenSSL in Wine """ Retrieve Adobe ADEPT user key. """ __license__ = 'GPL v3' -__version__ = '7.2' +__version__ = '7.3' import sys, os, struct, getopt from base64 import b64decode @@ -442,7 +443,7 @@ def adeptkeys(): for j in range(0, 16): try: plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) - except WindowsError: + except WindowsError, FileNotFoundError: break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'user': diff --git a/FAQs.md b/FAQs.md index f868e6b9..b8efbe75 100644 --- a/FAQs.md +++ b/FAQs.md @@ -153,10 +153,15 @@ Remove the DRMed book from calibre. Click the Preferences drop-down menu and cho ## Is there a way to use the DeDRM plugin for Calibre from the command line? See the [Calibre command line interface (CLI) instructions](CALIBRE_CLI_INSTRUCTIONS.md). +## The plugin displays a "MemoryError" in its log file during DRM removal. +A "MemoryError" usually occurs when you're using the 32-bit version of Calibre (which is limited in the amount of useable RAM). If you have a 64-bit installation of your operating system (on Windows, press Windows+Break, then make sure it says "64-bit Operating System" under "System type"), try downloading the 64-bit version of Calibre instead of the 32-bit version. + +If the error still occurs, even with the 64-bit version, please open a bug report. + # General Questions ## Once the DRM has been removed, is there any trace of my personal identity left in the ebook? -That question cannot be answered for sure. While it is easy to check if a book has DRM or not, it is very difficult to verify if all (traces of) personal information have been removed from a book. The tools attempt to remove watermarks when they are detected, but that will not be the case for all watermarks. +That question cannot be answered for sure. While it is easy to check if a book has DRM or not, it is very difficult to verify if all (traces of) personal information have been removed from a book. The tools attempt to remove watermarks when they are detected (optionally, there's an option in the plugin settings to enable that), but that will not be the case for all watermarks. ## Why do some of my Kindle ebooks import as HTMLZ format in calibre? Most Amazon Kindle ebooks are Mobipocket format ebooks, or the new KF8 format. However, some are in a format known as Topaz. The Topaz format is only used by Amazon. A Topaz ebook is a collections of glyphs and their positions on each page tagged with some additional information from that page including OCRed text (Optical Character Recognition generated Text) to allow searching, and some additional layout information. Each page of a Topaz ebook is effectively a description of an image of that page. To convert a Topaz ebook to another format is not easy as there is not a one-to-one mapping between glyphs and characters/fonts. To account for this, two different formats are generated by the DRM removal software. The first is an html description built from the OCRtext and images stored in the Topaz file (HTMLZ). This format is easily reflowed but may suffer from typical OCRtext errors including typos, garbled text, missing italics, missing bolds, etc. The second format uses the glyph and position information to create an accurate scalable vector graphics (SVG) image of each page of the book that can be viewed in web browsers that support svg images (Safari, Firefox 4 or later, etc). Additional conversion software can be used to convert these SVG images to an image only PDF file. The DeDRM calibre plugin only imports the HTMLZ versions of the Topaz ebook. The html version can be manually cleaned up and spell checked and then converted using Sigil/calibre to epubs, mobi ebooks, and etc. From 5b3e3e420f47d567c33627857eb84e2896bb9c1f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 2 Jan 2022 21:18:13 +0100 Subject: [PATCH 063/154] Make plugin work in Calibre 6 (Qt 6) --- DeDRM_plugin/adobekey.py | 2 +- DeDRM_plugin/config.py | 10 ++++++++-- DeDRM_plugin/standalone/remove_drm.py | 8 ++++---- Obok_plugin/config.py | 8 +++++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index d8e68d86..6155cff3 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -136,7 +136,7 @@ def get_fake_windows_libcrypto_path(): if os.path.isfile(os.path.join(p, "libcrypto-1_1.dll")): return os.path.join(p, "libcrypto-1_1.dll") if os.path.isfile(os.path.join(p, "libeay32.dll")): - return os.path.join(p, "libeay.dll") + return os.path.join(p, "libeay32.dll") return None def _load_crypto_libcrypto(): diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 40f645b3..b3d924c9 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -327,7 +327,13 @@ def __init__(self, parent, key_type_name, plugin_keys, create_key, keyfile_ext = self.export_key_button.setIcon(QIcon(I('save.png'))) self.export_key_button.clicked.connect(self.export_key) button_layout.addWidget(self.export_key_button) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + try: + # QT 6 + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Policy.Minimum, QtGui.QSizePolicy.Policy.Expanding) + except AttributeError: + # QT 5 + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + button_layout.addItem(spacerItem) if self.wineprefix is not None: @@ -811,7 +817,7 @@ def __init__(self, parent=None,): self.cbType.addItem("Extract passhashes from Adobe Digital Editions") self.cbType.addItem("Extract key from Nook Windows application") self.cbType.addItem("Extract key from Nook Android application") - self.cbType.currentIndexChanged.connect(self.update_form, self.cbType.currentIndex()) + self.cbType.currentIndexChanged.connect(lambda: self.update_form(self.cbType.currentIndex())) self.layout.addWidget(self.cbType) self.button_box = QDialogButtonBox(QDialogButtonBox.Cancel) diff --git a/DeDRM_plugin/standalone/remove_drm.py b/DeDRM_plugin/standalone/remove_drm.py index 5ab5f336..8273b973 100644 --- a/DeDRM_plugin/standalone/remove_drm.py +++ b/DeDRM_plugin/standalone/remove_drm.py @@ -142,7 +142,7 @@ def perform_action(params, files): return 0 if overwrite_original and (output is not None or outputdir is not None): - print("Can't use --overwrite together with --output or --outputdir.") + print("Can't use --overwrite together with --output or --outputdir.", file=sys.stderr) return 1 if output is not None and os.path.isfile(output) and not force: @@ -155,8 +155,8 @@ def perform_action(params, files): return 1 if outputdir is not None and output is not None and os.path.isabs(output): - print("--output parameter is absolute path despite --outputdir being set.") - print("Remove --outputdir, or give a relative path to --output.") + print("--output parameter is absolute path despite --outputdir being set.", file=sys.stderr) + print("Remove --outputdir, or give a relative path to --output.", file=sys.stderr) return 1 @@ -166,7 +166,7 @@ def perform_action(params, files): file = os.path.abspath(file) if not os.path.isfile(file): - print("Skipping file " + file + " - not found.") + print("Skipping file " + file + " - not found.", file=sys.stderr) continue if overwrite_original: diff --git a/Obok_plugin/config.py b/Obok_plugin/config.py index deb29f9b..9a637f32 100644 --- a/Obok_plugin/config.py +++ b/Obok_plugin/config.py @@ -118,7 +118,13 @@ def __init__(self, parent, key_type_name, plugin_keys, create_key, keyfile_ext = self._delete_key_button.clicked.connect(self.delete_key) button_layout.addWidget(self._delete_key_button) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + try: + # QT 6 + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Policy.Minimum, QtGui.QSizePolicy.Policy.Expanding) + except AttributeError: + # QT 5 + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + button_layout.addItem(spacerItem) layout.addSpacing(5) From e54bb3f700a304a22d08bbabf153183027656c90 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 4 Jan 2022 16:56:02 +0100 Subject: [PATCH 064/154] Fix IndexError in mobidedrm.py --- CHANGELOG.md | 4 +++- DeDRM_plugin/mobidedrm.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bca4f48..e4d9c1ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,4 +55,6 @@ List of changes since the fork of Apprentice Harper's repository: - ineptpdf: Disable cross-reference streams in the output file. This may make PDFs slightly larger, but the current code for cross-reference streams seems to be buggy and sometimes creates corrupted PDFs. - Drop support for importing key data from the ancient, pre "DeDRM" Calibre plugins ("Ignoble Epub DeDRM", "eReader PDB 2 PML" and "K4MobiDeDRM"). These are from 2011, I doubt anyone still has these installed, I can't even find a working link for these to test them. If you still have encryption keys in one of these plugins, you will need to update to DeDRM v10.0.2 or older (to convert the keys) before updating to DeDRM v10.0.3 or newer. - Some Python3 bugfixes for Amazon books (merged #10 by ableeker). -- Fix a bug where extracting an Adobe key from ADE on Linux through Wine did fail when using the OpenSSL backend (instead of PyCrypto). See #13 and #14 for details, thanks acaloiaro for the bugfix. \ No newline at end of file +- Fix a bug where extracting an Adobe key from ADE on Linux through Wine did fail when using the OpenSSL backend (instead of PyCrypto). See #13 and #14 for details, thanks acaloiaro for the bugfix. +- Make the plugin work on Calibre 6 (Qt 6). If you're running the Calibre 6 beta and you notice any issues, please open a bug report. +- Fix IndexError when DeDRMing some Amazon eBooks. diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index ec03fdb8..843eebe5 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -461,7 +461,7 @@ def processBook(self, pidlist): data406 = self.meta_array[406] val406, = struct.unpack('>Q',data406) if val406 != 0: - print("Warning: This is a library or rented ebook ({1}). Continuing ...".format(val406)) + print("Warning: This is a library or rented ebook ({0}). Continuing ...".format(val406)) #raise DrmException("Cannot decode library or rented ebooks.") goodpids = [] From 2b46f61eae034752835e219601cefd59af2c5afe Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 11 Jan 2022 07:57:02 +0100 Subject: [PATCH 065/154] Add empty placeholder file for LCP --- .../DeDRM_Readium LCP passphrase_Help.htm | 1 + DeDRM_plugin/lcpdedrm.py | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 DeDRM_plugin/lcpdedrm.py diff --git a/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm b/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm index a5f5e91c..309fa83a 100644 --- a/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm +++ b/DeDRM_plugin/DeDRM_Readium LCP passphrase_Help.htm @@ -21,6 +21,7 @@

      Managing Readium LCP passphrases

      Readium LCP is a relatively new eBook DRM. It's also known under the names "CARE DRM" or "TEA DRM". It does not rely on any accounts or key data that's difficult to acquire. All you need to open (or decrypt) LCP eBooks is the account passphrase given to you by the eBook provider - the very same passphrase you'd have to enter into your eBook reader device (once) to read LCP-encrypted books.

      +

      This plugin no longer supports removing the Readium LCP DRM due to a DMCA takedown request issued by Readium. Please read the takedown notice or this bug report for more information.

      Entering an LCP passphrase:

      diff --git a/DeDRM_plugin/lcpdedrm.py b/DeDRM_plugin/lcpdedrm.py new file mode 100644 index 00000000..a7e848f7 --- /dev/null +++ b/DeDRM_plugin/lcpdedrm.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# lcpdedrm.py +# Copyright © 2021-2022 NoDRM + +# Released under the terms of the GNU General Public Licence, version 3 +# + + +# Revision history: +# 1 - Initial release +# 2 - LCP DRM code removed due to a DMCA takedown. + +""" +This file used to contain code to remove the Readium LCP DRM +from eBooks. Unfortunately, Readium has issued a DMCA takedown +request, so I was forced to remove that code: + +https://github.com/github/dmca/blob/master/2022/01/2022-01-04-readium.md + +This file now just returns an error message when asked to remove LCP DRM. +For more information, see this issue: +https://github.com/noDRM/DeDRM_tools/issues/18 +""" + +__license__ = 'GPL v3' +__version__ = "2" + +import json +from zipfile import ZipFile +from contextlib import closing + + +class LCPError(Exception): + pass + +# Check file to see if this is an LCP-protected file +def isLCPbook(inpath): + try: + with closing(ZipFile(open(inpath, 'rb'))) as lcpbook: + if ("META-INF/license.lcpl" not in lcpbook.namelist() or + "META-INF/encryption.xml" not in lcpbook.namelist() or + b"EncryptedContentKey" not in lcpbook.read("META-INF/encryption.xml")): + return False + + license = json.loads(lcpbook.read('META-INF/license.lcpl')) + + if "id" in license and "encryption" in license and "profile" in license["encryption"]: + return True + + except: + return False + + return False + + +# Takes a file and a list of passphrases +def decryptLCPbook(inpath, passphrases, parent_object): + + if not isLCPbook(inpath): + raise LCPError("This is not an LCP-encrypted book") + + print("LCP: LCP DRM removal no longer supported due to a DMCA takedown request.") + print("LCP: The takedown request can be found here: ") + print("LCP: https://github.com/github/dmca/blob/master/2022/01/2022-01-04-readium.md ") + print("LCP: More information can be found in the Github repository: ") + print("LCP: https://github.com/noDRM/DeDRM_tools/issues/18 ") + + raise LCPError("LCP DRM removal no longer supported") From 034137962cec1b6395dd40128c77cb5fe70efd9f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 11 Jan 2022 08:42:37 +0100 Subject: [PATCH 066/154] Remove LCP references from Readme --- CHANGELOG.md | 4 ++-- ReadMe_Overview.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4d9c1ca..2adb8d37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ List of changes since the fork of Apprentice Harper's repository: ## Fixes in v10.0.0 (2021-11-17): - CI testing / linting removed as that always failed anyways. The CI now "just" packages the plugin. -- Support for the Readium LCP DRM (also known as "CARE DRM" or "TEA DRM"). This supports EPUB and PDF files. It does not yet support Readium LCPDF/LPF/LCPA/LCPAU/LCPDI files, as I don't have access to any of these. If you have an LCP-protected file in one of these formats that this plugin does not work with, please open [an issue](https://github.com/noDRM/DeDRM_tools/issues) and attach the file to the report. +- ~Support for the Readium LCP DRM (also known as "CARE DRM" or "TEA DRM"). This supports EPUB and PDF files. It does not yet support Readium LCPDF/LPF/LCPA/LCPAU/LCPDI files, as I don't have access to any of these. If you have an LCP-protected file in one of these formats that this plugin does not work with, please open [an issue](https://github.com/noDRM/DeDRM_tools/issues) and attach the file to the report.~ (removed due to a DMCA request, see #18 ) - Add new Github issue report form which forces the user to include stuff like their Calibre version to hopefully increase the quality of bug reports. - Issues with PDF files in Calibre 5 should be fixed (merged [apprenticeharper/DeDRM_tools#1689](https://github.com/apprenticeharper/DeDRM_tools/pull/1689) ). - Fixed tons of issues with the B&N PDF DRM removal script ignoblepdf.py. It looks like that has never been tested since the move to Python3. I have integrated the B&N-specific code into ineptpdf.py, the original ignoblepdf.py is now unused. Fairly untested as I don't have any PDFs with B&N DRM. @@ -40,7 +40,7 @@ List of changes since the fork of Apprentice Harper's repository: - Fix issue where importing a key from Adobe Digital Editions would fail in Python2 (Calibre < 5) if there were non-ASCII characters in the username. - Add code to support importing multiple decryption keys from ADE. - Improve epubtest.py to also detect Kobo & Apple DRM. -- Small updates to the LCP DRM error messages. +- ~Small updates to the LCP DRM error messages.~ (removed due to a DMCA request, see #18 ). - Merge ignobleepub into ineptepub so there's no duplicate code. - Support extracting the B&N / Nook key from the NOOK Microsoft Store application (based on [this script](https://github.com/noDRM/DeDRM_tools/discussions/9) by fesiwi). - Support extracting the B&N / Nook key from a data dump of the NOOK Android application. diff --git a/ReadMe_Overview.txt b/ReadMe_Overview.txt index 3fd2b2b4..3b1e4cf2 100644 --- a/ReadMe_Overview.txt +++ b/ReadMe_Overview.txt @@ -55,7 +55,7 @@ It may be possible to use the plugins on a Linux system, but no support is given Credits ------- The original inept and ignoble scripts were by i♥cabbages -The original Readium LCP DRM removal by NoDRM +~The original Readium LCP DRM removal by NoDRM~ (removed due to a DMCA request) The original mobidedrm and erdr2pml scripts were by The Dark Reverser The original topaz DRM removal script was by CMBDTC The original topaz format conversion scripts were by some_updates, clarknova and Bart Simpson From f4634b5eabf25e4cd5a72e6fd990321b7030e120 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 11 Jan 2022 12:02:44 +0100 Subject: [PATCH 067/154] Update FAQ --- FAQs.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/FAQs.md b/FAQs.md index b8efbe75..468addb0 100644 --- a/FAQs.md +++ b/FAQs.md @@ -167,12 +167,12 @@ That question cannot be answered for sure. While it is easy to check if a book h Most Amazon Kindle ebooks are Mobipocket format ebooks, or the new KF8 format. However, some are in a format known as Topaz. The Topaz format is only used by Amazon. A Topaz ebook is a collections of glyphs and their positions on each page tagged with some additional information from that page including OCRed text (Optical Character Recognition generated Text) to allow searching, and some additional layout information. Each page of a Topaz ebook is effectively a description of an image of that page. To convert a Topaz ebook to another format is not easy as there is not a one-to-one mapping between glyphs and characters/fonts. To account for this, two different formats are generated by the DRM removal software. The first is an html description built from the OCRtext and images stored in the Topaz file (HTMLZ). This format is easily reflowed but may suffer from typical OCRtext errors including typos, garbled text, missing italics, missing bolds, etc. The second format uses the glyph and position information to create an accurate scalable vector graphics (SVG) image of each page of the book that can be viewed in web browsers that support svg images (Safari, Firefox 4 or later, etc). Additional conversion software can be used to convert these SVG images to an image only PDF file. The DeDRM calibre plugin only imports the HTMLZ versions of the Topaz ebook. The html version can be manually cleaned up and spell checked and then converted using Sigil/calibre to epubs, mobi ebooks, and etc. ## Are the tools open source? How can I be sure they are safe and not a trojan horse? -All the DRM removal tools hosted here are almost entirely scripts of one kind or another: Python, Applescript or Windows Batch files. So they are inherently open source, and open to inspection by everyone who downloads them. +All the DRM removal tools hosted here are almost entirely written in Python. So they are inherently open source, and open to inspection by everyone who downloads them. -There are some optional shared libraries (`*.dll`, `*.dylib`, and `*.so`) included for performance. The source for any compiled pieces are provided within `alfcrypto_src.zip`. If this is a concern either delete the binary files or manually rebuild them. +There are some optional shared libraries (`*.dll`, `*.dylib`, and `*.so`) included for performance. The source for any compiled pieces are provided within `alfcrypto_src.zip`. If this is a concern either delete the binary files (there's fallback code in the plugin that allows it to work without these, it will just be slower) or manually rebuild them from source. ## What ebooks do these tools work on? -The Calibre plugin removes DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Readium LCP, Amazon, Kobo and eReader DRM schemes. +The Calibre plugin removes DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Amazon, Kobo and eReader DRM schemes. It used to remove Readium LCP DRM from ePub or PDF files in the past, but that functionality had to be removed due to a [DMCA takedown request](https://github.com/noDRM/DeDRM_tools/issues/18). Note these tools do NOT ‘crack’ the DRM. They simply allow the book’s owner to use the encryption key information already stored someplace on their computer or device to decrypt the ebook in the same manner the official ebook reading software uses. @@ -188,6 +188,9 @@ Amazon turned off backup for Kindle for Android, so the tools can no longer find ## Why don't the tools work on books from the Apple iBooks Store? Apple regularly change the details of their DRM and so the tools in the main tools archive will not work with these ebooks. Apple’s Fairplay DRM scheme can be removed using Requiem if the appropriate version of iTunes can still be installed and used. See the post Apple and ebooks: iBookstore DRM and how to remove it at Apprentice Alf's blog for more details. +## Why don't the tools work with LCP-encrypted ebooks? / Error message about a "DMCA takedown" +Support for LCP DRM removal was included in the past, but Readium (the company who developed that particular DRM) has decided to [open a DMCA takedown request](https://github.com/github/dmca/blob/master/2022/01/2022-01-04-readium.md) in January 2022. This means that for legal reasons, this GitHun repository no longer contains the code needed to remove DRM from LCP-encrypted books. For more information please read [this bug report](https://github.com/noDRM/DeDRM_tools/issues/18). + ## I’ve got the tools archive and I’ve read all the FAQs but I still can’t install the tools and/or the DRM removal doesn’t work * Read the `ReadMe_Overview.txt` file in the top level of the tools archive * Read the ReadMe file for the tool you want to use. @@ -196,7 +199,7 @@ Apple regularly change the details of their DRM and so the tools in the main too ## Who wrote these scripts? The authors tend to identify themselves only by pseudonyms: * The Adobe Adept and Barnes & Noble scripts were created by i♥cabbages -* The Readium LCP support for this plugin was created by NoDRM +* ~The Readium LCP support for this plugin was created by NoDRM~ (removed due to a DMCA takedown, see [#18](https://github.com/noDRM/DeDRM_tools/issues/18) ) * The Amazon Mobipocket and eReader scripts were created by The Dark Reverser * The Amazon K4PC DRM/format was further decoded by Bart Simpson aka Skindle * The Amazon K4 Mobi tool was created by by some_updates, mdlnx and others From a1dd63ae5f48d8320b94efc79ffc2fc8e829988e Mon Sep 17 00:00:00 2001 From: a980e066a01 <100724039+a980e066a01@users.noreply.github.com> Date: Tue, 22 Feb 2022 23:16:03 +0000 Subject: [PATCH 068/154] Remove OpenSSL support; only support PyCryptodome This allows us to clean up the code a lot. On Windows, it isn't installed by default and most of the time not be found at all. On M1 Macs, the kernel will kill the process instead. Closes #33. --- DeDRM_plugin/adobekey.py | 109 +--- DeDRM_plugin/adobekey_get_passhash.py | 15 +- DeDRM_plugin/androidkindlekey.py | 41 +- DeDRM_plugin/erdr2pml.py | 60 +- DeDRM_plugin/ignoblekeyAndroid.py | 14 +- DeDRM_plugin/ignoblekeyGenPassHash.py | 106 +--- DeDRM_plugin/ignoblekeyWindowsStore.py | 13 +- DeDRM_plugin/ineptepub.py | 318 ++-------- DeDRM_plugin/ineptpdf.py | 440 ++------------ DeDRM_plugin/ion.py | 31 +- DeDRM_plugin/kindlekey.py | 801 +------------------------ DeDRM_plugin/mobidedrm.py | 9 +- DeDRM_plugin/openssl_des.py | 89 --- DeDRM_plugin/pycrypto_des.py | 30 - DeDRM_plugin/python_des.py | 220 ------- Obok_plugin/obok/obok.py | 119 +--- 16 files changed, 203 insertions(+), 2212 deletions(-) delete mode 100644 DeDRM_plugin/openssl_des.py delete mode 100644 DeDRM_plugin/pycrypto_des.py delete mode 100644 DeDRM_plugin/python_des.py diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 6155cff3..36c18dec 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# adobekey.pyw, version 7.1 -# Copyright © 2009-2021 i♥cabbages, Apprentice Harper et al. +# adobekey.pyw, version 7.4 +# Copyright © 2009-2022 i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -32,6 +32,7 @@ # 7.1 - Fix "failed to decrypt user key key" error (read username from registry) # 7.2 - Fix decryption error on Python2 if there's unicode in the username # 7.3 - Fix OpenSSL in Wine +# 7.4 - Remove OpenSSL support to only support PyCryptodome """ Retrieve Adobe ADEPT user key. @@ -125,91 +126,12 @@ class ADEPTError(Exception): except ImportError: import _winreg as winreg - def get_fake_windows_libcrypto_path(): - # There seems to be a bug in Wine where a `find_library('libcrypto-1_1')` - # will not return the path to the libcrypto-1_1.dll file. - # So if we're on Windows, and we didn't find the libcrypto the normal way, - # lets try a hack-y workaround. It's already over anyways at this - # point, can't really make it worse. - import sys, os - for p in sys.path: - if os.path.isfile(os.path.join(p, "libcrypto-1_1.dll")): - return os.path.join(p, "libcrypto-1_1.dll") - if os.path.isfile(os.path.join(p, "libeay32.dll")): - return os.path.join(p, "libeay32.dll") - return None - - def _load_crypto_libcrypto(): - from ctypes.util import find_library - libcrypto = find_library('libcrypto-1_1') - if libcrypto is None: - libcrypto = find_library('libeay32') - if libcrypto is None: - libcrypto = get_fake_windows_libcrypto_path() - if libcrypto is None: - raise ADEPTError('libcrypto not found') - libcrypto = CDLL(libcrypto) - AES_MAXNR = 14 - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', - [c_char_p, c_int, AES_KEY_p]) - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', - [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, - c_int]) - class AES(object): - def __init__(self, userkey): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise ADEPTError('AES improper key used') - key = self._key = AES_KEY() - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) - if rv < 0: - raise ADEPTError('Failed to initialize AES key') - def decrypt(self, data): - out = create_string_buffer(len(data)) - iv = (b"\x00" * self._blocksize) - rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0) - if rv == 0: - raise ADEPTError('AES decryption failed') - return out.raw - return AES - - def _load_crypto_pycrypto(): - try: - from Crypto.Cipher import AES as _AES - except (ImportError, ModuleNotFoundError): - from Cryptodome.Cipher import AES as _AES - class AES(object): - def __init__(self, key): - self._aes = _AES.new(key, _AES.MODE_CBC, b'\x00'*16) - def decrypt(self, data): - return self._aes.decrypt(data) - return AES - - def _load_crypto(): - AES = None - for loader in (_load_crypto_pycrypto, _load_crypto_libcrypto): - try: - AES = loader() - break - except (ImportError, ModuleNotFoundError, ADEPTError): - pass - return AES - - AES = _load_crypto() - + try: + from Cryptodome.Cipher import AES + from Cryptodome.Util.Padding import unpad + except ImportError: + from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation' @@ -402,8 +324,6 @@ def CryptUnprotectData(indata, entropy): CryptUnprotectData = CryptUnprotectData() def adeptkeys(): - if AES is None: - raise ADEPTError("PyCrypto or OpenSSL must be installed") root = GetSystemDirectory().split('\\')[0] + '\\' serial = GetVolumeSerialNumber(root) vendor = cpuid0() @@ -416,7 +336,7 @@ def adeptkeys(): try: regkey = winreg.OpenKey(cuser, DEVICE_KEY_PATH) device = winreg.QueryValueEx(regkey, 'key')[0] - except WindowsError, FileNotFoundError: + except (WindowsError, FileNotFoundError): raise ADEPTError("Adobe Digital Editions not activated") keykey = CryptUnprotectData(device, entropy) userkey = None @@ -424,7 +344,7 @@ def adeptkeys(): names = [] try: plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH) - except WindowsError, FileNotFoundError: + except (WindowsError, FileNotFoundError): raise ADEPTError("Could not locate ADE activation") i = -1 @@ -443,7 +363,7 @@ def adeptkeys(): for j in range(0, 16): try: plkkey = winreg.OpenKey(plkparent, "%04d" % (j,)) - except WindowsError, FileNotFoundError: + except (WindowsError, FileNotFoundError): break ktype = winreg.QueryValueEx(plkkey, None)[0] if ktype == 'user': @@ -461,10 +381,7 @@ def adeptkeys(): pass if ktype == 'privateLicenseKey': userkey = winreg.QueryValueEx(plkkey, 'value')[0] - userkey = b64decode(userkey) - aes = AES(keykey) - userkey = aes.decrypt(userkey) - userkey = userkey[26:-ord(userkey[-1:])] + userkey = unpad(AES.new(keykey, AES.MODE_CBC, b'\x00'*16).decrypt(b64decode(userkey)), 16)[26:] # print ("found " + uuid_name + " key: " + str(userkey)) keys.append(userkey) diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py index 05f4c325..72b7cd5c 100644 --- a/DeDRM_plugin/adobekey_get_passhash.py +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -23,20 +23,13 @@ import base64, hashlib try: from Cryptodome.Cipher import AES -except: + from Cryptodome.Util.Padding import unpad +except ImportError: from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" -def unpad(data): - - if sys.version_info[0] == 2: - pad_len = ord(data[-1]) - else: - pad_len = data[-1] - - return data[:-pad_len] - try: from calibre.constants import iswindows, isosx @@ -55,7 +48,7 @@ def decrypt_passhash(passhash, fp): hash_key = hashlib.sha1(bytearray.fromhex(serial_number + PASS_HASH_SECRET)).digest()[:16] encrypted_cc_hash = base64.b64decode(passhash) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) return base64.b64encode(cc_hash).decode("ascii") diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index da34c1d3..6b152f3e 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # androidkindlekey.py -# Copyright © 2010-20 by Thom, Apprentice Harper et al. +# Copyright © 2010-22 by Thom, Apprentice Harper et al. # Revision history: # 1.0 - AmazonSecureStorage.xml decryption to serial number @@ -14,13 +14,14 @@ # 1.4 - Fix some problems identified by Aldo Bleeker # 1.5 - Fix another problem identified by Aldo Bleeker # 2.0 - Python 3 compatibility +# 2.1 - Remove OpenSSL support; only support PyCryptodome """ Retrieve Kindle for Android Serial Number. """ __license__ = 'GPL v3' -__version__ = '2.0' +__version__ = '2.1' import os import sys @@ -33,6 +34,13 @@ from io import BytesIO from binascii import a2b_hex, b2a_hex +try: + from Cryptodome.Cipher import AES, DES + from Cryptodome.Util.Padding import pad, unpad +except ImportError: + from Crypto.Cipher import AES, DES + from Crypto.Util.Padding import pad, unpad + # Routines common to Mac and PC # Wrap a stream so that output gets flushed immediately @@ -115,24 +123,16 @@ class AndroidObfuscation(object): key = a2b_hex('0176e04c9408b1702d90be333fd53523') + def _get_cipher(self): + return AES.new(self.key, AES.MODE_ECB) + def encrypt(self, plaintext): - cipher = self._get_cipher() - padding = len(self.key) - len(plaintext) % len(self.key) - plaintext += chr(padding) * padding - return b2a_hex(cipher.encrypt(plaintext.encode('utf-8'))) + pt = pad(plaintext.encode('utf-8'), 16) + return b2a_hex(self._get_cipher().encrypt(pt)) def decrypt(self, ciphertext): - cipher = self._get_cipher() - plaintext = cipher.decrypt(a2b_hex(ciphertext)) - return plaintext[:-ord(plaintext[-1])] - - def _get_cipher(self): - try: - from Crypto.Cipher import AES - return AES.new(self.key) - except ImportError: - from aescbc import AES, noPadding - return AES(self.key, padding=noPadding()) + ct = a2b_hex(ciphertext) + return unpad(self._get_cipher().decrypt(ct), 16) class AndroidObfuscationV2(AndroidObfuscation): '''AndroidObfuscationV2 @@ -149,12 +149,7 @@ def __init__(self, salt): self.iv = key[8:16] def _get_cipher(self): - try : - from Crypto.Cipher import DES - return DES.new(self.key, DES.MODE_CBC, self.iv) - except ImportError: - from python_des import Des, CBC - return Des(self.key, CBC, self.iv) + return DES.new(self.key, DES.MODE_CBC, self.iv) def parse_preference(path): ''' parse android's shared preference xml ''' diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 26c947d4..6a20fdb9 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # erdr2pml.py -# Copyright © 2008-2021 The Dark Reverser, Apprentice Harper, noDRM et al. +# Copyright © 2008-2022 The Dark Reverser, Apprentice Harper, noDRM et al. # # Changelog # @@ -65,11 +65,17 @@ # 0.23 - moved unicode_argv call inside main for Windows DeDRM compatibility # 1.00 - Added Python 3 compatibility for calibre 5.0 # 1.01 - Bugfixes for standalone version. +# 1.02 - Remove OpenSSL support; only use PyCryptodome -__version__='1.00' +__version__='1.02' import sys, re -import struct, binascii, getopt, zlib, os, os.path, urllib, tempfile, traceback +import struct, binascii, getopt, zlib, os, os.path, urllib, tempfile, traceback, hashlib + +try: + from Cryptodome.Cipher import DES +except ImportError: + from Crypto.Cipher import DES #@@CALIBRE_COMPAT_CODE@@ @@ -136,44 +142,6 @@ def unicode_argv(): argvencoding = sys.stdin.encoding or "utf-8" return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] -Des = None -if iswindows: - # first try with pycrypto - import pycrypto_des - Des = pycrypto_des.load_pycrypto() - if Des == None: - # they try with openssl - import openssl_des - Des = openssl_des.load_libcrypto() -else: - # first try with openssl - import openssl_des - Des = openssl_des.load_libcrypto() - if Des == None: - # then try with pycrypto - import pycrypto_des - Des = pycrypto_des.load_pycrypto() - -# if that did not work then use pure python implementation -# of DES and try to speed it up with Psycho -if Des == None: - import python_des - Des = python_des.Des - # Import Psyco if available - try: - # http://psyco.sourceforge.net - import psyco - psyco.full() - except ImportError: - pass - -try: - from hashlib import sha1 -except ImportError: - # older Python release - import sha - sha1 = lambda s: sha.new(s) - import cgi import logging @@ -253,7 +221,7 @@ def __init__(self, sect, user_key): raise ValueError('incorrect eReader version %d (error 1)' % version) data = self.section_reader(1) self.data = data - des = Des(fixKey(data[0:8])) + des = DES.new(fixKey(data[0:8]), DES.MODE_ECB) cookie_shuf, cookie_size = struct.unpack('>LL', des.decrypt(data[-8:])) if cookie_shuf < 3 or cookie_shuf > 0x14 or cookie_size < 0xf0 or cookie_size > 0x200: raise ValueError('incorrect eReader version (error 2)') @@ -317,7 +285,7 @@ def unshuff(data, shuf): if (self.flags & reqd_flags) != reqd_flags: print("Flags: 0x%X" % self.flags) raise ValueError('incompatible eReader file') - des = Des(fixKey(user_key)) + des = DES.new(fixKey(user_key), DES.MODE_ECB) if version == 259: if drm_sub_version != 7: raise ValueError('incorrect eReader version %d (error 3)' % drm_sub_version) @@ -393,7 +361,7 @@ def getImage(self, i): # return bkinfo def getText(self): - des = Des(fixKey(self.content_key)) + des = DES.new(fixKey(self.content_key), DES.MODE_ECB) r = b'' for i in range(self.num_text_pages): logging.debug('get page %d', i) @@ -406,7 +374,7 @@ def getText(self): sect = self.section_reader(self.first_footnote_page) fnote_ids = deXOR(sect, 0, self.xortable) # the remaining records of the footnote sections need to be decoded with the content_key and zlib inflated - des = Des(fixKey(self.content_key)) + des = DES.new(fixKey(self.content_key), DES.MODE_ECB) for i in range(1,self.num_footnote_pages): logging.debug('get footnotepage %d', i) id_len = ord(fnote_ids[2]) @@ -430,7 +398,7 @@ def getText(self): sect = self.section_reader(self.first_sidebar_page) sbar_ids = deXOR(sect, 0, self.xortable) # the remaining records of the sidebar sections need to be decoded with the content_key and zlib inflated - des = Des(fixKey(self.content_key)) + des = DES.new(fixKey(self.content_key), DES.MODE_ECB) for i in range(1,self.num_sidebar_pages): id_len = ord(sbar_ids[2]) id = sbar_ids[3:3+id_len] diff --git a/DeDRM_plugin/ignoblekeyAndroid.py b/DeDRM_plugin/ignoblekeyAndroid.py index 2b3f0ecf..5fcbd6af 100644 --- a/DeDRM_plugin/ignoblekeyAndroid.py +++ b/DeDRM_plugin/ignoblekeyAndroid.py @@ -10,22 +10,16 @@ import base64 try: from Cryptodome.Cipher import AES -except: + from Cryptodome.Util.Padding import unpad +except ImportError: from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad import hashlib from lxml import etree PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" -def unpad(data): - - if sys.version_info[0] == 2: - pad_len = ord(data[-1]) - else: - pad_len = data[-1] - - return data[:-pad_len] def dump_keys(path_to_adobe_folder): @@ -53,7 +47,7 @@ def dump_keys(path_to_adobe_folder): for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): encrypted_cc_hash = base64.b64decode(pass_hash.text) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) hashes.append(base64.b64encode(cc_hash).decode("ascii")) #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) diff --git a/DeDRM_plugin/ignoblekeyGenPassHash.py b/DeDRM_plugin/ignoblekeyGenPassHash.py index cb6d208a..e1cdba05 100644 --- a/DeDRM_plugin/ignoblekeyGenPassHash.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # ignoblekeyGenPassHash.py -# Copyright © 2009-2020 i♥cabbages, Apprentice Harper et al. +# Copyright © 2009-2022 i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -31,19 +31,25 @@ # 2.7 - Work if TkInter is missing # 2.8 - Fix bug in stand-alone use (import tkFileDialog) # 3.0 - Added Python 3 compatibility for calibre 5.0 +# 3.1 - Remove OpenSSL support, only PyCryptodome is supported now """ Generate Barnes & Noble EPUB user key from name and credit card number. """ __license__ = 'GPL v3' -__version__ = "3.0" +__version__ = "3.1" import sys import os import hashlib import base64 +try: + from Cryptodome.Cipher import AES +except ImportError: + from Crypto.Cipher import AES + # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get # encoded using "replace" before writing them. @@ -114,87 +120,6 @@ def unicode_argv(): class IGNOBLEError(Exception): pass -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if iswindows: - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise IGNOBLEError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_set_encrypt_key = F(c_int, 'AES_set_encrypt_key', - [c_char_p, c_int, AES_KEY_p]) - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', - [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, - c_int]) - - class AES(object): - def __init__(self, userkey, iv): - self._blocksize = len(userkey) - self._iv = iv - key = self._key = AES_KEY() - rv = AES_set_encrypt_key(userkey, len(userkey) * 8, key) - if rv < 0: - raise IGNOBLEError('Failed to initialize AES Encrypt key') - - def encrypt(self, data): - out = create_string_buffer(len(data)) - rv = AES_cbc_encrypt(data, out, len(data), self._key, self._iv, 1) - if rv == 0: - raise IGNOBLEError('AES encryption failed') - return out.raw - - return AES - -def _load_crypto_pycrypto(): - from Crypto.Cipher import AES as _AES - - class AES(object): - def __init__(self, key, iv): - self._aes = _AES.new(key, _AES.MODE_CBC, iv) - - def encrypt(self, data): - return self._aes.encrypt(data) - - return AES - -def _load_crypto(): - AES = None - cryptolist = (_load_crypto_libcrypto, _load_crypto_pycrypto) - if sys.platform.startswith('win'): - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - AES = loader() - break - except (ImportError, IGNOBLEError): - pass - return AES - -AES = _load_crypto() - def normalize_name(name): return ''.join(x for x in name.lower() if x != ' ') @@ -215,8 +140,7 @@ def generate_key(name, ccn): name_sha = hashlib.sha1(name).digest()[:16] ccn_sha = hashlib.sha1(ccn).digest()[:16] both_sha = hashlib.sha1(name + ccn).digest() - aes = AES(ccn_sha, name_sha) - crypt = aes.encrypt(both_sha + (b'\x0c' * 0x0c)) + crypt = AES.new(ccn_sha, AES.MODE_CBC, name_sha).encrypt(both_sha + (b'\x0c' * 0x0c)) userkey = hashlib.sha1(crypt).digest() return base64.b64encode(userkey) @@ -226,11 +150,6 @@ def cli_main(): sys.stderr=SafeUnbuffered(sys.stderr) argv=unicode_argv() progname = os.path.basename(argv[0]) - if AES is None: - print("%s: This script requires OpenSSL or PyCrypto, which must be installed " \ - "separately. Read the top-of-script comment for details." % \ - (progname,)) - return 1 if len(argv) != 4: print("usage: {0} ".format(progname)) return 1 @@ -316,13 +235,6 @@ def generate(self): self.status['text'] = "Keyfile successfully generated" root = tkinter.Tk() - if AES is None: - root.withdraw() - tkinter.messagebox.showerror( - "Ignoble EPUB Keyfile Generator", - "This script requires OpenSSL or PyCrypto, which must be installed " - "separately. Read the top-of-script comment for details.") - return 1 root.title("Barnes & Noble ePub Keyfile Generator v.{0}".format(__version__)) root.resizable(True, False) root.minsize(300, 0) diff --git a/DeDRM_plugin/ignoblekeyWindowsStore.py b/DeDRM_plugin/ignoblekeyWindowsStore.py index 919d2e67..f22d64db 100644 --- a/DeDRM_plugin/ignoblekeyWindowsStore.py +++ b/DeDRM_plugin/ignoblekeyWindowsStore.py @@ -15,8 +15,10 @@ import base64 try: from Cryptodome.Cipher import AES + from Cryptodome.Util.Padding import unpad except: from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad import hashlib from lxml import etree @@ -24,15 +26,6 @@ NOOK_DATA_FOLDER = "%LOCALAPPDATA%\\Packages\\BarnesNoble.Nook_ahnzqzva31enc\\LocalState" PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" -def unpad(data): - - if sys.version_info[0] == 2: - pad_len = ord(data[-1]) - else: - pad_len = data[-1] - - return data[:-pad_len] - def dump_keys(print_result=False): db_filename = os.path.expandvars(NOOK_DATA_FOLDER + "\\NookDB.db3") @@ -64,7 +57,7 @@ def dump_keys(print_result=False): for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): encrypted_cc_hash = base64.b64decode(pass_hash.text) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) decrypted_hashes.append((base64.b64encode(cc_hash).decode("ascii"))) if print_result: print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 7f343575..5fc6d4b0 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # ineptepub.py -# Copyright © 2009-2021 by i♥cabbages, Apprentice Harper et al. +# Copyright © 2009-2022 by i♥cabbages, Apprentice Harper et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -31,13 +31,14 @@ # 6.6 - Import tkFileDialog, don't assume something else will import it. # 7.0 - Add Python 3 compatibility for calibre 5.0 # 7.1 - Add ignoble support, dropping the dedicated ignobleepub.py script +# 7.2 - Only support PyCryptodome; clean up the code """ Decrypt Adobe Digital Editions encrypted ePub books. """ __license__ = 'GPL v3' -__version__ = "7.1" +__version__ = "7.2" import sys import os @@ -49,6 +50,15 @@ from contextlib import closing from lxml import etree +try: + from Cryptodome.Cipher import AES, PKCS1_v1_5 + from Cryptodome.PublicKey import RSA + from Cryptodome.Util.Padding import unpad +except ImportError: + from Crypto.Cipher import AES, PKCS1_v1_5 + from Crypto.PublicKey import RSA + from Crypto.Util.Padding import unpad + # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get # encoded using "replace" before writing them. @@ -120,234 +130,6 @@ class ADEPTError(Exception): class ADEPTNewVersionError(Exception): pass -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if iswindows: - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise ADEPTError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - RSA_NO_PADDING = 3 - AES_MAXNR = 14 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class RSA(Structure): - pass - RSA_p = POINTER(RSA) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - d2i_RSAPrivateKey = F(RSA_p, 'd2i_RSAPrivateKey', - [RSA_p, c_char_pp, c_long]) - RSA_size = F(c_int, 'RSA_size', [RSA_p]) - RSA_private_decrypt = F(c_int, 'RSA_private_decrypt', - [c_int, c_char_p, c_char_p, RSA_p, c_int]) - RSA_free = F(None, 'RSA_free', [RSA_p]) - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', - [c_char_p, c_int, AES_KEY_p]) - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt', - [c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, - c_int]) - - class RSA(object): - def __init__(self, der): - buf = create_string_buffer(der) - pp = c_char_pp(cast(buf, c_char_p)) - rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) - if rsa is None: - raise ADEPTError('Error parsing ADEPT user key DER') - - def decrypt(self, from_): - rsa = self._rsa - to = create_string_buffer(RSA_size(rsa)) - dlen = RSA_private_decrypt(len(from_), from_, to, rsa, - RSA_NO_PADDING) - if dlen < 0: - raise ADEPTError('RSA decryption failed') - return to[:dlen] - - def __del__(self): - if self._rsa is not None: - RSA_free(self._rsa) - self._rsa = None - - class AES(object): - def __init__(self, userkey): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise ADEPTError('AES improper key used') - return - key = self._key = AES_KEY() - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) - if rv < 0: - raise ADEPTError('Failed to initialize AES key') - - def decrypt(self, data): - out = create_string_buffer(len(data)) - iv = (b"\x00" * self._blocksize) - rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0) - if rv == 0: - raise ADEPTError('AES decryption failed') - return out.raw - - return (AES, RSA) - -def _load_crypto_pycrypto(): - try: - from Cryptodome.Cipher import AES as _AES - from Cryptodome.PublicKey import RSA as _RSA - from Cryptodome.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 - except: - from Crypto.Cipher import AES as _AES - from Crypto.PublicKey import RSA as _RSA - from Crypto.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 - - # ASN.1 parsing code from tlslite - class ASN1Error(Exception): - pass - - class ASN1Parser(object): - class Parser(object): - def __init__(self, bytes): - self.bytes = bytes - self.index = 0 - - def get(self, length): - if self.index + length > len(self.bytes): - raise ASN1Error("Error decoding ASN.1") - x = 0 - for count in range(length): - x <<= 8 - x |= self.bytes[self.index] - self.index += 1 - return x - - def getFixBytes(self, lengthBytes): - bytes = self.bytes[self.index : self.index+lengthBytes] - self.index += lengthBytes - return bytes - - def getVarBytes(self, lengthLength): - lengthBytes = self.get(lengthLength) - return self.getFixBytes(lengthBytes) - - def getFixList(self, length, lengthList): - l = [0] * lengthList - for x in range(lengthList): - l[x] = self.get(length) - return l - - def getVarList(self, length, lengthLength): - lengthList = self.get(lengthLength) - if lengthList % length != 0: - raise ASN1Error("Error decoding ASN.1") - lengthList = int(lengthList/length) - l = [0] * lengthList - for x in range(lengthList): - l[x] = self.get(length) - return l - - def startLengthCheck(self, lengthLength): - self.lengthCheck = self.get(lengthLength) - self.indexCheck = self.index - - def setLengthCheck(self, length): - self.lengthCheck = length - self.indexCheck = self.index - - def stopLengthCheck(self): - if (self.index - self.indexCheck) != self.lengthCheck: - raise ASN1Error("Error decoding ASN.1") - - def atLengthCheck(self): - if (self.index - self.indexCheck) < self.lengthCheck: - return False - elif (self.index - self.indexCheck) == self.lengthCheck: - return True - else: - raise ASN1Error("Error decoding ASN.1") - - def __init__(self, bytes): - p = self.Parser(bytes) - p.get(1) - self.length = self._getASN1Length(p) - self.value = p.getFixBytes(self.length) - - def getChild(self, which): - p = self.Parser(self.value) - for x in range(which+1): - markIndex = p.index - p.get(1) - length = self._getASN1Length(p) - p.getFixBytes(length) - return ASN1Parser(p.bytes[markIndex:p.index]) - - def _getASN1Length(self, p): - firstLength = p.get(1) - if firstLength<=127: - return firstLength - else: - lengthLength = firstLength & 0x7F - return p.get(lengthLength) - - class AES(object): - def __init__(self, key): - self._aes = _AES.new(key, _AES.MODE_CBC, b'\x00'*16) - - def decrypt(self, data): - return self._aes.decrypt(data) - - class RSA(object): - def __init__(self, der): - key = ASN1Parser([x for x in der]) - key = [key.getChild(x).value for x in range(1, 4)] - key = [self.bytesToNumber(v) for v in key] - self._rsa = _RSA.construct(key) - - def bytesToNumber(self, bytes): - total = 0 - for byte in bytes: - total = (total << 8) + byte - return total - - def decrypt(self, data): - return _PKCS1_v1_5.new(self._rsa).decrypt(data, 172) - - return (AES, RSA) - -def _load_crypto(): - AES = RSA = None - cryptolist = (_load_crypto_libcrypto, _load_crypto_pycrypto) - if sys.platform.startswith('win'): - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - AES, RSA = loader() - break - except (ImportError, ADEPTError): - pass - return (AES, RSA) - -AES, RSA = _load_crypto() - META_NAMES = ('mimetype', 'META-INF/rights.xml') NSMAP = {'adept': 'http://ns.adobe.com/adept', 'enc': 'http://www.w3.org/2001/04/xmlenc#'} @@ -355,7 +137,7 @@ def _load_crypto(): class Decryptor(object): def __init__(self, bookkey, encryption): enc = lambda tag: '{%s}%s' % (NSMAP['enc'], tag) - self._aes = AES(bookkey) + self._aes = AES.new(bookkey, AES.MODE_CBC, b'\x00'*16) encryption = etree.fromstring(encryption) self._encrypted = encrypted = set() self._otherData = otherData = set() @@ -373,11 +155,11 @@ def __init__(self, bookkey, encryption): path = path.encode('utf-8') encrypted.add(path) json_elements_to_remove.add(elem.getparent().getparent()) - else: + else: path = path.encode('utf-8') otherData.add(path) self._has_remaining_xml = True - + for elem in json_elements_to_remove: elem.getparent().remove(elem) @@ -398,8 +180,8 @@ def decompress(self, bytes): except: # possibly not compressed by zip - just return bytes return bytes - return decompressed_bytes - + return decompressed_bytes + def decrypt(self, path, data): if path.encode('utf-8') in self._encrypted: data = self._aes.decrypt(data)[16:] @@ -446,49 +228,26 @@ def isPassHashBook(inpath): return True except: pass - + return False -# Checks the license file and returns the UUID the book is licensed for. +# Checks the license file and returns the UUID the book is licensed for. # This is used so that the Calibre plugin can pick the correct decryption key # first try without having to loop through all possible keys. -def adeptGetUserUUID(inpath): +def adeptGetUserUUID(inpath): with closing(ZipFile(open(inpath, 'rb'))) as inf: try: rights = etree.fromstring(inf.read('META-INF/rights.xml')) adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = './/%s' % (adept('user'),) user_uuid = ''.join(rights.findtext(expr)) - if user_uuid[:9] != "urn:uuid:": + if user_uuid[:9] != "urn:uuid:": return None return user_uuid[9:] except: return None -def verify_book_key(bookkey): - if bookkey[-17] != '\x00' and bookkey[-17] != 0: - # Byte not null, invalid result - return False - - if ((bookkey[0] != '\x02' and bookkey[0] != 2) and - ((bookkey[0] != '\x00' and bookkey[0] != 0) or - (bookkey[1] != '\x02' and bookkey[1] != 2))): - # Key not starting with "00 02" or "02" -> error - return False - - keylen = len(bookkey) - 17 - for i in range(1, keylen): - if bookkey[i] == 0 or bookkey[i] == '\x00': - # Padding data contains a space - that's not allowed. - # Probably bad decryption. - return False - - return True - def decryptBook(userkey, inpath, outpath): - if AES is None: - raise ADEPTError("PyCrypto or OpenSSL must be installed.") - with closing(ZipFile(open(inpath, 'rb'))) as inf: namelist = inf.namelist() if 'META-INF/rights.xml' not in namelist or \ @@ -508,7 +267,7 @@ def decryptBook(userkey, inpath, outpath): print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") raise ADEPTNewVersionError("Book uses new ADEPT encryption") - + if len(bookkey) == 172: print("{0:s} is a secure Adobe Adept ePub.".format(os.path.basename(inpath))) elif len(bookkey) == 64: @@ -519,28 +278,21 @@ def decryptBook(userkey, inpath, outpath): if len(bookkey) != 64: # Normal Adobe ADEPT - rsa = RSA(userkey) - bookkey = rsa.decrypt(base64.b64decode(bookkey.encode('ascii'))) - - # Verify key: - if len(bookkey) > 16: - # Padded as per RSAES-PKCS1-v1_5 - if verify_book_key(bookkey): - bookkey = bookkey[-16:] - else: - print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) - return 2 - else: + rsakey = RSA.import_key(userkey) # parses the ASN1 structure + bookkey = base64.b64decode(bookkey) + try: + bookkey = PKCS1_v1_5.new(rsakey).decrypt(bookkey, None) # automatically unpads + except ValueError: + bookkey = None + + if bookkey is None: + print("Could not decrypt {0:s}. Wrong key".format(os.path.basename(inpath))) + return 2 + else: # Adobe PassHash / B&N key = base64.b64decode(userkey)[:16] - aes = AES(key) - bookkey = aes.decrypt(base64.b64decode(bookkey)) - if type(bookkey[-1]) != int: - pad = ord(bookkey[-1]) - else: - pad = bookkey[-1] - - bookkey = bookkey[:-pad] + bookkey = base64.b64decode(bookkey) + bookkey = unpad(AES.new(key, AES.MODE_CBC, b'\x00'*16).decrypt(bookkey), 16) # PKCS#7 if len(bookkey) > 16: bookkey = bookkey[-16:] diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 9bbf0921..2364c12a 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -3,7 +3,7 @@ # ineptpdf.py # Copyright © 2009-2020 by i♥cabbages, Apprentice Harper et al. -# Copyright © 2021 by noDRM +# Copyright © 2021-2022 by noDRM et al. # Released under the terms of the GNU General Public Licence, version 3 # @@ -48,27 +48,37 @@ # 8.0.6 - Replace use of float by Decimal for greater precision, and import tkFileDialog # 9.0.0 - Add Python 3 compatibility for calibre 5 # 9.1.0 - Support for decrypting with owner password, support for V=5, R=5 and R=6 PDF files, support for AES256-encrypted PDFs. +# 9.1.1 - Only support PyCryptodome; clean up the code """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "9.1.0" +__version__ = "9.1.1" import codecs +import hashlib import sys import os import re import zlib import struct -import hashlib from io import BytesIO from decimal import Decimal import itertools import xml.etree.ElementTree as etree import traceback +try: + from Cryptodome.Cipher import AES, ARC4, PKCS1_v1_5 + from Cryptodome.PublicKey import RSA + from Cryptodome.Util.Padding import unpad +except ImportError: + from Crypto.Cipher import AES, ARC4, PKCS1_v1_5 + from Crypto.PublicKey import RSA + from Crypto.Util.Padding import unpad + # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get # encoded using "replace" before writing them. @@ -140,313 +150,8 @@ class ADEPTInvalidPasswordError(Exception): class ADEPTNewVersionError(Exception): pass - -import hashlib - def SHA256(message): - ctx = hashlib.sha256() - ctx.update(message) - return ctx.digest() - - -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if sys.platform.startswith('win'): - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise ADEPTError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - - RSA_NO_PADDING = 3 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - class RC4_KEY(Structure): - _fields_ = [('x', c_int), ('y', c_int), ('box', c_int * 256)] - RC4_KEY_p = POINTER(RC4_KEY) - - class RSA(Structure): - pass - RSA_p = POINTER(RSA) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p,c_int]) - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) - AES_set_encrypt_key = F(c_int, 'AES_set_encrypt_key',[c_char_p, c_int, AES_KEY_p]) - - RC4_set_key = F(None,'RC4_set_key',[RC4_KEY_p, c_int, c_char_p]) - RC4_crypt = F(None,'RC4',[RC4_KEY_p, c_int, c_char_p, c_char_p]) - - d2i_RSAPrivateKey = F(RSA_p, 'd2i_RSAPrivateKey', - [RSA_p, c_char_pp, c_long]) - RSA_size = F(c_int, 'RSA_size', [RSA_p]) - RSA_private_decrypt = F(c_int, 'RSA_private_decrypt', - [c_int, c_char_p, c_char_p, RSA_p, c_int]) - RSA_free = F(None, 'RSA_free', [RSA_p]) - - class RSA(object): - def __init__(self, der): - buf = create_string_buffer(der) - pp = c_char_pp(cast(buf, c_char_p)) - rsa = self._rsa = d2i_RSAPrivateKey(None, pp, len(der)) - if rsa is None: - raise ADEPTError('Error parsing ADEPT user key DER') - - def decrypt(self, from_): - rsa = self._rsa - to = create_string_buffer(RSA_size(rsa)) - dlen = RSA_private_decrypt(len(from_), from_, to, rsa, - RSA_NO_PADDING) - if dlen < 0: - raise ADEPTError('RSA decryption failed') - return to[1:dlen] - - def __del__(self): - if self._rsa is not None: - RSA_free(self._rsa) - self._rsa = None - - class ARC4(object): - @classmethod - def new(cls, userkey): - self = ARC4() - self._blocksize = len(userkey) - key = self._key = RC4_KEY() - RC4_set_key(key, self._blocksize, userkey) - return self - def __init__(self): - self._blocksize = 0 - self._key = None - def decrypt(self, data): - out = create_string_buffer(len(data)) - RC4_crypt(self._key, len(data), data, out) - return out.raw - - class AES(object): - MODE_CBC = 0 - @classmethod - def new(cls, userkey, mode, iv, decrypt=True): - self = AES() - self._blocksize = len(userkey) - # mode is ignored since CBCMODE is only thing supported/used so far - self._mode = mode - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise ADEPTError('AES improper key used') - return - keyctx = self._keyctx = AES_KEY() - self._iv = iv - self._isDecrypt = decrypt - if decrypt: - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) - else: - rv = AES_set_encrypt_key(userkey, len(userkey) * 8, keyctx) - if rv < 0: - raise ADEPTError('Failed to initialize AES key') - return self - def __init__(self): - self._blocksize = 0 - self._keyctx = None - self._iv = 0 - self._mode = 0 - self._isDecrypt = None - def decrypt(self, data): - if not self._isDecrypt: - raise ADEPTError("AES not ready for decryption") - out = create_string_buffer(len(data)) - rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 0) - if rv == 0: - raise ADEPTError('AES decryption failed') - return out.raw - def encrypt(self, data): - if self._isDecrypt: - raise ADEPTError("AES not ready for encryption") - out = create_string_buffer(len(data)) - rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, self._iv, 1) - if rv == 0: - raise ADEPTError('AES decryption failed') - return out.raw - - return (ARC4, RSA, AES) - - -def _load_crypto_pycrypto(): - from Crypto.PublicKey import RSA as _RSA - from Crypto.Cipher import ARC4 as _ARC4 - from Crypto.Cipher import AES as _AES - from Crypto.Cipher import PKCS1_v1_5 as _PKCS1_v1_5 - - # ASN.1 parsing code from tlslite - class ASN1Error(Exception): - pass - - class ASN1Parser(object): - class Parser(object): - def __init__(self, bytes): - self.bytes = bytes - self.index = 0 - - def get(self, length): - if self.index + length > len(self.bytes): - raise ASN1Error("Error decoding ASN.1") - x = 0 - for count in range(length): - x <<= 8 - x |= self.bytes[self.index] - self.index += 1 - return x - - def getFixBytes(self, lengthBytes): - bytes = self.bytes[self.index : self.index+lengthBytes] - self.index += lengthBytes - return bytes - - def getVarBytes(self, lengthLength): - lengthBytes = self.get(lengthLength) - return self.getFixBytes(lengthBytes) - - def getFixList(self, length, lengthList): - l = [0] * lengthList - for x in range(lengthList): - l[x] = self.get(length) - return l - - def getVarList(self, length, lengthLength): - lengthList = self.get(lengthLength) - if lengthList % length != 0: - raise ASN1Error("Error decoding ASN.1") - lengthList = int(lengthList/length) - l = [0] * lengthList - for x in range(lengthList): - l[x] = self.get(length) - return l - - def startLengthCheck(self, lengthLength): - self.lengthCheck = self.get(lengthLength) - self.indexCheck = self.index - - def setLengthCheck(self, length): - self.lengthCheck = length - self.indexCheck = self.index - - def stopLengthCheck(self): - if (self.index - self.indexCheck) != self.lengthCheck: - raise ASN1Error("Error decoding ASN.1") - - def atLengthCheck(self): - if (self.index - self.indexCheck) < self.lengthCheck: - return False - elif (self.index - self.indexCheck) == self.lengthCheck: - return True - else: - raise ASN1Error("Error decoding ASN.1") - - def __init__(self, bytes): - p = self.Parser(bytes) - p.get(1) - self.length = self._getASN1Length(p) - self.value = p.getFixBytes(self.length) - - def getChild(self, which): - p = self.Parser(self.value) - for x in range(which+1): - markIndex = p.index - p.get(1) - length = self._getASN1Length(p) - p.getFixBytes(length) - return ASN1Parser(p.bytes[markIndex:p.index]) - - def _getASN1Length(self, p): - firstLength = p.get(1) - if firstLength<=127: - return firstLength - else: - lengthLength = firstLength & 0x7F - return p.get(lengthLength) - - class ARC4(object): - @classmethod - def new(cls, userkey): - self = ARC4() - self._arc4 = _ARC4.new(userkey) - return self - def __init__(self): - self._arc4 = None - def decrypt(self, data): - return self._arc4.decrypt(data) - - class AES(object): - MODE_CBC = _AES.MODE_CBC - @classmethod - def new(cls, userkey, mode, iv, decrypt=True): - self = AES() - self._aes = _AES.new(userkey, mode, iv) - self._decrypt = decrypt - return self - def __init__(self): - self._aes = None - self._decrypt = None - def decrypt(self, data): - if not self._decrypt: - raise ADEPTError("AES not ready for decrypt.") - - return self._aes.decrypt(data) - def encrypt(self, data): - if self._decrypt: - raise ADEPTError("AES not ready for encrypt.") - return self._aes.encrypt(data) - - class RSA(object): - def __init__(self, der): - key = ASN1Parser([x for x in der]) - key = [key.getChild(x).value for x in range(1, 4)] - key = [self.bytesToNumber(v) for v in key] - self._rsa = _RSA.construct(key) - - def bytesToNumber(self, bytes): - total = 0 - for byte in bytes: - total = (total << 8) + byte - return total - - def decrypt(self, data): - return _PKCS1_v1_5.new(self._rsa).decrypt(data, 172) - - return (ARC4, RSA, AES) - -def _load_crypto(): - ARC4 = RSA = AES = None - cryptolist = (_load_crypto_libcrypto, _load_crypto_pycrypto) - if sys.platform.startswith('win'): - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - ARC4, RSA, AES = loader() - break - except (ImportError, ADEPTError): - pass - return (ARC4, RSA, AES) -ARC4, RSA, AES = _load_crypto() - - - + return hashlib.sha256(message).digest() # Do we generate cross reference streams on output? # 0 = never @@ -668,7 +373,7 @@ def parse_main(self, s, i): if isinstance(s[j], str): # Python 2 c = s[j] - else: + else: # Python 3 c = bytes([s[j]]) self.tokenstart = self.bufpos+j @@ -1593,14 +1298,14 @@ def genkey_adobe_ps(self, param): def check_user_password(self, password, docid, param): V = int_value(param.get('V', 0)) - if V < 5: + if V < 5: return self.check_user_password_V4(password, docid, param) else: return self.check_user_password_V5(password, param) def check_owner_password(self, password, docid, param): V = int_value(param.get('V', 0)) - if V < 5: + if V < 5: return self.check_owner_password_V4(password, docid, param) else: return self.check_owner_password_V5(password, param) @@ -1664,7 +1369,7 @@ def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: return plaintext else: aes = AES.new(key, AES.MODE_CBC, iv, False) - new_data = bytes(data * repetitions) + new_data = bytes(data * repetitions) crypt = aes.encrypt(new_data) return crypt @@ -1674,7 +1379,7 @@ def hash_V5(self, password, salt, userdata, param): K = SHA256(password + salt + userdata) if R < 6: return K - elif R == 6: + elif R == 6: round_number = 0 done = False while (not done): @@ -1684,24 +1389,7 @@ def hash_V5(self, password, salt, userdata, param): raise Exception("K1 < 32 ...") #def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: int = 1, iv: bytes = None): E = self.process_with_aes(K[:16], True, K1, 64, K[16:32]) - - E_mod_3 = 0 - for i in range(16): - E_mod_3 += E[i] - E_mod_3 = E_mod_3 % 3 - - if E_mod_3 == 0: - ctx = hashlib.sha256() - ctx.update(E) - K = ctx.digest() - elif E_mod_3 == 1: - ctx = hashlib.sha384() - ctx.update(E) - K = ctx.digest() - else: - ctx = hashlib.sha512() - ctx.update(E) - K = ctx.digest() + K = (hashlib.sha256, hashlib.sha384, hashlib.sha512)[sum(E) % 3](E).digest() if round_number >= 64: ch = int.from_bytes(E[-1:], "big", signed=False) @@ -1720,7 +1408,7 @@ def check_owner_password_V4(self, password, docid, param): V = int_value(param.get('V', 0)) if V >= 5: raise Exception("compute_O_rc4_key not possible with V>= 5") - + R = int_value(param.get('R', 0)) length = int_value(param.get('Length', 40)) # Key length (bits) @@ -1730,10 +1418,10 @@ def check_owner_password_V4(self, password, docid, param): for _ in range(50): hash = hashlib.md5(hash.digest()[:length//8]) hash = hash.digest()[:length//8] - + # "hash" is the return value of compute_O_rc4_key - Odata = str_value(param.get('O')) + Odata = str_value(param.get('O')) # now call iterate_rc4 ... x = ARC4.new(hash).decrypt(Odata) # 4 if R >= 3: @@ -1741,25 +1429,25 @@ def check_owner_password_V4(self, password, docid, param): k = b''.join(bytes([c ^ i]) for c in hash ) x = ARC4.new(k).decrypt(x) - + # "x" is now the padded user password. - # If we wanted to recover / extract the user password, + # If we wanted to recover / extract the user password, # we'd need to trim off the padding string from the end. - # As we just want to get access to the encryption key, + # As we just want to get access to the encryption key, # we can just hand the password into the check_user_password # as it is, as that function would be adding padding anyways. # This trick only works with V4 and lower. - + enc_key = self.check_user_password(x, docid, param) if enc_key is not None: return enc_key return False - - + + def check_user_password_V4(self, password, docid, param): V = int_value(param.get('V', 0)) @@ -1803,10 +1491,10 @@ def check_user_password_V4(self, password, docid, param): is_authenticated = (u1 == U) else: is_authenticated = (u1[:16] == U[:16]) - + if is_authenticated: return key - + return None def initialize_standard(self, password, docid, param): @@ -1842,7 +1530,7 @@ def initialize_standard(self, password, docid, param): self.decrypt_key = retval if self.decrypt_key is None or self.decrypt_key is True or self.decrypt_key is False: - raise ADEPTInvalidPasswordError("Password invalid.") + raise ADEPTInvalidPasswordError("Password invalid.") P = int_value(param['P']) @@ -1868,8 +1556,8 @@ def initialize_standard(self, password, docid, param): set_decipher = False if V >= 4: - # Check if we need new genkey_v4 - only if we're using AES. - try: + # Check if we need new genkey_v4 - only if we're using AES. + try: for key in param['CF']: algo = str(param["CF"][key]["CFM"]) if algo == "/AESV2": @@ -1893,46 +1581,26 @@ def initialize_standard(self, password, docid, param): self.decipher = self.decrypt_rc4 # XXX may be AES # aes if not set_decipher: - # This should usually already be set by now. + # This should usually already be set by now. # If it's not, assume that V4 and newer are using AES if V >= 4: self.decipher = self.decrypt_aes self.ready = True return - def verify_book_key(self, bookkey): - if bookkey[-17] != '\x00' and bookkey[-17] != 0: - # Byte not null, invalid result - return False - - if ((bookkey[0] != '\x02' and bookkey[0] != 2) and - ((bookkey[0] != '\x00' and bookkey[0] != 0) or - (bookkey[1] != '\x02' and bookkey[1] != 2))): - # Key not starting with "00 02" or "02" -> error - return False - - keylen = len(bookkey) - 17 - for i in range(1, keylen): - if bookkey[i] == 0 or bookkey[i] == '\x00': - # Padding data contains a space - that's not allowed. - # Probably bad decryption. - return False - - return True def initialize_ebx_ignoble(self, keyb64, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True key = keyb64.decode('base64')[:16] - aes = AES.new(key,AES.MODE_CBC,"\x00" * len(key)) length = int_value(param.get('Length', 0)) / 8 rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') rights = zlib.decompress(rights, -15) rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}encryptedKey' bookkey = ''.join(rights.findtext(expr)).decode('base64') - bookkey = aes.decrypt(bookkey) - bookkey = bookkey[:-ord(bookkey[-1])] - bookkey = bookkey[-16:] + bookkey = unpad(AES.new(key, AES.MODE_CBC, b'\x00'*16).decrypt(bookkey), 16) # PKCS#7 + if len(bookkey) > 16: + bookkey = bookkey[-16:] ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) # added because of improper booktype / decryption book session key errors @@ -1967,7 +1635,7 @@ def initialize_ebx_ignoble(self, keyb64, docid, param): def initialize_ebx_inept(self, password, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True - rsa = RSA(password) + rsakey = RSA.import_key(password) # parses the ASN1 structure length = int_value(param.get('Length', 0)) // 8 rights = codecs.decode(param.get('ADEPT_LICENSE'), 'base64') rights = zlib.decompress(rights, -15) @@ -1983,14 +1651,13 @@ def initialize_ebx_inept(self, password, docid, param): raise ADEPTNewVersionError("Book uses new ADEPT encryption") bookkey = codecs.decode(bookkey.encode('utf-8'),'base64') - bookkey = rsa.decrypt(bookkey) + try: + bookkey = PKCS1_v1_5.new(rsakey).decrypt(bookkey, None) # automatically unpads + except ValueError: + bookkey = None - if len(bookkey) > 16: - if (self.verify_book_key(bookkey)): - bookkey = bookkey[-16:] - length = 16 - else: - raise ADEPTError('error decrypting book session key') + if bookkey is None: + raise ADEPTError('error decrypting book session key') ebx_V = int_value(param.get('V', 4)) ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) @@ -2357,7 +2024,7 @@ def do_keyword(self, pos, token): # Takes a PDF file name as input, and if this is an ADE-protected PDF, # returns the UUID of the user that's licensed to open this file. def adeptGetUserUUID(inf): - try: + try: doc = PDFDocument() inf = open(inf, 'rb') pars = PDFParser(doc, inf) @@ -2376,11 +2043,11 @@ def adeptGetUserUUID(inf): rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}user' user_uuid = ''.join(rights.findtext(expr)) - if user_uuid[:9] != "urn:uuid:": + if user_uuid[:9] != "urn:uuid:": return None return user_uuid[9:] - except: + except: return None ### @@ -2585,8 +2252,6 @@ def serialize_indirect(self, objid, obj): def decryptBook(userkey, inpath, outpath, inept=True): - if RSA is None: - raise ADEPTError("PyCryptodome or OpenSSL must be installed.") with open(inpath, 'rb') as inf: serializer = PDFSerializer(inf, userkey, inept) with open(outpath, 'wb') as outf: @@ -2601,8 +2266,6 @@ def decryptBook(userkey, inpath, outpath, inept=True): def getPDFencryptionType(inpath): - if RSA is None: - raise ADEPTError("PyCryptodome or OpenSSL must be installed.") with open(inpath, 'rb') as inf: doc = doc = PDFDocument() parser = PDFParser(doc, inf) @@ -2735,13 +2398,6 @@ def decrypt(self): root = tkinter.Tk() - if RSA is None: - root.withdraw() - tkinter.messagebox.showerror( - "INEPT PDF", - "This script requires OpenSSL or PyCrypto, which must be installed " - "separately. Read the top-of-script comment for details.") - return 1 root.title("Adobe Adept PDF Decrypter v.{0}".format(__version__)) root.resizable(True, False) root.minsize(370, 0) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index f102ec5f..f9cd879a 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -30,8 +30,14 @@ from io import BytesIO -from Crypto.Cipher import AES -from Crypto.Util.py3compat import bchr +try: + from Cryptodome.Cipher import AES + from Cryptodome.Util.py3compat import bchr + from Cryptodome.Util.Padding import unpad +except ImportError: + from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad + from Crypto.Util.py3compat import bchr try: # lzma library from calibre 4.6.0 or later @@ -744,23 +750,6 @@ def addprottable(ion): ion.addtocatalog("ProtectedData", 1, SYM_NAMES) -def pkcs7pad(msg, blocklen): - paddinglen = blocklen - len(msg) % blocklen - padding = bchr(paddinglen) * paddinglen - return msg + padding - - -def pkcs7unpad(msg, blocklen): - _assert(len(msg) % blocklen == 0) - - paddinglen = msg[-1] - - _assert(paddinglen > 0 and paddinglen <= blocklen, "Incorrect padding - Wrong key") - _assert(msg[-paddinglen:] == bchr(paddinglen) * paddinglen, "Incorrect padding - Wrong key") - - return msg[:-paddinglen] - - # every VoucherEnvelope version has a corresponding "word" and magic number, used in obfuscating the shared secret OBFUSCATION_TABLE = { "V1": (0x00, None), @@ -876,7 +865,7 @@ def decryptvoucher(self): key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) b = aes.decrypt(self.ciphertext) - b = pkcs7unpad(b, 16) + b = unpad(b, 16) self.drmkey = BinaryIonParser(BytesIO(b)) addprottable(self.drmkey) @@ -1082,7 +1071,7 @@ def print_(self, lst): def processpage(self, ct, civ, outpages, decompress, decrypt): if decrypt: aes = AES.new(self.key[:16], AES.MODE_CBC, civ[:16]) - msg = pkcs7unpad(aes.decrypt(ct), 16) + msg = unpad(aes.decrypt(ct), 16) else: msg = ct diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index f9f79a47..0ce800d8 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -2,10 +2,10 @@ # -*- coding: utf-8 -*- # kindlekey.py -# Copyright © 2008-2020 Apprentice Harper et al. +# Copyright © 2008-2022 Apprentice Harper et al. __license__ = 'GPL v3' -__version__ = '3.0' +__version__ = '3.1' # Revision history: # 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc. @@ -30,6 +30,7 @@ # 2.7 - Finish .kinf2018 support, PC & Mac by Apprentice Sakuya # 2.8 - Fix for Mac OS X Big Sur # 3.0 - Python 3 for calibre 5.0 +# 3.1 - Only support PyCryptodome; clean up the code """ @@ -42,6 +43,16 @@ import json import getopt import traceback +import hashlib + +try: + from Cryptodome.Cipher import AES + from Cryptodome.Util import Counter + from Cryptodome.Protocol.KDF import PBKDF2 +except ImportError: + from Crypto.Cipher import AES + from Crypto.Util import Counter + from Crypto.Protocol.KDF import PBKDF2 try: RegError @@ -121,22 +132,16 @@ class DrmException(Exception): pass # crypto digestroutines -import hashlib def MD5(message): - ctx = hashlib.md5() - ctx.update(message) - return ctx.digest() + return hashlib.md5(message).digest() def SHA1(message): - ctx = hashlib.sha1() - ctx.update(message) - return ctx.digest() + return hashlib.sha1(message).digest() def SHA256(message): - ctx = hashlib.sha256() - ctx.update(message) - return ctx.digest() + return hashlib.sha256(message).digest() + # For K4M/PC 1.6.X and later def primes(n): @@ -189,6 +194,12 @@ def decode(data,map): result += pack('B',value) return result +def UnprotectHeaderData(encryptedData): + passwdData = b'header_key_data' + salt = b'HEADER.2011' + key_iv = PBKDF2(passwdData, salt, dkLen=256, count=128) + return AES.new(key_iv[0:32], AES.MODE_CBC, key_iv[32:48]).decrypt(encryptedData) + # Routines unique to Mac and PC if iswindows: from ctypes import windll, c_char_p, c_wchar_p, c_uint, POINTER, byref, \ @@ -205,636 +216,6 @@ def decode(data,map): advapi32 = windll.advapi32 crypt32 = windll.crypt32 - try: - # try to get fast routines from alfcrypto - from alfcrypto import AES_CBC, KeyIVGen - except: - # alfcrypto not available, so use python implementations - """ - Routines for doing AES CBC in one file - - Modified by some_updates to extract - and combine only those parts needed for AES CBC - into one simple to add python file - - Original Version - Copyright (c) 2002 by Paul A. Lambert - Under: - CryptoPy Artistic License Version 1.0 - See the wonderful pure python package cryptopy-1.2.5 - and read its LICENSE.txt for complete license details. - """ - - class CryptoError(Exception): - """ Base class for crypto exceptions """ - def __init__(self,errorMessage='Error!'): - self.message = errorMessage - def __str__(self): - return self.message - - class InitCryptoError(CryptoError): - """ Crypto errors during algorithm initialization """ - class BadKeySizeError(InitCryptoError): - """ Bad key size error """ - class EncryptError(CryptoError): - """ Error in encryption processing """ - class DecryptError(CryptoError): - """ Error in decryption processing """ - class DecryptNotBlockAlignedError(DecryptError): - """ Error in decryption processing """ - - def xor(a,b): - """ XOR two byte arrays, to lesser length """ - x = [] - for i in range(min(len(a),len(b))): - x.append( a[i] ^ b[i]) - return bytes(x) - - """ - Base 'BlockCipher' and Pad classes for cipher instances. - BlockCipher supports automatic padding and type conversion. The BlockCipher - class was written to make the actual algorithm code more readable and - not for performance. - """ - - class BlockCipher: - """ Block ciphers """ - def __init__(self): - self.reset() - - def reset(self): - self.resetEncrypt() - self.resetDecrypt() - def resetEncrypt(self): - self.encryptBlockCount = 0 - self.bytesToEncrypt = b'' - def resetDecrypt(self): - self.decryptBlockCount = 0 - self.bytesToDecrypt = b'' - - def encrypt(self, plainText, more = None): - """ Encrypt a string and return a binary string """ - self.bytesToEncrypt += plainText # append plainText to any bytes from prior encrypt - numBlocks, numExtraBytes = divmod(len(self.bytesToEncrypt), self.blockSize) - cipherText = '' - for i in range(numBlocks): - bStart = i*self.blockSize - ctBlock = self.encryptBlock(self.bytesToEncrypt[bStart:bStart+self.blockSize]) - self.encryptBlockCount += 1 - cipherText += ctBlock - if numExtraBytes > 0: # save any bytes that are not block aligned - self.bytesToEncrypt = self.bytesToEncrypt[-numExtraBytes:] - else: - self.bytesToEncrypt = '' - - if more == None: # no more data expected from caller - finalBytes = self.padding.addPad(self.bytesToEncrypt,self.blockSize) - if len(finalBytes) > 0: - ctBlock = self.encryptBlock(finalBytes) - self.encryptBlockCount += 1 - cipherText += ctBlock - self.resetEncrypt() - return cipherText - - def decrypt(self, cipherText, more = None): - """ Decrypt a string and return a string """ - self.bytesToDecrypt += cipherText # append to any bytes from prior decrypt - - numBlocks, numExtraBytes = divmod(len(self.bytesToDecrypt), self.blockSize) - if more == None: # no more calls to decrypt, should have all the data - if numExtraBytes != 0: - raise DecryptNotBlockAlignedError('Data not block aligned on decrypt') - - # hold back some bytes in case last decrypt has zero len - if (more != None) and (numExtraBytes == 0) and (numBlocks >0) : - numBlocks -= 1 - numExtraBytes = self.blockSize - - plainText = b'' - for i in range(numBlocks): - bStart = i*self.blockSize - ptBlock = self.decryptBlock(self.bytesToDecrypt[bStart : bStart+self.blockSize]) - self.decryptBlockCount += 1 - plainText += ptBlock - - if numExtraBytes > 0: # save any bytes that are not block aligned - self.bytesToEncrypt = self.bytesToEncrypt[-numExtraBytes:] - else: - self.bytesToEncrypt = '' - - if more == None: # last decrypt remove padding - plainText = self.padding.removePad(plainText, self.blockSize) - self.resetDecrypt() - return plainText - - - class Pad: - def __init__(self): - pass # eventually could put in calculation of min and max size extension - - class padWithPadLen(Pad): - """ Pad a binary string with the length of the padding """ - - def addPad(self, extraBytes, blockSize): - """ Add padding to a binary string to make it an even multiple - of the block size """ - blocks, numExtraBytes = divmod(len(extraBytes), blockSize) - padLength = blockSize - numExtraBytes - return extraBytes + padLength*chr(padLength) - - def removePad(self, paddedBinaryString, blockSize): - """ Remove padding from a binary string """ - if not(0 6 and i%Nk == 4 : - temp = [ Sbox[byte] for byte in temp ] # SubWord(temp) - w.append( [ w[i-Nk][byte]^temp[byte] for byte in range(4) ] ) - return w - - Rcon = (0,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36, # note extra '0' !!! - 0x6c,0xd8,0xab,0x4d,0x9a,0x2f,0x5e,0xbc,0x63,0xc6, - 0x97,0x35,0x6a,0xd4,0xb3,0x7d,0xfa,0xef,0xc5,0x91) - - #------------------------------------- - def AddRoundKey(algInstance, keyBlock): - """ XOR the algorithm state with a block of key material """ - for column in range(algInstance.Nb): - for row in range(4): - algInstance.state[column][row] ^= keyBlock[column][row] - #------------------------------------- - - def SubBytes(algInstance): - for column in range(algInstance.Nb): - for row in range(4): - algInstance.state[column][row] = Sbox[algInstance.state[column][row]] - - def InvSubBytes(algInstance): - for column in range(algInstance.Nb): - for row in range(4): - algInstance.state[column][row] = InvSbox[algInstance.state[column][row]] - - Sbox = (0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5, - 0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, - 0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0, - 0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, - 0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc, - 0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, - 0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a, - 0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, - 0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0, - 0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, - 0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b, - 0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, - 0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85, - 0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, - 0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5, - 0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, - 0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17, - 0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, - 0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88, - 0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, - 0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c, - 0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, - 0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9, - 0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, - 0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6, - 0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, - 0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e, - 0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, - 0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94, - 0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, - 0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68, - 0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16) - - InvSbox = (0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38, - 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, - 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87, - 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, - 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d, - 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, - 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2, - 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, - 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16, - 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, - 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda, - 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, - 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a, - 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, - 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02, - 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, - 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea, - 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, - 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85, - 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, - 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89, - 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, - 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20, - 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, - 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31, - 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, - 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d, - 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, - 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0, - 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, - 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26, - 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d) - - #------------------------------------- - """ For each block size (Nb), the ShiftRow operation shifts row i - by the amount Ci. Note that row 0 is not shifted. - Nb C1 C2 C3 - ------------------- """ - shiftOffset = { 4 : ( 0, 1, 2, 3), - 5 : ( 0, 1, 2, 3), - 6 : ( 0, 1, 2, 3), - 7 : ( 0, 1, 2, 4), - 8 : ( 0, 1, 3, 4) } - def ShiftRows(algInstance): - tmp = [0]*algInstance.Nb # list of size Nb - for r in range(1,4): # row 0 reamains unchanged and can be skipped - for c in range(algInstance.Nb): - tmp[c] = algInstance.state[(c+shiftOffset[algInstance.Nb][r]) % algInstance.Nb][r] - for c in range(algInstance.Nb): - algInstance.state[c][r] = tmp[c] - def InvShiftRows(algInstance): - tmp = [0]*algInstance.Nb # list of size Nb - for r in range(1,4): # row 0 reamains unchanged and can be skipped - for c in range(algInstance.Nb): - tmp[c] = algInstance.state[(c+algInstance.Nb-shiftOffset[algInstance.Nb][r]) % algInstance.Nb][r] - for c in range(algInstance.Nb): - algInstance.state[c][r] = tmp[c] - #------------------------------------- - def MixColumns(a): - Sprime = [0,0,0,0] - for j in range(a.Nb): # for each column - Sprime[0] = mul(2,a.state[j][0])^mul(3,a.state[j][1])^mul(1,a.state[j][2])^mul(1,a.state[j][3]) - Sprime[1] = mul(1,a.state[j][0])^mul(2,a.state[j][1])^mul(3,a.state[j][2])^mul(1,a.state[j][3]) - Sprime[2] = mul(1,a.state[j][0])^mul(1,a.state[j][1])^mul(2,a.state[j][2])^mul(3,a.state[j][3]) - Sprime[3] = mul(3,a.state[j][0])^mul(1,a.state[j][1])^mul(1,a.state[j][2])^mul(2,a.state[j][3]) - for i in range(4): - a.state[j][i] = Sprime[i] - - def InvMixColumns(a): - """ Mix the four bytes of every column in a linear way - This is the opposite operation of Mixcolumn """ - Sprime = [0,0,0,0] - for j in range(a.Nb): # for each column - Sprime[0] = mul(0x0E,a.state[j][0])^mul(0x0B,a.state[j][1])^mul(0x0D,a.state[j][2])^mul(0x09,a.state[j][3]) - Sprime[1] = mul(0x09,a.state[j][0])^mul(0x0E,a.state[j][1])^mul(0x0B,a.state[j][2])^mul(0x0D,a.state[j][3]) - Sprime[2] = mul(0x0D,a.state[j][0])^mul(0x09,a.state[j][1])^mul(0x0E,a.state[j][2])^mul(0x0B,a.state[j][3]) - Sprime[3] = mul(0x0B,a.state[j][0])^mul(0x0D,a.state[j][1])^mul(0x09,a.state[j][2])^mul(0x0E,a.state[j][3]) - for i in range(4): - a.state[j][i] = Sprime[i] - - #------------------------------------- - def mul(a, b): - """ Multiply two elements of GF(2^m) - needed for MixColumn and InvMixColumn """ - if (a !=0 and b!=0): - return Alogtable[(Logtable[a] + Logtable[b])%255] - else: - return 0 - - Logtable = ( 0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3, - 100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193, - 125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120, - 101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142, - 150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56, - 102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16, - 126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186, - 43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87, - 175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232, - 44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160, - 127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183, - 204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157, - 151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209, - 83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171, - 68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165, - 103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7) - - Alogtable= ( 1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53, - 95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170, - 229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49, - 83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205, - 76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136, - 131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154, - 181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163, - 254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160, - 251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65, - 195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117, - 159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128, - 155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84, - 252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202, - 69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14, - 18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23, - 57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1) - - - - - """ - AES Encryption Algorithm - The AES algorithm is just Rijndael algorithm restricted to the default - blockSize of 128 bits. - """ - - class AES(Rijndael): - """ The AES algorithm is the Rijndael block cipher restricted to block - sizes of 128 bits and key sizes of 128, 192 or 256 bits - """ - def __init__(self, key = None, padding = padWithPadLen(), keySize=16): - """ Initialize AES, keySize is in bytes """ - if not (keySize == 16 or keySize == 24 or keySize == 32) : - raise BadKeySizeError('Illegal AES key size, must be 16, 24, or 32 bytes') - - Rijndael.__init__( self, key, padding=padding, keySize=keySize, blockSize=16 ) - - self.name = 'AES' - - - """ - CBC mode of encryption for block ciphers. - This algorithm mode wraps any BlockCipher to make a - Cipher Block Chaining mode. - """ - from random import Random # should change to crypto.random!!! - - - class CBC(BlockCipher): - """ The CBC class wraps block ciphers to make cipher block chaining (CBC) mode - algorithms. The initialization (IV) is automatic if set to None. Padding - is also automatic based on the Pad class used to initialize the algorithm - """ - def __init__(self, blockCipherInstance, padding = padWithPadLen()): - """ CBC algorithms are created by initializing with a BlockCipher instance """ - self.baseCipher = blockCipherInstance - self.name = self.baseCipher.name + '_CBC' - self.blockSize = self.baseCipher.blockSize - self.keySize = self.baseCipher.keySize - self.padding = padding - self.baseCipher.padding = noPadding() # baseCipher should NOT pad!! - self.r = Random() # for IV generation, currently uses - # mediocre standard distro version <---------------- - import time - newSeed = time.ctime()+str(self.r) # seed with instance location - self.r.seed(newSeed) # to make unique - self.reset() - - def setKey(self, key): - self.baseCipher.setKey(key) - - # Overload to reset both CBC state and the wrapped baseCipher - def resetEncrypt(self): - BlockCipher.resetEncrypt(self) # reset CBC encrypt state (super class) - self.baseCipher.resetEncrypt() # reset base cipher encrypt state - - def resetDecrypt(self): - BlockCipher.resetDecrypt(self) # reset CBC state (super class) - self.baseCipher.resetDecrypt() # reset base cipher decrypt state - - def encrypt(self, plainText, iv=None, more=None): - """ CBC encryption - overloads baseCipher to allow optional explicit IV - when iv=None, iv is auto generated! - """ - if self.encryptBlockCount == 0: - self.iv = iv - else: - assert(iv==None), 'IV used only on first call to encrypt' - - return BlockCipher.encrypt(self,plainText, more=more) - - def decrypt(self, cipherText, iv=None, more=None): - """ CBC decryption - overloads baseCipher to allow optional explicit IV - when iv=None, iv is auto generated! - """ - if self.decryptBlockCount == 0: - self.iv = iv - else: - assert(iv==None), 'IV used only on first call to decrypt' - - return BlockCipher.decrypt(self, cipherText, more=more) - - def encryptBlock(self, plainTextBlock): - """ CBC block encryption, IV is set with 'encrypt' """ - auto_IV = '' - if self.encryptBlockCount == 0: - if self.iv == None: - # generate IV and use - self.iv = ''.join([chr(self.r.randrange(256)) for i in range(self.blockSize)]) - self.prior_encr_CT_block = self.iv - auto_IV = self.prior_encr_CT_block # prepend IV if it's automatic - else: # application provided IV - assert(len(self.iv) == self.blockSize ),'IV must be same length as block' - self.prior_encr_CT_block = self.iv - """ encrypt the prior CT XORed with the PT """ - ct = self.baseCipher.encryptBlock( xor(self.prior_encr_CT_block, plainTextBlock) ) - self.prior_encr_CT_block = ct - return auto_IV+ct - - def decryptBlock(self, encryptedBlock): - """ Decrypt a single block """ - - if self.decryptBlockCount == 0: # first call, process IV - if self.iv == None: # auto decrypt IV? - self.prior_CT_block = encryptedBlock - return b'' - else: - assert(len(self.iv)==self.blockSize),"Bad IV size on CBC decryption" - self.prior_CT_block = self.iv - - dct = self.baseCipher.decryptBlock(encryptedBlock) - """ XOR the prior decrypted CT with the prior CT """ - dct_XOR_priorCT = xor( self.prior_CT_block, dct ) - - self.prior_CT_block = encryptedBlock - - return dct_XOR_priorCT - - - """ - AES_CBC Encryption Algorithm - """ - - class aescbc_AES_CBC(CBC): - """ AES encryption in CBC feedback mode """ - def __init__(self, key=None, padding=padWithPadLen(), keySize=16): - CBC.__init__( self, AES(key, noPadding(), keySize), padding) - self.name = 'AES_CBC' - - class AES_CBC(object): - def __init__(self): - self._key = None - self._iv = None - self.aes = None - - def set_decrypt_key(self, userkey, iv): - self._key = userkey - self._iv = iv - self.aes = aescbc_AES_CBC(userkey, noPadding(), len(userkey)) - - def decrypt(self, data): - iv = self._iv - cleartext = self.aes.decrypt(iv + data) - return cleartext - - import hmac - - class KeyIVGen(object): - # this only exists in openssl so we will use pure python implementation instead - # PKCS5_PBKDF2_HMAC_SHA1 = F(c_int, 'PKCS5_PBKDF2_HMAC_SHA1', - # [c_char_p, c_ulong, c_char_p, c_ulong, c_ulong, c_ulong, c_char_p]) - def pbkdf2(self, passwd, salt, iter, keylen): - - def xorbytes( a, b ): - if len(a) != len(b): - raise Exception("xorbytes(): lengths differ") - return bytes([x ^ y for x, y in zip(a, b)]) - - def prf( h, data ): - hm = h.copy() - hm.update( data ) - return hm.digest() - - def pbkdf2_F( h, salt, itercount, blocknum ): - U = prf( h, salt + pack('>i',blocknum ) ) - T = U - for i in range(2, itercount+1): - U = prf( h, U ) - T = xorbytes( T, U ) - return T - - sha = hashlib.sha1 - digest_size = sha().digest_size - # l - number of output blocks to produce - l = keylen // digest_size - if keylen % digest_size != 0: - l += 1 - h = hmac.new( passwd, None, sha ) - T = b"" - for i in range(1, l+1): - T += pbkdf2_F( h, salt, iter, i ) - return T[0: keylen] - - def UnprotectHeaderData(encryptedData): - passwdData = b'header_key_data' - salt = b'HEADER.2011' - iter = 0x80 - keylen = 0x100 - key_iv = KeyIVGen().pbkdf2(passwdData, salt, iter, keylen) - key = key_iv[0:32] - iv = key_iv[32:48] - aes=AES_CBC() - aes.set_decrypt_key(key, iv) - cleartext = aes.decrypt(encryptedData) - return cleartext - # Various character maps used to decrypt kindle info values. # Probably supposed to act as obfuscation charMap2 = b"AaZzB0bYyCc1XxDdW2wEeVv3FfUuG4g-TtHh5SsIiR6rJjQq7KkPpL8lOoMm9Nn_" @@ -1080,7 +461,7 @@ def getDBfromFile(kInfoFile): salt = str(0x6d8 * int(build)).encode('utf-8') + guid sp = GetUserName() + b'+@#$%+' + GetIDString().encode('utf-8') passwd = encode(SHA256(sp), charMap5) - key = KeyIVGen().pbkdf2(passwd, salt, 10000, 0x400)[:32] # this is very slow + key = PBKDF2(passwd, salt, count=10000, dkLen=0x400)[:32] # this is very slow # loop through the item records until all are processed while len(items) > 0: @@ -1143,8 +524,6 @@ def getDBfromFile(kInfoFile): entropy = SHA1(keyhash) + added_entropy cleartext = CryptUnprotectData(encryptedValue, entropy, 1) elif version == 6: - from Crypto.Cipher import AES - from Crypto.Util import Counter # decode using new testMap8 to get IV + ciphertext iv_ciphertext = decode(encdata, testMap8) # pad IV so that we can substitute AES-CTR for GCM @@ -1174,114 +553,8 @@ def getDBfromFile(kInfoFile): DB = {} return DB elif isosx: - import copy import subprocess - # interface to needed routines in openssl's libcrypto - def _load_crypto_libcrypto(): - from ctypes import CDLL, byref, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, addressof, string_at, cast - from ctypes.util import find_library - - libcrypto = find_library('crypto') - if libcrypto is None: - libcrypto = '/usr/lib/libcrypto.dylib' - try: - libcrypto = CDLL(libcrypto) - except Exception as e: - raise DrmException("libcrypto not found: " % e) - - # From OpenSSL's crypto aes header - # - # AES_ENCRYPT 1 - # AES_DECRYPT 0 - # AES_MAXNR 14 (in bytes) - # AES_BLOCK_SIZE 16 (in bytes) - # - # struct aes_key_st { - # unsigned long rd_key[4 *(AES_MAXNR + 1)]; - # int rounds; - # }; - # typedef struct aes_key_st AES_KEY; - # - # int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); - # - # note: the ivec string, and output buffer are both mutable - # void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, - # const unsigned long length, const AES_KEY *key, unsigned char *ivec, const int enc); - - AES_MAXNR = 14 - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p,c_int]) - - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) - - # From OpenSSL's Crypto evp/p5_crpt2.c - # - # int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, - # const unsigned char *salt, int saltlen, int iter, - # int keylen, unsigned char *out); - - PKCS5_PBKDF2_HMAC_SHA1 = F(c_int, 'PKCS5_PBKDF2_HMAC_SHA1', - [c_char_p, c_ulong, c_char_p, c_ulong, c_ulong, c_ulong, c_char_p]) - - class LibCrypto(object): - def __init__(self): - self._blocksize = 0 - self._keyctx = None - self._iv = 0 - - def set_decrypt_key(self, userkey, iv): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise DrmException("AES improper key used") - return - keyctx = self._keyctx = AES_KEY() - self._iv = iv - self._userkey = userkey - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) - if rv < 0: - raise DrmException("Failed to initialize AES key") - - def decrypt(self, data): - out = create_string_buffer(len(data)) - mutable_iv = create_string_buffer(self._iv, len(self._iv)) - keyctx = self._keyctx - rv = AES_cbc_encrypt(data, out, len(data), keyctx, mutable_iv, 0) - if rv == 0: - raise DrmException("AES decryption failed") - return out.raw - - def keyivgen(self, passwd, salt, iter, keylen): - saltlen = len(salt) - passlen = len(passwd) - out = create_string_buffer(keylen) - rv = PKCS5_PBKDF2_HMAC_SHA1(passwd, passlen, salt, saltlen, iter, keylen, out) - return out.raw - return LibCrypto - - def _load_crypto(): - LibCrypto = None - try: - LibCrypto = _load_crypto_libcrypto() - except (ImportError, DrmException): - pass - return LibCrypto - - LibCrypto = _load_crypto() - # Various character maps used to decrypt books. Probably supposed to act as obfuscation charMap1 = b'n5Pr6St7Uv8Wx9YzAb0Cd1Ef2Gh3Jk4M' charMap2 = b'ZB0bYyc1xDdW2wEV3Ff7KkPpL8UuGA4gz-Tme9Nn_tHh5SvXCsIiR6rJjQaqlOoM' @@ -1411,33 +684,13 @@ def GetIDStrings(): #print "ID Strings:\n",strings return strings - - # unprotect the new header blob in .kinf2011 - # used in Kindle for Mac Version >= 1.9.0 - def UnprotectHeaderData(encryptedData): - passwdData = b'header_key_data' - salt = b'HEADER.2011' - iter = 0x80 - keylen = 0x100 - crp = LibCrypto() - key_iv = crp.keyivgen(passwdData, salt, iter, keylen) - key = key_iv[0:32] - iv = key_iv[32:48] - crp.set_decrypt_key(key,iv) - cleartext = crp.decrypt(encryptedData) - return cleartext - - # implements an Pseudo Mac Version of Windows built-in Crypto routine class CryptUnprotectData(object): def __init__(self, entropy, IDString): sp = GetUserName() + b'+@#$%+' + IDString passwdData = encode(SHA256(sp),charMap2) salt = entropy - self.crp = LibCrypto() - iter = 0x800 - keylen = 0x400 - key_iv = self.crp.keyivgen(passwdData, salt, iter, keylen) + key_iv = PBKDF2(passwdData, salt, count=0x800, dkLen=0x400) self.key = key_iv[0:32] self.iv = key_iv[32:48] self.crp.set_decrypt_key(self.key, self.iv) @@ -1575,7 +828,7 @@ def getDBfromFile(kInfoFile): salt = str(0x6d8 * int(build)).encode('utf-8') + guid sp = GetUserName() + b'+@#$%+' + IDString passwd = encode(SHA256(sp), charMap5) - key = LibCrypto().keyivgen(passwd, salt, 10000, 0x400)[:32] + key = PBKDF2(passwd, salt, count=10000, dkLen=0x400)[:32] #print ("salt",salt) #print ("sp",sp) @@ -1647,8 +900,6 @@ def getDBfromFile(kInfoFile): cleartext = cud.decrypt(encryptedValue) elif version == 6: - from Crypto.Cipher import AES - from Crypto.Util import Counter # decode using new testMap8 to get IV + ciphertext iv_ciphertext = decode(encdata, testMap8) # pad IV so that we can substitute AES-CTR for GCM diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 843eebe5..c57b884d 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -7,7 +7,7 @@ from __future__ import print_function __license__ = 'GPL v3' -__version__ = "1.0" +__version__ = "1.1" # This is a python script. You need a Python interpreter to run it. # For example, ActiveState Python, which exists for windows. @@ -74,6 +74,7 @@ # 0.41 - Fixed potential unicode problem in command line calls # 0.42 - Added GPL v3 licence. updated/removed some print statements # 1.0 - Python 3 compatibility for calibre 5.0 +# 1.1 - Speed Python PC1 implementation up a little bit import sys import os @@ -175,7 +176,7 @@ def PC1(key, src, decryption=True): wkey = [] for i in range(8): wkey.append(key[i*2]<<8 | key[i*2+1]) - dst = b'' + dst = bytearray(len(src)) for i in range(len(src)): temp1 = 0; byteXorVal = 0; @@ -194,8 +195,8 @@ def PC1(key, src, decryption=True): keyXorVal = curByte * 257; for j in range(8): wkey[j] ^= keyXorVal; - dst+=bytes([curByte]) - return dst + dst[i] = curByte + return bytes(dst) # accepts unicode returns unicode def checksumPid(s): diff --git a/DeDRM_plugin/openssl_des.py b/DeDRM_plugin/openssl_des.py deleted file mode 100644 index 9e455b4c..00000000 --- a/DeDRM_plugin/openssl_des.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - -# implement just enough of des from openssl to make erdr2pml.py happy - -def load_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_char, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - import sys - - if sys.platform.startswith('win'): - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - return None - - libcrypto = CDLL(libcrypto) - - # typedef struct DES_ks - # { - # union - # { - # DES_cblock cblock; - # /* make sure things are correct size on machines with - # * 8 byte longs */ - # DES_LONG deslong[2]; - # } ks[16]; - # } DES_key_schedule; - - # just create a big enough place to hold everything - # it will have alignment of structure so we should be okay (16 byte aligned?) - class DES_KEY_SCHEDULE(Structure): - _fields_ = [('DES_cblock1', c_char * 16), - ('DES_cblock2', c_char * 16), - ('DES_cblock3', c_char * 16), - ('DES_cblock4', c_char * 16), - ('DES_cblock5', c_char * 16), - ('DES_cblock6', c_char * 16), - ('DES_cblock7', c_char * 16), - ('DES_cblock8', c_char * 16), - ('DES_cblock9', c_char * 16), - ('DES_cblock10', c_char * 16), - ('DES_cblock11', c_char * 16), - ('DES_cblock12', c_char * 16), - ('DES_cblock13', c_char * 16), - ('DES_cblock14', c_char * 16), - ('DES_cblock15', c_char * 16), - ('DES_cblock16', c_char * 16)] - - DES_KEY_SCHEDULE_p = POINTER(DES_KEY_SCHEDULE) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - DES_set_key = F(None, 'DES_set_key',[c_char_p, DES_KEY_SCHEDULE_p]) - DES_ecb_encrypt = F(None, 'DES_ecb_encrypt',[c_char_p, c_char_p, DES_KEY_SCHEDULE_p, c_int]) - - - class DES(object): - def __init__(self, key): - if len(key) != 8 : - raise Exception('DES improper key used') - return - self.key = key - self.keyschedule = DES_KEY_SCHEDULE() - DES_set_key(self.key, self.keyschedule) - def desdecrypt(self, data): - ob = create_string_buffer(len(data)) - DES_ecb_encrypt(data, ob, self.keyschedule, 0) - return ob.raw - def decrypt(self, data): - if not data: - return b'' - i = 0 - result = [] - while i < len(data): - block = data[i:i+8] - processed_block = self.desdecrypt(block) - result.append(processed_block) - i += 8 - return b''.join(result) - - return DES diff --git a/DeDRM_plugin/pycrypto_des.py b/DeDRM_plugin/pycrypto_des.py deleted file mode 100644 index 286df9ff..00000000 --- a/DeDRM_plugin/pycrypto_des.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - - -def load_pycrypto(): - try : - from Crypto.Cipher import DES as _DES - except: - return None - - class DES(object): - def __init__(self, key): - if len(key) != 8 : - raise ValueError('DES improper key used') - self.key = key - self._des = _DES.new(key,_DES.MODE_ECB) - def desdecrypt(self, data): - return self._des.decrypt(data) - def decrypt(self, data): - if not data: - return '' - i = 0 - result = [] - while i < len(data): - block = data[i:i+8] - processed_block = self.desdecrypt(block) - result.append(processed_block) - i += 8 - return ''.join(result) - return DES diff --git a/DeDRM_plugin/python_des.py b/DeDRM_plugin/python_des.py deleted file mode 100644 index bd029048..00000000 --- a/DeDRM_plugin/python_des.py +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env python -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab -import sys - -ECB = 0 -CBC = 1 -class Des(object): - __pc1 = [56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, - 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, - 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, - 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3] - __left_rotations = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1] - __pc2 = [13, 16, 10, 23, 0, 4,2, 27, 14, 5, 20, 9, - 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, - 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, - 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31] - __ip = [57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, - 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2, - 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6] - __expansion_table = [31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, - 7, 8, 9, 10, 11, 12,11, 12, 13, 14, 15, 16, - 15, 16, 17, 18, 19, 20,19, 20, 21, 22, 23, 24, - 23, 24, 25, 26, 27, 28,27, 28, 29, 30, 31, 0] - __sbox = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, - 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, - 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, - 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13], - [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, - 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, - 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, - 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9], - [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, - 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, - 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, - 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12], - [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, - 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, - 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, - 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14], - [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, - 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, - 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, - 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3], - [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, - 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, - 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, - 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13], - [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, - 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, - 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, - 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12], - [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, - 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, - 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, - 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11],] - __p = [15, 6, 19, 20, 28, 11,27, 16, 0, 14, 22, 25, - 4, 17, 30, 9, 1, 7,23,13, 31, 26, 2, 8,18, 12, 29, 5, 21, 10,3, 24] - __fp = [39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30, - 37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28, - 35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26, - 33, 1, 41, 9, 49, 17, 57, 25,32, 0, 40, 8, 48, 16, 56, 24] - # Type of crypting being done - ENCRYPT = 0x00 - DECRYPT = 0x01 - def __init__(self, key, mode=ECB, IV=None): - if len(key) != 8: - raise ValueError("Invalid DES key size. Key must be exactly 8 bytes long.") - self.block_size = 8 - self.key_size = 8 - self.__padding = '' - self.setMode(mode) - if IV: - self.setIV(IV) - self.L = [] - self.R = [] - self.Kn = [ [0] * 48 ] * 16 # 16 48-bit keys (K1 - K16) - self.final = [] - self.setKey(key) - def getKey(self): - return self.__key - def setKey(self, key): - self.__key = key - self.__create_sub_keys() - def getMode(self): - return self.__mode - def setMode(self, mode): - self.__mode = mode - def getIV(self): - return self.__iv - def setIV(self, IV): - if not IV or len(IV) != self.block_size: - raise ValueError("Invalid Initial Value (IV), must be a multiple of " + str(self.block_size) + " bytes") - self.__iv = IV - def getPadding(self): - return self.__padding - def __String_to_BitList(self, data): - l = len(data) * 8 - result = [0] * l - pos = 0 - for c in data: - i = 7 - ch = ord(c) - while i >= 0: - if ch & (1 << i) != 0: - result[pos] = 1 - else: - result[pos] = 0 - pos += 1 - i -= 1 - return result - def __BitList_to_String(self, data): - result = '' - pos = 0 - c = 0 - while pos < len(data): - c += data[pos] << (7 - (pos % 8)) - if (pos % 8) == 7: - result += chr(c) - c = 0 - pos += 1 - return result - def __permutate(self, table, block): - return [block[x] for x in table] - def __create_sub_keys(self): - key = self.__permutate(Des.__pc1, self.__String_to_BitList(self.getKey())) - i = 0 - self.L = key[:28] - self.R = key[28:] - while i < 16: - j = 0 - while j < Des.__left_rotations[i]: - self.L.append(self.L[0]) - del self.L[0] - self.R.append(self.R[0]) - del self.R[0] - j += 1 - self.Kn[i] = self.__permutate(Des.__pc2, self.L + self.R) - i += 1 - def __des_crypt(self, block, crypt_type): - block = self.__permutate(Des.__ip, block) - self.L = block[:32] - self.R = block[32:] - if crypt_type == Des.ENCRYPT: - iteration = 0 - iteration_adjustment = 1 - else: - iteration = 15 - iteration_adjustment = -1 - i = 0 - while i < 16: - tempR = self.R[:] - self.R = self.__permutate(Des.__expansion_table, self.R) - self.R = [x ^ y for x,y in zip(self.R, self.Kn[iteration])] - B = [self.R[:6], self.R[6:12], self.R[12:18], self.R[18:24], self.R[24:30], self.R[30:36], self.R[36:42], self.R[42:]] - j = 0 - Bn = [0] * 32 - pos = 0 - while j < 8: - m = (B[j][0] << 1) + B[j][5] - n = (B[j][1] << 3) + (B[j][2] << 2) + (B[j][3] << 1) + B[j][4] - v = Des.__sbox[j][(m << 4) + n] - Bn[pos] = (v & 8) >> 3 - Bn[pos + 1] = (v & 4) >> 2 - Bn[pos + 2] = (v & 2) >> 1 - Bn[pos + 3] = v & 1 - pos += 4 - j += 1 - self.R = self.__permutate(Des.__p, Bn) - self.R = [x ^ y for x, y in zip(self.R, self.L)] - self.L = tempR - i += 1 - iteration += iteration_adjustment - self.final = self.__permutate(Des.__fp, self.R + self.L) - return self.final - def crypt(self, data, crypt_type): - if not data: - return '' - if len(data) % self.block_size != 0: - if crypt_type == Des.DECRYPT: # Decryption must work on 8 byte blocks - raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n.") - if not self.getPadding(): - raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n. Try setting the optional padding character") - else: - data += (self.block_size - (len(data) % self.block_size)) * self.getPadding() - if self.getMode() == CBC: - if self.getIV(): - iv = self.__String_to_BitList(self.getIV()) - else: - raise ValueError("For CBC mode, you must supply the Initial Value (IV) for ciphering") - i = 0 - dict = {} - result = [] - while i < len(data): - block = self.__String_to_BitList(data[i:i+8]) - if self.getMode() == CBC: - if crypt_type == Des.ENCRYPT: - block = [x ^ y for x, y in zip(block, iv)] - processed_block = self.__des_crypt(block, crypt_type) - if crypt_type == Des.DECRYPT: - processed_block = [x ^ y for x, y in zip(processed_block, iv)] - iv = block - else: - iv = processed_block - else: - processed_block = self.__des_crypt(block, crypt_type) - result.append(self.__BitList_to_String(processed_block)) - i += 8 - if crypt_type == Des.DECRYPT and self.getPadding(): - s = result[-1] - while s[-1] == self.getPadding(): - s = s[:-1] - result[-1] = s - return ''.join(result) - def encrypt(self, data, pad=''): - self.__padding = pad - return self.crypt(data, Des.ENCRYPT) - def decrypt(self, data, pad=''): - self.__padding = pad - return self.crypt(data, Des.DECRYPT) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index e80e9aed..403db271 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -1,6 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# Version 10.0.1 February 2022 +# Remove OpenSSL support to only support PyCryptodome; clean up the code. +# # Version 10.0.0 November 2021 # Merge https://github.com/apprenticeharper/DeDRM_tools/pull/1691 to fix # key fetch issues on some machines. @@ -162,7 +165,7 @@ """Manage all Kobo books, either encrypted or DRM-free.""" from __future__ import print_function -__version__ = '4.0.0' +__version__ = '10.0.1' __about__ = "Obok v{0}\nCopyright © 2012-2020 Physisticated et al.".format(__version__) import sys @@ -180,6 +183,13 @@ import argparse import tempfile +try: + from Cryptodome.Cipher import AES + from Cryptodome.Util.Padding import unpad +except ImportError: + from Crypto.Cipher import AES + from Crypto.Util.Padding import unpad + can_parse_xml = True try: from xml.etree import ElementTree as ET @@ -194,88 +204,6 @@ class ENCRYPTIONError(Exception): pass -def _load_crypto_libcrypto(): - from ctypes import CDLL, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, cast - from ctypes.util import find_library - - if sys.platform.startswith('win'): - libcrypto = find_library('libeay32') - else: - libcrypto = find_library('crypto') - - if libcrypto is None: - raise ENCRYPTIONError('libcrypto not found') - libcrypto = CDLL(libcrypto) - - AES_MAXNR = 14 - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), - ('rounds', c_int)] - AES_KEY_p = POINTER(AES_KEY) - - def F(restype, name, argtypes): - func = getattr(libcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key', - [c_char_p, c_int, AES_KEY_p]) - AES_ecb_encrypt = F(None, 'AES_ecb_encrypt', - [c_char_p, c_char_p, AES_KEY_p, c_int]) - - class AES(object): - def __init__(self, userkey): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise ENCRYPTIONError(_('AES improper key used')) - return - key = self._key = AES_KEY() - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, key) - if rv < 0: - raise ENCRYPTIONError(_('Failed to initialize AES key')) - - def decrypt(self, data): - clear = b'' - for i in range(0, len(data), 16): - out = create_string_buffer(16) - rv = AES_ecb_encrypt(data[i:i+16], out, self._key, 0) - if rv == 0: - raise ENCRYPTIONError(_('AES decryption failed')) - clear += out.raw - return clear - - return AES - -def _load_crypto_pycrypto(): - from Crypto.Cipher import AES as _AES - class AES(object): - def __init__(self, key): - self._aes = _AES.new(key, _AES.MODE_ECB) - - def decrypt(self, data): - return self._aes.decrypt(data) - - return AES - -def _load_crypto(): - AES = None - cryptolist = (_load_crypto_pycrypto, _load_crypto_libcrypto) - for loader in cryptolist: - try: - AES = loader() - break - except (ImportError, ENCRYPTIONError): - pass - return AES - -AES = _load_crypto() - # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get # encoded using "replace" before writing them. @@ -630,11 +558,9 @@ def decrypt (self, userkey, contents): file page key. The caller must determine if the decrypted data is correct.""" # The userkey decrypts the page key (self.key) - keyenc = AES(userkey) - decryptedkey = keyenc.decrypt(self.key) - # The decrypted page key decrypts the content - pageenc = AES(decryptedkey) - return self.__removeaespadding(pageenc.decrypt(contents)) + decryptedkey = AES.new(userkey, AES.MODE_ECB).decrypt(self.key) + # The decrypted page key decrypts the content. Padding is PKCS#7 + return unpad(AES.new(decryptedkey, AES.MODE_ECB).decrypt(contents), 16) def check (self, contents): """ @@ -704,23 +630,6 @@ def check (self, contents): raise ValueError() return False - def __removeaespadding (self, contents): - """ - Remove the trailing padding, using what appears to be the CMS - algorithm from RFC 5652 6.3""" - lastchar = binascii.b2a_hex(contents[-1:]) - strlen = int(lastchar, 16) - padding = strlen - if strlen == 1: - return contents[:-1] - if strlen < 16: - for i in range(strlen): - testchar = binascii.b2a_hex(contents[-strlen:-(strlen-1)]) - if testchar != lastchar: - padding = 0 - if padding > 0: - contents = contents[:-padding] - return contents def decrypt_book(book, lib): print("Converting {0}".format(book.title)) From c5aebcca016f96520dc941651a49992472a4f0e4 Mon Sep 17 00:00:00 2001 From: a980e066a01 <100724039+a980e066a01@users.noreply.github.com> Date: Tue, 22 Feb 2022 23:47:51 +0000 Subject: [PATCH 069/154] Add support for "hardened" Adobe DRM What took the most time was not reverse-engineering the scheme, but actually finding books using it... Closes #20, #25, #45 --- DeDRM_plugin/epubtest.py | 8 +++----- DeDRM_plugin/ineptepub.py | 41 ++++++++++++++++++++++++++++----------- DeDRM_plugin/ineptpdf.py | 36 ++++++++++++++++++++++++---------- DeDRM_plugin_ReadMe.txt | 6 +++--- FAQs.md | 6 ------ README.md | 4 ++-- ReadMe_Overview.txt | 4 ++-- 7 files changed, 66 insertions(+), 39 deletions(-) diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index 11f8b4b4..79657a58 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -175,7 +175,7 @@ def getfiledata(file, zi): return data def encryption(infile): - # Supports Adobe (old & new), B&N, Kobo, Apple, Readium LCP. + # Supports Adobe (old & new), B&N, Kobo, Apple, Readium LCP. encryption = "Error" try: with open(infile,'rb') as infileobject: @@ -206,10 +206,8 @@ def encryption(infile): adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = './/%s' % (adept('encryptedKey'),) bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) == 172: - encryption = "Adobe (old)" - if len(bookkey) == 192: - encryption = "Adobe (new)" + if len(bookkey) >= 172: + encryption = "Adobe" elif len(bookkey) == 64: encryption = "B&N" else: diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 5fc6d4b0..aa7b5714 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -32,13 +32,14 @@ # 7.0 - Add Python 3 compatibility for calibre 5.0 # 7.1 - Add ignoble support, dropping the dedicated ignobleepub.py script # 7.2 - Only support PyCryptodome; clean up the code +# 8.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10) """ Decrypt Adobe Digital Editions encrypted ePub books. """ __license__ = 'GPL v3' -__version__ = "7.2" +__version__ = "8.0" import sys import os @@ -49,6 +50,8 @@ from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED from contextlib import closing from lxml import etree +from uuid import UUID +import hashlib try: from Cryptodome.Cipher import AES, PKCS1_v1_5 @@ -247,6 +250,23 @@ def adeptGetUserUUID(inpath): except: return None +def removeHardening(rights, keytype, keydata): + adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) + textGetter = lambda name: ''.join(rights.findtext('.//%s' % (adept(name),))) + + # Gather what we need, and generate the IV + resourceuuid = UUID(textGetter("resource")) + deviceuuid = UUID(textGetter("device")) + fullfillmentuuid = UUID(textGetter("fulfillment")[:36]) + kekiv = UUID(int=resourceuuid.int ^ deviceuuid.int ^ fullfillmentuuid.int).bytes + + # Derive kek from just "keytype" + rem = int(keytype, 10) % 16 + H = hashlib.sha256(keytype.encode("ascii")).digest() + kek = H[2*rem : 16 + rem] + H[rem : 2*rem] + + return unpad(AES.new(kek, AES.MODE_CBC, kekiv).decrypt(keydata), 16) # PKCS#7 + def decryptBook(userkey, inpath, outpath): with closing(ZipFile(open(inpath, 'rb'))) as inf: namelist = inf.namelist() @@ -260,15 +280,12 @@ def decryptBook(userkey, inpath, outpath): rights = etree.fromstring(inf.read('META-INF/rights.xml')) adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag) expr = './/%s' % (adept('encryptedKey'),) - bookkey = ''.join(rights.findtext(expr)) - if len(bookkey) == 192: - print("{0:s} seems to be an Adobe ADEPT ePub with Adobe's new DRM".format(os.path.basename(inpath))) - print("This DRM cannot be removed yet. ") - print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") - print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") - raise ADEPTNewVersionError("Book uses new ADEPT encryption") - - if len(bookkey) == 172: + bookkeyelem = rights.find(expr) + bookkey = bookkeyelem.text + keytype = bookkeyelem.attrib.get('keyType', '0') + if len(bookkey) >= 172 and int(keytype, 10) > 2: + print("{0:s} is a secure Adobe Adept ePub with hardening.".format(os.path.basename(inpath))) + elif len(bookkey) == 172: print("{0:s} is a secure Adobe Adept ePub.".format(os.path.basename(inpath))) elif len(bookkey) == 64: print("{0:s} is a secure Adobe PassHash (B&N) ePub.".format(os.path.basename(inpath))) @@ -277,9 +294,11 @@ def decryptBook(userkey, inpath, outpath): return 1 if len(bookkey) != 64: - # Normal Adobe ADEPT + # Normal or "hardened" Adobe ADEPT rsakey = RSA.import_key(userkey) # parses the ASN1 structure bookkey = base64.b64decode(bookkey) + if int(keytype, 10) > 2: + bookkey = removeHardening(rights, keytype, bookkey) try: bookkey = PKCS1_v1_5.new(rsakey).decrypt(bookkey, None) # automatically unpads except ValueError: diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 2364c12a..22cd1489 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -49,13 +49,14 @@ # 9.0.0 - Add Python 3 compatibility for calibre 5 # 9.1.0 - Support for decrypting with owner password, support for V=5, R=5 and R=6 PDF files, support for AES256-encrypted PDFs. # 9.1.1 - Only support PyCryptodome; clean up the code +# 10.0.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10) """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "9.1.1" +__version__ = "10.0.0" import codecs import hashlib @@ -69,6 +70,7 @@ import itertools import xml.etree.ElementTree as etree import traceback +from uuid import UUID try: from Cryptodome.Cipher import AES, ARC4, PKCS1_v1_5 @@ -1633,6 +1635,24 @@ def initialize_ebx_ignoble(self, keyb64, docid, param): self.ready = True return + @staticmethod + def removeHardening(rights, keytype, keydata): + adept = lambda tag: '{%s}%s' % ('http://ns.adobe.com/adept', tag) + textGetter = lambda name: ''.join(rights.findtext('.//%s' % (adept(name),))) + + # Gather what we need, and generate the IV + resourceuuid = UUID(textGetter("resource")) + deviceuuid = UUID(textGetter("device")) + fullfillmentuuid = UUID(textGetter("fulfillment")[:36]) + kekiv = UUID(int=resourceuuid.int ^ deviceuuid.int ^ fullfillmentuuid.int).bytes + + # Derive kek from just "keytype" + rem = int(keytype, 10) % 16 + H = SHA256(keytype.encode("ascii")) + kek = H[2*rem : 16 + rem] + H[rem : 2*rem] + + return unpad(AES.new(kek, AES.MODE_CBC, kekiv).decrypt(keydata), 16) + def initialize_ebx_inept(self, password, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True rsakey = RSA.import_key(password) # parses the ASN1 structure @@ -1641,16 +1661,12 @@ def initialize_ebx_inept(self, password, docid, param): rights = zlib.decompress(rights, -15) rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}encryptedKey' - bookkey = ''.join(rights.findtext(expr)) - - if len(bookkey) == 192: - print("This seems to be an Adobe ADEPT PDF with Adobe's new DRM") - print("This DRM cannot be removed yet. ") - print("Try getting your distributor to give you a new ACSM file, then open that in an old version of ADE (2.0).") - print("If your book distributor is not enforcing the new DRM yet, this will give you a copy with the old DRM.") - raise ADEPTNewVersionError("Book uses new ADEPT encryption") + bookkeyelem = rights.find(expr) + bookkey = codecs.decode(bookkeyelem.text.encode('utf-8'),'base64') + keytype = bookkeyelem.attrib.get('keyType', '0') - bookkey = codecs.decode(bookkey.encode('utf-8'),'base64') + if int(keytype, 10) > 2: + bookkey = PDFDocument.removeHardening(rights, keytype, bookkey) try: bookkey = PKCS1_v1_5.new(rsakey).decrypt(bookkey, None) # automatically unpads except ValueError: diff --git a/DeDRM_plugin_ReadMe.txt b/DeDRM_plugin_ReadMe.txt index 36e3bd71..91e1d28f 100644 --- a/DeDRM_plugin_ReadMe.txt +++ b/DeDRM_plugin_ReadMe.txt @@ -4,8 +4,8 @@ DeDRM_plugin.zip This plugin will remove the DRM from: - Kindle ebooks (files from Kindle for Mac/PC and eInk Kindles). - - Adobe Digital Editions (v2.0.1***) ePubs (including Kobo and Google ePubs downloaded to ADE) - - Adobe Digital Editions (v2.0.1) PDFs + - Adobe Digital Editions ePubs (including Kobo and Google ePubs downloaded to ADE) + - Adobe Digital Editions PDFs For limitations and work-arounds, see the FAQ at https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md (or the FAQ in Apprentice Harper's original repository at https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md) @@ -33,4 +33,4 @@ If you find that the DeDRM plugin is not working for you (imported ebooks still A log will appear that you can copy and paste into a GitHub issue report at https://github.com/noDRM/DeDRM_tools/issues. Please also include information about the eBook file. -If you're using Apprentice Harper's original version, you can also comment at Apprentice Alf's blog, http://apprenticealf.wordpress.com/ or open an issue at Apprentice Harper's repository, https://github.com/apprenticeharper/DeDRM_tools/issues. \ No newline at end of file +If you're using Apprentice Harper's original version, you can also comment at Apprentice Alf's blog, http://apprenticealf.wordpress.com/ or open an issue at Apprentice Harper's repository, https://github.com/apprenticeharper/DeDRM_tools/issues. diff --git a/FAQs.md b/FAQs.md index 468addb0..d9d7ba31 100644 --- a/FAQs.md +++ b/FAQs.md @@ -14,9 +14,6 @@ Just download and use these tools, that's all! Uh, almost. There are a few, uh, * The tools don't work on all ebooks. For example, they don't work on any ebooks from Apple's iBooks store. * You must own the ebook - the tools won't work on library ebooks or rented ebooks or books from a friend. * You must not use these tools to give your ebooks to a hundred of your closest friends. Or to a million strangers. Authors need to sell books to be able to write more books. Don't be mean to the authors. -* Do NOT use Adobe Digital Editions 3.0 or later to download your ePubs. ADE 3.0 and later might use a new encryption scheme that the tools can't handle. While major ebook stores aren't using the new scheme yet, using ADE 2.0.1 will ensure that your ebooks are downloaded using the old scheme. Once a book has been downloaded with the new scheme, it's IMPOSSIBLE to re-download using the old scheme (without buying it again). - -But otherwise, if your ebook is from Amazon, Kobo, Barnes & Noble or any of the ebook stores selling ebooks compatible with Adobe Digital Editions 2.0.1, you should be able to remove the DRM that's been applied to your ebooks. ### Recent Changes to Kindle for PC/Kindle for Mac Starting with version 1.19, Kindle for PC/Mac uses Amazon's new KFX format which isn't quite as good a source for conversion to ePub as the older KF8 (& MOBI) formats. There are two options to get the older formats. Either stick with version 1.17 or earlier, or modify the executable by changing a file name (PC) or disabling a component of the application (Mac). @@ -144,9 +141,6 @@ You have found a Print Replica Kindle ebook. This is a PDF in a Kindle wrapper. ## Do the tools work on books from Kobo? If you use the Kobo desktop application for Mac or PC, install the Obok plugin. This will import and remove the DRM from your Kobo books, and is the easiest method for Kobo ebooks. -## I registered Adobe Digital Editions 3.0 or later with an Adobe ID before downloading, but my epub or PDF still has DRM. -Adobe introduced a new DRM scheme with ADE 3.0 and later. Install ADE 2.0.1 and register with the same Adobe ID. If you can't open your book in ADE 2.01, then you have a book with the new DRM scheme. These tools can't help. You can avoid the new DRM scheme by always downloading your ebooks with ADE 2.0.1. Some retailers will require ADE 3.0 or later, in which case you won't be able to download with ADE 2.0.1. - ## I cannot solve my problem with the DeDRM plugin, and now I need to ‘post a log’. How do I do that? Remove the DRMed book from calibre. Click the Preferences drop-down menu and choose 'Restart in debug mode'. Once calibre has re-started, import the problem ebook. Now close calibre. A log will appear that you can copy and paste into a comment at Apprentice Alf's blog, or into a new issue at Apprentice Harper's github repository. diff --git a/README.md b/README.md index d93487ea..51efe66c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The v10.0.0 versions of this plugin should both work with Calibre 5.x (Python 3) This is a repository that tracks all the scripts and other tools for removing DRM from ebooks that I could find, committed in date order as best as I could manage. (Except for the Requiem tools for Apple's iBooks, and Convert LIT for Microsoft's .lit ebooks.) This includes the tools from a time before Apprentice Alf had a blog, and continues through to when Apprentice Harper (with help) took over maintenance of the tools. The individual scripts are now released as two plugins for calibre: DeDRM and Obok. -The DeDRM plugin handles books that use Amazon DRM, Adobe Digital Editions DRM (version 1), Barnes & Noble DRM, and some historical formats. +The DeDRM plugin handles books that use Amazon DRM, Adobe Digital Editions DRM, Barnes & Noble DRM, and some historical formats. The Obok plugin handles Kobo DRM. Users with calibre 5.x or later should use release 7.2.0 or later of the tools. @@ -24,7 +24,7 @@ Note that Amazon changes the DRM for KFX files frequently. What works for KFX to I welcome contributions from others to improve these tools, from expanding the range of books handled, improving key retrieval, to just general bug fixes, speed improvements and UI enhancements. -I urge people to read the FAQs. But to cover the most common: Use ADE 2.0.1 to be sure not to get the new DRM scheme that these tools can't handle. Do remember to unzip the downloaded archive to get the plugin (beta versions may be just the plugin don't unzip that). You can't load the whole tools archive into calibre. +I urge people to read the FAQs. But to cover the most common: Do remember to unzip the downloaded archive to get the plugin (beta versions may be just the plugin don't unzip that). You can't load the whole tools archive into calibre. My special thanks to all those developers who have done the hard work of reverse engineering to provide the initial tools. diff --git a/ReadMe_Overview.txt b/ReadMe_Overview.txt index 3b1e4cf2..75faf229 100644 --- a/ReadMe_Overview.txt +++ b/ReadMe_Overview.txt @@ -6,8 +6,8 @@ This file is to give users a quick overview of what is available and how to get This archive includes calibre plugins to remove DRM from: - Kindle ebooks (files from Kindle for Mac/PC and eInk Kindles). - - Adobe Digital Editions (v2.0.1***) ePubs (including Kobo and Google ePubs downloaded to ADE) - - Adobe Digital Editions (v2.0.1) PDFs + - Adobe Digital Editions ePubs (including Kobo and Google ePubs downloaded to ADE) + - Adobe Digital Editions PDFs - Kobo kePubs from the Kobo Desktop application and attached Kobo readers. These tools do NOT work with Apple's iBooks FairPlay DRM. Use iBook Copy from TunesKit. From 1f13ae0f78cbc98b4b004014476590179c979847 Mon Sep 17 00:00:00 2001 From: Brose Johnstone Date: Sat, 29 Jan 2022 22:23:23 -0800 Subject: [PATCH 070/154] Obok: Fix invalid UTF-8 causing UI to not open For some reason, the title of a book on my device causes Obok to choke. Apparently it's not valid UTF-8. This fixes that by ignoring decode errors. --- Obok_plugin/obok/obok.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index 403db271..e95e8d16 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -352,6 +352,7 @@ def __init__ (self, serials = [], device_path = None, desktopkobodir = u""): olddb.close() self.newdb.close() self.__sqlite = sqlite3.connect(self.newdb.name) + self.__sqlite.text_factory = lambda b: b.decode("utf-8", errors="ignore") self.__cursor = self.__sqlite.cursor() self._userkeys = [] self._books = [] From 93ff0aac20aea245217c636e157cd6325841d18b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 18 Mar 2022 17:09:51 +0100 Subject: [PATCH 071/154] Update FAQs Co-authored-by: ZolaLa <49111160+ZolaLa9@users.noreply.github.com> --- CHANGELOG.md | 3 +++ FAQs.md | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2adb8d37..8d746c17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,3 +58,6 @@ List of changes since the fork of Apprentice Harper's repository: - Fix a bug where extracting an Adobe key from ADE on Linux through Wine did fail when using the OpenSSL backend (instead of PyCrypto). See #13 and #14 for details, thanks acaloiaro for the bugfix. - Make the plugin work on Calibre 6 (Qt 6). If you're running the Calibre 6 beta and you notice any issues, please open a bug report. - Fix IndexError when DeDRMing some Amazon eBooks. +- Add support for books with the new ADE3.0+ DRM by merging #48 by a980e066a01. Thanks a lot! +- Remove OpenSSL support, now the plugin will always use the Python crypto libraries. +- Obok: Fix issues with invalid UTF-8 characters by merging #26 by baby-bell. diff --git a/FAQs.md b/FAQs.md index d9d7ba31..31071f35 100644 --- a/FAQs.md +++ b/FAQs.md @@ -9,7 +9,7 @@ DRM ("Digital Rights Management") is a way of using encryption to tie the books When your ebooks have DRM you are unable to convert the ebook from one format to another (e.g. Kindle KF8 to Kobo ePub), so you are restricted in the range of ebook stores you can use. DRM also allows publishers to restrict what you can do with the ebook you've bought, e.g. preventing the use of text-to-speech software. Longer term, you can never be sure that you'll be able to come back and re-read your ebooks if they have DRM, even if you save back-up copies. ## So how can I remove DRM from my ebooks? -Just download and use these tools, that's all! Uh, almost. There are a few, uh, provisos, a, a couple of quid pro quos. +Just download and use these tools, that's all! Uh, almost. There are a few, uh, provisos, a couple of quid pro quos. * The tools don't work on all ebooks. For example, they don't work on any ebooks from Apple's iBooks store. * You must own the ebook - the tools won't work on library ebooks or rented ebooks or books from a friend. @@ -31,7 +31,7 @@ Verify the one of the following cryptographic hash values, using software of you * SHA-1: 7AB9A86B954CB23D622BD79E3257F8E2182D791C * SHA-256: 28DC21246A9C7CDEDD2D6F0F4082E6BF7EF9DB9CE9D485548E8A9E1D19EAE2AC -You will need to go to the preferences and uncheck the auto update checkbox. Then download and install 1.17 over the top of the newer installation. You'll also need to delete the KFX folders from your My Kindle Content folder. You may also need to take further action to prevent an auto update. The simplest wayis to find the 'updates' folder and replace it with a file. See [this thread] (http://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead for a Script to do this on a PC. On a Mac you can find the folder at ~/Library/Application Support/Kindle/ just delete the folder 'updates' and save a blank text file called 'updates' in its place. +You will need to go to the preferences and uncheck the auto update checkbox. Then download and install 1.17 over the top of the newer installation. You'll also need to delete the KFX folders from your My Kindle Content folder. You may also need to take further action to prevent an auto update. The simplest wayis to find the 'updates' folder and replace it with a file. See [this thread] (http://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead for a Script to do this on a PC. On a Mac you can find the folder at ~/Library/Application Support/Kindle/. Make the 'updates' folder read-only, or delete it and save a blank text file called 'updates' in its place. Another possible solution is to use 1.19 or later, but disable KFX by renaming or disabling a necessary component of the application. This may or may not work on versions after 1.25. In a command window, enter the following commands when Kindle for PC/Mac is not running: @@ -43,9 +43,9 @@ PC Note: The renderer-test program may be in a different location in some Kindle #### Macintosh `chmod -x /Applications/Kindle.app/Contents/MacOS/renderer-test` -Mac Note: If the chmod command fails with a permission error try again using `sudo` before `chmod` - `sudo chmod` [...] +Mac Note: If the chmod command fails with a permission error try again using `sudo` before `chmod` - `sudo chmod` [...]. This only works on Kindle for Mac 1.19 thru 1.31, it does NOT work with 1.32 or newer. -After restarting the Kindle program any books previously downloaded in KFX format will no longer open. You will need to remove them from your device and re-download them. All future downloads will use the older Kindle formats instead of KFX although they will continue to be placed in one individual subdirectory per book. Note that books soudl be downoad by right-click and 'Download', not by just opening the book. Recent (1.25+) versions of Kindle for Mac/PC may convert KF8 files to a new format that is not supported by these tools when the book is opened for reading. +After restarting the Kindle program any books previously downloaded in KFX format will no longer open. You will need to remove them from your device and re-download them. All future downloads will use the older Kindle formats instead of KFX although they will continue to be placed in one individual subdirectory per book. Note that books should be downloaded by right-click and 'Download', not by just opening the book. Recent (1.25+) versions of Kindle for Mac/PC may convert KF8 files to a new format that is not supported by these tools when the book is opened for reading. #### Decrypting KFX Thanks to work by several people, the tools can now decrypt KFX format ebooks from Kindle for Mac/PC. In addition to the DeDRM plugin, calibre users will also need to install jhowell's KFX Input plugin which is available through the standard plugin menu in calibre, or directly from [his plugin thread](https://www.mobileread.com/forums/showthread.php?t=291290) on Mobileread. @@ -56,18 +56,18 @@ It's quite possible that Amazon will update their KFX DeDRM to prevent DRM remov Thanks to jhowell for his investigations into KFX format and the KFX Input plugin. Some of these instructions are from [his thread on the subject](https://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead. ## Where can I get the latest version of these free DRM removal tools? -Right here at github. Just go to the [releases page](https://github.com/noDRM/DeDRM_tools/releases) and download the latest zip archive of the tools, named `DeDRM\_tools\_X.X.X.zip`, where X.X.X is the version number. You do not need to download the source code archive. This will get you the forked version by noDRM. If you want to download the original version by Apprentice Harper, go to [this page](https://github.com/noDRM/DeDRM_tools/releases) instead. +Right here at github. Just go to the [releases page](https://github.com/noDRM/DeDRM_tools/releases) and download the latest zip archive of the tools, named `DeDRM\_tools\_X.X.X.zip`, where X.X.X is the version number. You do not need to download the source code archive. This will get you the forked version by noDRM. If you want to download the original version by Apprentice Harper, go to [this page](https://github.com/apprenticeharper/DeDRM_tools/releases) instead. ## I've downloaded the tools archive. Now what? -First, unzip the archive. You should now have a DeDRM folder containing several other folders and a `ReadMe_Overview.txt` file. Please read the `ReadMe_Overview.txt` file! That will explain what the folders are, and you'll be able to work out which of the tools you need. +First, unzip the archive. You should now have a DeDRM folder containing several files, including a `ReadMe_Overview.txt` file. Please read the `ReadMe_Overview.txt` file! That will explain what the files are, and you'll be able to work out which of the tools you need. ## That's a big complicated ReadMe file! Isn't there a quick guide? Install calibre. Install the DeDRM\_plugin in calibre. Install the Obok\_plugin in calibre. Restart calibre. In the DeDRM_plugin customisation dialog add in any E-Ink Kindle serial numbers. Remember that the plugin only tries to remove DRM when ebooks are imported. # Installing the Tools ## The calibre plugin -### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in u’[path]DeDRM\_tools\_6.8.0.zip’ is invalid. It does not contain a top-level \_\_init\_\_.py file" -You are trying to add the tools archive (e.g. `DeDRM_tools_6.8.0.zip`) instead of the plugin. The tools archive is not the plugin. It is a collection of DRM removal tools which includes the plugin. You must unzip the archive, and install the calibre plugin `DeDRM_plugin.zip` from a folder called `DeDRM_calibre_plugin` in the unzipped archive. +### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in '[path]DeDRM\_tools\_X.X.X.zip' is invalid. It does not contain a top-level \_\_init\_\_.py file" +You are trying to add the tools archive (e.g. `DeDRM_tools_10.0.2.zip`) instead of the plugin. The tools archive is not the plugin. It is a collection of DRM removal tools which includes the plugin. You must unzip the archive, and install the calibre plugin `DeDRM_plugin.zip` from inside the unzipped archive. ### I’ve unzipped the tools archive, but I can’t find the calibre plugin when I try to add them to calibre. I use Windows. You should select the zip file that is in the `DeDRM_calibre_plugin` folder, not any files inside the plugin’s zip archive. Make sure you are selecting from the folder that you created when you unzipped the tools archive and not selecting a file inside the still-zipped tools archive. @@ -130,7 +130,7 @@ If the book is from Kindle for PC or Kindle for Mac and you think you are doing There are several possible reasons why only some books get their DRM removed. * You still don’t have the DRM removal tools working correctly, but some of your books didn’t have DRM in the first place. -If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books. If you're using NoDRM's fork, open [a new issue](https://github.com/noDRM/DeDRM_tools/issues) in the GitHub repo. If you're using Apprentice Harpers version, post that logfile as a comment at Apprentice Alf's blog or in a new issue at [Apprentice Harper's github repository](https://github.com/apprenticeharper/DeDRM_tools/issues). +If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books. If you're using NoDRM's fork, open [a new issue](https://github.com/noDRM/DeDRM_tools/issues) in the GitHub repo. If you're using Apprentice Harper's version, post that logfile in a new issue at [Apprentice Harper's github repository](https://github.com/apprenticeharper/DeDRM_tools/issues). ## My Kindle book has imported and the DRM has been removed, but all the pictures are gone. Most likely, this is a book downloaded from Amazon directly to an eInk Kindle (e.g. Paperwhite). Unfortunately, the pictures are probably in a `.azw6` file that the tools don't understand. You must download the book manually from Amazon's web site "For transfer via USB" to your Kindle. When you download the eBook in this manner, Amazon will package the pictures in the with text in a single file that the tools will be able to import successfully. @@ -142,7 +142,7 @@ You have found a Print Replica Kindle ebook. This is a PDF in a Kindle wrapper. If you use the Kobo desktop application for Mac or PC, install the Obok plugin. This will import and remove the DRM from your Kobo books, and is the easiest method for Kobo ebooks. ## I cannot solve my problem with the DeDRM plugin, and now I need to ‘post a log’. How do I do that? -Remove the DRMed book from calibre. Click the Preferences drop-down menu and choose 'Restart in debug mode'. Once calibre has re-started, import the problem ebook. Now close calibre. A log will appear that you can copy and paste into a comment at Apprentice Alf's blog, or into a new issue at Apprentice Harper's github repository. +Remove the DRMed book from calibre. Click the Preferences drop-down menu and choose 'Restart in debug mode'. Once calibre has re-started, import the problem ebook. Now close calibre. A log will appear that you can copy and paste into [a new issue](https://github.com/noDRM/DeDRM_tools/issues) in NoDRM’s GitHub repo. If you're using Apprentice Harper’s version, post that logfile in a new issue at [Apprentice Harper's GitHub repository](https://github.com/apprenticeharper/DeDRM_tools/issues). ## Is there a way to use the DeDRM plugin for Calibre from the command line? See the [Calibre command line interface (CLI) instructions](CALIBRE_CLI_INSTRUCTIONS.md). @@ -188,11 +188,12 @@ Support for LCP DRM removal was included in the past, but Readium (the company w ## I’ve got the tools archive and I’ve read all the FAQs but I still can’t install the tools and/or the DRM removal doesn’t work * Read the `ReadMe_Overview.txt` file in the top level of the tools archive * Read the ReadMe file for the tool you want to use. -* If you still can’t remove the DRM, create a new [GitHub issue](https://github.com/noDRM/DeDRM_tools/issues). If you are using Apprentice Harper's original version and not this fork, you can also ask in the comments section of Apprentice Alf's blog or create a new issue at Apprentice Harper's github repository. If you do report an issue in any of the GitHub repositories, please report the error as precisely as you can. Include what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this). +* If you still can’t remove the DRM, create a new [GitHub issue](https://github.com/noDRM/DeDRM_tools/issues). If you are using Apprentice Harper's original version and not this fork, you can also create a new issue at Apprentice Harper's github repository. If you do report an issue in any of the GitHub repositories, please report the error as precisely as you can. Include what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this). ## Who wrote these scripts? The authors tend to identify themselves only by pseudonyms: * The Adobe Adept and Barnes & Noble scripts were created by i♥cabbages +* The Adobe Adept support for ADE3.0+ DRM was added by a980e066a01 * ~The Readium LCP support for this plugin was created by NoDRM~ (removed due to a DMCA takedown, see [#18](https://github.com/noDRM/DeDRM_tools/issues/18) ) * The Amazon Mobipocket and eReader scripts were created by The Dark Reverser * The Amazon K4PC DRM/format was further decoded by Bart Simpson aka Skindle From 227bda1ea670d601ce6c115f3eced699bfd4d5bd Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 18 Mar 2022 17:26:17 +0100 Subject: [PATCH 072/154] Try to fix V3 PDF files --- CHANGELOG.md | 1 + DeDRM_plugin/ineptpdf.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d746c17..92d66707 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,3 +61,4 @@ List of changes since the fork of Apprentice Harper's repository: - Add support for books with the new ADE3.0+ DRM by merging #48 by a980e066a01. Thanks a lot! - Remove OpenSSL support, now the plugin will always use the Python crypto libraries. - Obok: Fix issues with invalid UTF-8 characters by merging #26 by baby-bell. +- Try to fix PDF files with V3 key obfuscation algorithm. diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 22cd1489..4319997a 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1720,7 +1720,7 @@ def genkey_v3(self, objid, genno): objid = struct.pack(' Date: Fri, 18 Mar 2022 17:36:55 +0100 Subject: [PATCH 073/154] Debugging for __version issue --- DeDRM_plugin/__init__.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 83b4b7ac..9f0fc34f 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -94,7 +94,17 @@ #@@CALIBRE_COMPAT_CODE@@ -import __version +try: + import __version +except ModuleNotFoundError: + print("#############################") + print("__version not found, path is:") + print(sys.path) + print("I'm at:") + print(__file__) + print("#############################") + raise + class DeDRMError(Exception): pass From a4689f6ac0af8494c622c8bee3f8866ec028755f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 18 Mar 2022 17:45:07 +0100 Subject: [PATCH 074/154] Make B&N plugin skip invalid hashes in Windows app --- DeDRM_plugin/ignoblekeyWindowsStore.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/DeDRM_plugin/ignoblekeyWindowsStore.py b/DeDRM_plugin/ignoblekeyWindowsStore.py index f22d64db..886c7cd4 100644 --- a/DeDRM_plugin/ignoblekeyWindowsStore.py +++ b/DeDRM_plugin/ignoblekeyWindowsStore.py @@ -13,6 +13,7 @@ import sys, os import apsw import base64 +import traceback try: from Cryptodome.Cipher import AES from Cryptodome.Util.Padding import unpad @@ -56,11 +57,14 @@ def dump_keys(print_result=False): decrypted_hashes = [] for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): - encrypted_cc_hash = base64.b64decode(pass_hash.text) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) - decrypted_hashes.append((base64.b64encode(cc_hash).decode("ascii"))) - if print_result: - print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + try: + encrypted_cc_hash = base64.b64decode(pass_hash.text) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) + decrypted_hashes.append((base64.b64encode(cc_hash).decode("ascii"))) + if print_result: + print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + except: + traceback.print_exc() return decrypted_hashes From 263cc1d2cffd46ac9e822c944a493f16f463db44 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 09:17:29 +0100 Subject: [PATCH 075/154] Improve error message --- DeDRM_plugin/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 9f0fc34f..7559b99c 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -98,6 +98,12 @@ import __version except ModuleNotFoundError: print("#############################") + print("Failed to load the DeDRM plugin") + print("Did you bundle this from source code yourself? If so, you'll need to run make_release.py instead to generate a valid plugin file.") + print("If you have no idea what the above means, please redownload the most recent version of the plugin from the Github Releases page.") + print("If you still receive this error with the released version, please open a bug report and attach the following information:") + print("#############################") + print("Debug information:") print("__version not found, path is:") print(sys.path) print("I'm at:") From cf095a4171efd3414124965d577777471f0baaf4 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 09:26:39 +0100 Subject: [PATCH 076/154] Update plugin readme --- ReadMe_Overview.txt | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/ReadMe_Overview.txt b/ReadMe_Overview.txt index 75faf229..82cd5471 100644 --- a/ReadMe_Overview.txt +++ b/ReadMe_Overview.txt @@ -1,7 +1,7 @@ Welcome to the tools! ===================== -This file is to give users a quick overview of what is available and how to get started. This document is part of the DeDRM Tools archive from Apprentice Harper's github repository: https://github.com/apprenticeharper/DeDRM_tools/ +This file is to give users a quick overview of what is available and how to get started. This document is part of the DeDRM Tools archive from noDRM's github repository: https://github.com/noDRM/DeDRM_tools/ This archive includes calibre plugins to remove DRM from: @@ -12,21 +12,22 @@ This archive includes calibre plugins to remove DRM from: These tools do NOT work with Apple's iBooks FairPlay DRM. Use iBook Copy from TunesKit. These tools no longer work well with books from Barnes & Noble. +Due to a DMCA request, these tools no longer work with LCP-encrypted books - see https://github.com/noDRM/DeDRM_tools/issues/18 for details. -For limitations and work-arounds, see the FAQ at https://github.com/apprenticeharper/DeDRM_tools/blob/master/FAQs.md +For limitations and work-arounds, see the FAQ at https://github.com/noDRM/DeDRM_tools/blob/master/FAQs.md About the tools --------------- -These tools are updated and maintained by Apprentice Harper and many others. You can find the latest updates at Apprentice Harper's github repository https://github.com/apprenticeharper/DeDRM_tools/ and get support by creating an issue at the repository (github account required) or by posting a comment at Apprentice Alf's blog: http://www.apprenticealf.wordpress.com/ +These tools are updated and maintained by noDRM and many others. They are based on Apprentice Harper's Calibre plugin. You can find the latest updates at noDRM's github repository https://github.com/noDRM/DeDRM_tools/ and get support by creating an issue at the repository (github account required). -If you re-post these tools, a link to the repository and/or the blog would be appreciated. +If you re-post these tools, a link to the repository would be appreciated. The tools are provided in the form of plugins for calibre. Calibre is an open source freeware ebook library manager. It is the best tool around for keeping track of your ebooks. -DeDRM plugin for calibre (Mac OS X, Windows) +DeDRM plugin for calibre (Linux, Mac OS X and Windows) ------------------------------------------------------- -calibe 5.x and later are now written in Python 3, and plugins must also use Python 3. If you have calibre 5, you must use version 7.x or later of the plugins. For calibre 4.x and earlier, use version 6.8.x of the plugins. +calibe 5.x and later are now written in Python 3, and plugins must also use Python 3. The DeDRM plugin for calibre removes DRM from your Kindle and Adobe DRM ebooks when they are imported to calibre. Just install the DeDRM plugin (DeDRM_plugin.zip), following the instructions and configuration directions provided in the ReadMe file and the help links in the plugin's configuration dialogs. @@ -40,18 +41,6 @@ To import ebooks from the Kobo Desktop app or from a Kobo ebook reader, install For instructions, see the obok_plugin_ReadMe.txt file. -DeDRM application for Mac OS X users: (Mac OS X 10.6 and above) ---------------------------------------------------------------- -DeDRM application for Windows users: (Windows XP through Windows 10) ------------------------------------------------------------------- -As of Version 6.7 of the tools, these are no longer provided or supported. - - -Linux support -------------- -It may be possible to use the plugins on a Linux system, but no support is given at this time. - - Credits ------- The original inept and ignoble scripts were by i♥cabbages @@ -61,7 +50,8 @@ The original topaz DRM removal script was by CMBDTC The original topaz format conversion scripts were by some_updates, clarknova and Bart Simpson The original KFX format decryption was by lulzkabulz, converted to python by Apprentice Naomi and integrated into the tools by tomthumb1997 The alfcrypto library is by some_updates -The DeDRM plugin was based on plugins by DiapDealer and is maintained by Apprentice Alf and Apprentice Harper +The DeDRM plugin is based on plugins by DiapDealer and is currently maintained by noDRM +The DeDRM plugin has been maintained by Apprentice Alf and Apprentice Harper until 2021. The original obok script was by Physisticated The plugin conversion was done anonymously. From b283777c0a429e5f0ec322e5c27d0579ca96dcbb Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 10:14:45 +0100 Subject: [PATCH 077/154] Add back unpad to fix Python2 support --- DeDRM_plugin/__init__.py | 2 +- DeDRM_plugin/adobekey.py | 14 ++++++++++---- DeDRM_plugin/adobekey_get_passhash.py | 13 ++++++++++--- DeDRM_plugin/androidkindlekey.py | 16 ++++++++++++++-- DeDRM_plugin/ignoblekeyAndroid.py | 21 +++++++++++++++------ DeDRM_plugin/ignoblekeyWindowsStore.py | 10 ++++++++-- DeDRM_plugin/ineptepub.py | 11 +++++++++-- DeDRM_plugin/ineptpdf.py | 12 ++++++++++-- DeDRM_plugin/ion.py | 26 ++++++++++++++++++++++---- Obok_plugin/obok/obok.py | 13 ++++++++++--- 10 files changed, 109 insertions(+), 29 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 7559b99c..74612c6e 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -96,7 +96,7 @@ try: import __version -except ModuleNotFoundError: +except: print("#############################") print("Failed to load the DeDRM plugin") print("Did you bundle this from source code yourself? If so, you'll need to run make_release.py instead to generate a valid plugin file.") diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 36c18dec..50e2c713 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -39,7 +39,7 @@ """ __license__ = 'GPL v3' -__version__ = '7.3' +__version__ = '7.4' import sys, os, struct, getopt from base64 import b64decode @@ -128,10 +128,16 @@ class ADEPTError(Exception): try: from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad + + def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device' PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation' @@ -381,7 +387,7 @@ def adeptkeys(): pass if ktype == 'privateLicenseKey': userkey = winreg.QueryValueEx(plkkey, 'value')[0] - userkey = unpad(AES.new(keykey, AES.MODE_CBC, b'\x00'*16).decrypt(b64decode(userkey)), 16)[26:] + userkey = unpad(AES.new(keykey, AES.MODE_CBC, b'\x00'*16).decrypt(b64decode(userkey)))[26:] # print ("found " + uuid_name + " key: " + str(userkey)) keys.append(userkey) diff --git a/DeDRM_plugin/adobekey_get_passhash.py b/DeDRM_plugin/adobekey_get_passhash.py index 72b7cd5c..1e9b8e2d 100644 --- a/DeDRM_plugin/adobekey_get_passhash.py +++ b/DeDRM_plugin/adobekey_get_passhash.py @@ -23,10 +23,17 @@ import base64, hashlib try: from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad + + +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" @@ -48,7 +55,7 @@ def decrypt_passhash(passhash, fp): hash_key = hashlib.sha1(bytearray.fromhex(serial_number + PASS_HASH_SECRET)).digest()[:16] encrypted_cc_hash = base64.b64decode(passhash) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) return base64.b64encode(cc_hash).decode("ascii") diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index 6b152f3e..971d7c30 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -36,10 +36,8 @@ try: from Cryptodome.Cipher import AES, DES - from Cryptodome.Util.Padding import pad, unpad except ImportError: from Crypto.Cipher import AES, DES - from Crypto.Util.Padding import pad, unpad # Routines common to Mac and PC @@ -116,6 +114,20 @@ class DrmException(Exception): STORAGE1 = "AmazonSecureStorage.xml" STORAGE2 = "map_data_storage.db" + +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + +def pad(data, padding_len=16): + padding_data_len = padding_len - (len(data) % padding_len) + plaintext = data + chr(padding_data_len) * padding_data_len + return plaintext + class AndroidObfuscation(object): '''AndroidObfuscation For the key, it's written in java, and run in android dalvikvm diff --git a/DeDRM_plugin/ignoblekeyAndroid.py b/DeDRM_plugin/ignoblekeyAndroid.py index 5fcbd6af..e0b2f238 100644 --- a/DeDRM_plugin/ignoblekeyAndroid.py +++ b/DeDRM_plugin/ignoblekeyAndroid.py @@ -10,13 +10,19 @@ import base64 try: from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad import hashlib from lxml import etree +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" @@ -46,10 +52,13 @@ def dump_keys(path_to_adobe_folder): hashes = [] for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"): - encrypted_cc_hash = base64.b64decode(pass_hash.text) - cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16) - hashes.append(base64.b64encode(cc_hash).decode("ascii")) - #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + try: + encrypted_cc_hash = base64.b64decode(pass_hash.text) + cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:])) + hashes.append(base64.b64encode(cc_hash).decode("ascii")) + #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii"))) + except: + pass return hashes diff --git a/DeDRM_plugin/ignoblekeyWindowsStore.py b/DeDRM_plugin/ignoblekeyWindowsStore.py index 886c7cd4..29df2045 100644 --- a/DeDRM_plugin/ignoblekeyWindowsStore.py +++ b/DeDRM_plugin/ignoblekeyWindowsStore.py @@ -16,13 +16,19 @@ import traceback try: from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import unpad except: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad import hashlib from lxml import etree +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + NOOK_DATA_FOLDER = "%LOCALAPPDATA%\\Packages\\BarnesNoble.Nook_ahnzqzva31enc\\LocalState" PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e" diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index aa7b5714..b9ec1491 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -56,11 +56,18 @@ try: from Cryptodome.Cipher import AES, PKCS1_v1_5 from Cryptodome.PublicKey import RSA - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES, PKCS1_v1_5 from Crypto.PublicKey import RSA - from Crypto.Util.Padding import unpad + + +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 4319997a..cb179de9 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -75,11 +75,19 @@ try: from Cryptodome.Cipher import AES, ARC4, PKCS1_v1_5 from Cryptodome.PublicKey import RSA - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES, ARC4, PKCS1_v1_5 from Crypto.PublicKey import RSA - from Crypto.Util.Padding import unpad + + +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + # Wrap a stream so that output gets flushed immediately # and also make sure that any unicode strings get diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index f9cd879a..45e96109 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -33,10 +33,8 @@ try: from Cryptodome.Cipher import AES from Cryptodome.Util.py3compat import bchr - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad from Crypto.Util.py3compat import bchr try: @@ -750,6 +748,26 @@ def addprottable(ion): ion.addtocatalog("ProtectedData", 1, SYM_NAMES) +def pkcs7pad(msg, blocklen): + paddinglen = blocklen - len(msg) % blocklen + padding = bchr(paddinglen) * paddinglen + return msg + padding + + +def pkcs7unpad(msg, blocklen): + _assert(len(msg) % blocklen == 0) + + paddinglen = msg[-1] + + _assert(paddinglen > 0 and paddinglen <= blocklen, "Incorrect padding - Wrong key") + _assert(msg[-paddinglen:] == bchr(paddinglen) * paddinglen, "Incorrect padding - Wrong key") + + return msg[:-paddinglen] + + + + + # every VoucherEnvelope version has a corresponding "word" and magic number, used in obfuscating the shared secret OBFUSCATION_TABLE = { "V1": (0x00, None), @@ -865,7 +883,7 @@ def decryptvoucher(self): key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) b = aes.decrypt(self.ciphertext) - b = unpad(b, 16) + b = pkcs7unpad(b, 16) self.drmkey = BinaryIonParser(BytesIO(b)) addprottable(self.drmkey) @@ -1071,7 +1089,7 @@ def print_(self, lst): def processpage(self, ct, civ, outpages, decompress, decrypt): if decrypt: aes = AES.new(self.key[:16], AES.MODE_CBC, civ[:16]) - msg = unpad(aes.decrypt(ct), 16) + msg = pkcs7unpad(aes.decrypt(ct), 16) else: msg = ct diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index e95e8d16..e7da4307 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -166,7 +166,7 @@ from __future__ import print_function __version__ = '10.0.1' -__about__ = "Obok v{0}\nCopyright © 2012-2020 Physisticated et al.".format(__version__) +__about__ = "Obok v{0}\nCopyright © 2012-2022 Physisticated et al.".format(__version__) import sys import os @@ -185,10 +185,17 @@ try: from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import unpad except ImportError: from Crypto.Cipher import AES - from Crypto.Util.Padding import unpad + +def unpad(data, padding=16): + if sys.version_info[0] == 2: + pad_len = ord(data[-1]) + else: + pad_len = data[-1] + + return data[:-pad_len] + can_parse_xml = True try: From bb170688ba67557de2400f377ab907b991437b30 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 15:08:36 +0100 Subject: [PATCH 078/154] (Hopefully) fix WineGetKeys for Kindle --- DeDRM_plugin/__init__.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 74612c6e..3521018e 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -164,7 +164,7 @@ def __getattr__(self, attr): class DeDRM(FileTypePlugin): name = PLUGIN_NAME - description = "Removes DRM from Amazon Kindle, Adobe Adept (including Kobo), Readium LCP, Barnes & Noble, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." + description = "Removes DRM from Adobe Adept (including Kobo), Barnes & Noble, Amazon Kindle, Mobipocket and eReader ebooks. Credit given to i♥cabbages and The Dark Reverser for the original stand-alone scripts." supported_platforms = ['linux', 'osx', 'windows'] author = "Apprentice Alf, Apprentice Harper, NoDRM, The Dark Reverser and i♥cabbages" version = PLUGIN_VERSION_TUPLE @@ -382,7 +382,7 @@ def ePubDecrypt(self,path_to_ebook): from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"ignoblekeyNookStudy.py") - defaultkeys_study = WineGetKeys(scriptpath, ".b64",dedrmprefs['adobewineprefix']) + defaultkeys_study, defaultnames_study = WineGetKeys(scriptpath, ".b64",dedrmprefs['adobewineprefix']) except: print("{0} v{1}: Exception when getting default NOOK Study Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) @@ -948,21 +948,30 @@ def KindleMobiDecrypt(self,path_to_ebook): from kindlekey import kindlekeys defaultkeys = kindlekeys() + defaultnames = [] else: # linux from wineutils import WineGetKeys scriptpath = os.path.join(self.alfdir,"kindlekey.py") - defaultkeys = WineGetKeys(scriptpath, ".k4i",dedrmprefs['kindlewineprefix']) + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".k4i",dedrmprefs['kindlewineprefix']) except: print("{0} v{1}: Exception when getting default Kindle Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) traceback.print_exc() pass - newkeys = {} + newkeys = [] + newnames = [] + for i,keyvalue in enumerate(defaultkeys): - keyname = "default_key_{0:d}".format(i+1) + try: + keyname = "default_key_" + defaultnames[i] + except: + keyname = "default_key_{0:d}".format(i+1) + if keyvalue not in dedrmprefs['kindlekeys'].values(): - newkeys[keyname] = keyvalue + newkeys.append(keyvalue) + newnames.append(keyname) + if len(newkeys) > 0: print("{0} v{1}: Found {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) try: @@ -970,8 +979,8 @@ def KindleMobiDecrypt(self,path_to_ebook): decoded = True # store the new successful keys in the defaults print("{0} v{1}: Saving {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) - for keyvalue in newkeys.values(): - dedrmprefs.addnamedvaluetoprefs('kindlekeys','default_key',keyvalue) + for i,keyvalue in enumerate(newkeys): + dedrmprefs.addnamedvaluetoprefs('kindlekeys',newnames[i],keyvalue) dedrmprefs.writeprefs() except Exception as e: pass From e4fe032e4719e87e004b2f36e433051bf3345b85 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 15:23:07 +0100 Subject: [PATCH 079/154] Some untested Python2 Kindle bugfixes --- DeDRM_plugin/k4mobidedrm.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index ec108d4d..e048a036 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -69,7 +69,11 @@ import re import traceback import time -import html.entities +try: + import html.entities as htmlentitydefs +except: + import htmlentitydefs + import json #@@CALIBRE_COMPAT_CODE@@ @@ -188,7 +192,7 @@ def fixup(m): else: # named entity try: - text = chr(html.entities.name2codepoint[text[1:-1]]) + text = chr(htmlentitydefs.name2codepoint[text[1:-1]]) except KeyError: pass return text # leave as is @@ -215,8 +219,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime else: mb = topazextract.TopazBook(infile) - bookname = unescape(mb.getBookTitle()) - print("Decrypting {1} ebook: {0}".format(bookname, mb.getBookType())) + try: + bookname = unescape(mb.getBookTitle()) + print("Decrypting {1} ebook: {0}".format(bookname, mb.getBookType())) + except: + print("Decrypting {0} ebook.".format(mb.getBookType())) # copy list of pids totalpids = list(pids) From 7eb8f07a33c28a49452a9755742d535ac8a33ed2 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 16:02:33 +0100 Subject: [PATCH 080/154] Bugfix for Nook PDFs? --- DeDRM_plugin/ineptpdf.py | 7 ++++++- DeDRM_plugin/wineutils.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index cb179de9..310ab1e5 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1601,7 +1601,12 @@ def initialize_standard(self, password, docid, param): def initialize_ebx_ignoble(self, keyb64, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True - key = keyb64.decode('base64')[:16] + try: + key = keyb64.decode('base64')[:16] + # This will probably always error, but I'm not 100% sure, so lets leave the old code in. + except AttributeError: + key = codecs.decode(keyb64.encode("ascii"), 'base64')[:16] + length = int_value(param.get('Length', 0)) / 8 rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') rights = zlib.decompress(rights, -15) diff --git a/DeDRM_plugin/wineutils.py b/DeDRM_plugin/wineutils.py index cd79b4c4..ed4e6530 100644 --- a/DeDRM_plugin/wineutils.py +++ b/DeDRM_plugin/wineutils.py @@ -77,7 +77,7 @@ def WineGetKeys(scriptpath, extension, wineprefix=""): pyexec = WinePythonCLI(wineprefix) except NoWinePython3Exception: print('{0} v{1}: Unable to find python3 executable in WINEPREFIX="{2}"'.format(PLUGIN_NAME, PLUGIN_VERSION, wineprefix)) - return [] + return [], [] basepath, script = os.path.split(scriptpath) print("{0} v{1}: Running {2} under Wine".format(PLUGIN_NAME, PLUGIN_VERSION, script)) From 2d51005cf141d267fc4b278f742d319e1515a17d Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 19 Mar 2022 16:41:59 +0100 Subject: [PATCH 081/154] Fix print-replica Amazon books --- CHANGELOG.md | 4 +++- DeDRM_plugin/mobidedrm.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92d66707..4cb498bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,4 +61,6 @@ List of changes since the fork of Apprentice Harper's repository: - Add support for books with the new ADE3.0+ DRM by merging #48 by a980e066a01. Thanks a lot! - Remove OpenSSL support, now the plugin will always use the Python crypto libraries. - Obok: Fix issues with invalid UTF-8 characters by merging #26 by baby-bell. -- Try to fix PDF files with V3 key obfuscation algorithm. +- ineptpdf: Fix broken V=3 key obfuscation algorithm. +- ineptpdf: (Hopefully) fix issues with some B&N PDF files. +- Fix bug that corrupts output file for Print-Replica Amazon books (fixes #30). diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index c57b884d..902edd15 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -453,7 +453,7 @@ def processBook(self, pidlist): if crypto_type == 0: print("This book is not encrypted.") # we must still check for Print Replica - self.print_replica = (self.loadSection(1)[0:4] == '%MOP') + self.print_replica = (self.loadSection(1)[0:4] == b'%MOP') self.mobi_data = self.data_file return if crypto_type != 2 and crypto_type != 1: @@ -524,7 +524,7 @@ def processBook(self, pidlist): # print "record %d, extra_size %d" %(i,extra_size) decoded_data = PC1(found_key, data[0:len(data) - extra_size]) if i==1: - self.print_replica = (decoded_data[0:4] == '%MOP') + self.print_replica = (decoded_data[0:4] == b'%MOP') mobidataList.append(decoded_data) if extra_size > 0: mobidataList.append(data[-extra_size:]) From 726d72217e0d6bb8229732a35fa85275a3b629f3 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 20 Mar 2022 08:09:00 +0100 Subject: [PATCH 082/154] Hopefully fix Kindle books --- DeDRM_plugin/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 3521018e..ad2e38f1 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -975,7 +975,7 @@ def KindleMobiDecrypt(self,path_to_ebook): if len(newkeys) > 0: print("{0} v{1}: Found {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) try: - book = k4mobidedrm.GetDecryptedBook(path_to_ebook,list(newkeys.items()),[],[],[],self.starttime) + book = k4mobidedrm.GetDecryptedBook(path_to_ebook,list(newkeys),[],[],[],self.starttime) decoded = True # store the new successful keys in the defaults print("{0} v{1}: Saving {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) From 76ce6d9c5c813b57d37173280cf3800b90530970 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 20 Mar 2022 14:32:22 +0100 Subject: [PATCH 083/154] Fix Kindle for real --- DeDRM_plugin/__init__.py | 20 +++++++++----------- DeDRM_plugin/config.py | 6 +++--- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index ad2e38f1..ad68ab41 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -959,30 +959,28 @@ def KindleMobiDecrypt(self,path_to_ebook): traceback.print_exc() pass - newkeys = [] + newkeys = {} newnames = [] for i,keyvalue in enumerate(defaultkeys): - try: - keyname = "default_key_" + defaultnames[i] - except: - keyname = "default_key_{0:d}".format(i+1) - if keyvalue not in dedrmprefs['kindlekeys'].values(): - newkeys.append(keyvalue) - newnames.append(keyname) + newkeys["key_{0:d}".format(i)] = keyvalue if len(newkeys) > 0: print("{0} v{1}: Found {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) try: - book = k4mobidedrm.GetDecryptedBook(path_to_ebook,list(newkeys),[],[],[],self.starttime) + book = k4mobidedrm.GetDecryptedBook(path_to_ebook,newkeys.items(),[],[],[],self.starttime) decoded = True # store the new successful keys in the defaults print("{0} v{1}: Saving {2} new {3}".format(PLUGIN_NAME, PLUGIN_VERSION, len(newkeys), "key" if len(newkeys)==1 else "keys")) - for i,keyvalue in enumerate(newkeys): - dedrmprefs.addnamedvaluetoprefs('kindlekeys',newnames[i],keyvalue) + i = 1 + for keyvalue in newkeys.values(): + while "kindle_key_{0:d}_{1:d}".format(int(time.time()), i) in dedrmprefs['kindlekeys']: + i = i + 1 + dedrmprefs.addnamedvaluetoprefs('kindlekeys',"kindle_key_{0:d}_{1:d}".format(int(time.time()), i),keyvalue) dedrmprefs.writeprefs() except Exception as e: + traceback.print_exc() pass if not decoded: #if you reached here then no luck raise and exception diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index b3d924c9..193b8f69 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -6,7 +6,7 @@ # Python 3, September 2020 # Standard Python modules. -import sys, os, traceback, json, codecs, base64 +import sys, os, traceback, json, codecs, base64, time from PyQt5.Qt import (Qt, QWidget, QHBoxLayout, QVBoxLayout, QLabel, QLineEdit, QGroupBox, QPushButton, QListWidget, QListWidgetItem, QCheckBox, @@ -1237,7 +1237,7 @@ def __init__(self, parent=None,): from wineutils import WineGetKeys scriptpath = os.path.join(parent.parent.alfdir,"kindlekey.py") - defaultkeys = WineGetKeys(scriptpath, ".k4i",parent.getwineprefix()) + defaultkeys, defaultnames = WineGetKeys(scriptpath, ".k4i",parent.getwineprefix()) self.default_key = defaultkeys[0] except: @@ -1255,7 +1255,7 @@ def __init__(self, parent=None,): key_group = QHBoxLayout() data_group_box_layout.addLayout(key_group) key_group.addWidget(QLabel("Unique Key Name:", self)) - self.key_ledit = QLineEdit("default_key", self) + self.key_ledit = QLineEdit("default_key_" + str(int(time.time())), self) self.key_ledit.setToolTip("

      Enter an identifying name for the current default Kindle for Mac/PC key.") key_group.addWidget(self.key_ledit) From dcbb3775667ab716f2da0c61d97000750cd7f88e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Tue, 22 Mar 2022 15:49:44 +0100 Subject: [PATCH 084/154] Fix Nook study key retrieval --- CHANGELOG.md | 2 ++ DeDRM_plugin/ignoblekeyNookStudy.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cb498bd..9f3940e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,4 +63,6 @@ List of changes since the fork of Apprentice Harper's repository: - Obok: Fix issues with invalid UTF-8 characters by merging #26 by baby-bell. - ineptpdf: Fix broken V=3 key obfuscation algorithm. - ineptpdf: (Hopefully) fix issues with some B&N PDF files. +- Fix broken Amazon K4PC key retrieval (fixes #38) - Fix bug that corrupts output file for Print-Replica Amazon books (fixes #30). +- Fix Nook Study key retrieval code (partially fixes #50). diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index 93c691b0..fd85660e 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -157,7 +157,7 @@ def getNookLogFiles(): logpath = path +'\\Barnes & Noble\\NOOKstudy\\logs\\BNClientLog.txt' if os.path.isfile(logpath): found = True - print('Found nookStudy log file: ' + logpath.encode('ascii','ignore'), file=sys.stderr) + print('Found nookStudy log file: ' + logpath, file=sys.stderr) logFiles.append(logpath) else: home = os.getenv('HOME') From 012ff533ab6ba6920813284a4eb7f46e4dc81831 Mon Sep 17 00:00:00 2001 From: Yuki Liu Date: Fri, 15 Apr 2022 11:02:18 -0500 Subject: [PATCH 085/154] fix the regular expression --- DeDRM_plugin/k4mobidedrm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index e048a036..3ddb9e8a 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -275,7 +275,7 @@ def decryptBook(infile, outdir, kDatabaseFiles, androidFiles, serials, pids): orig_fn_root = os.path.splitext(os.path.basename(infile))[0] if ( re.match('^B[A-Z0-9]{9}(_EBOK|_EBSP|_sample)?$', orig_fn_root) or - re.match('^{0-9A-F-}{36}$', orig_fn_root) + re.match('^[0-9A-F-]{36}$', orig_fn_root) ): # Kindle for PC / Mac / Android / Fire / iOS clean_title = cleanup_name(book.getBookTitle()) outfilename = "{}_{}".format(orig_fn_root, clean_title) From c12d214b5900db99f147848e046be758fb963070 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 13 Jul 2022 15:34:47 +0200 Subject: [PATCH 086/154] Fix Obok plugin on Calibre 6 (#98) --- Obok_plugin/config.py | 2 +- Obok_plugin/dialogs.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Obok_plugin/config.py b/Obok_plugin/config.py index 9a637f32..a9363ad4 100644 --- a/Obok_plugin/config.py +++ b/Obok_plugin/config.py @@ -62,7 +62,7 @@ def edit_serials(self): def edit_kobo_directory(self): - tmpkobodirectory = QFileDialog.getExistingDirectory(self, "Select Kobo directory", self.kobodirectory or "/home", QFileDialog.ShowDirsOnly) + tmpkobodirectory = QFileDialog.getExistingDirectory(self, "Select Kobo directory", self.kobodirectory or "/home", QFileDialog.Option.ShowDirsOnly) if tmpkobodirectory != u"" and tmpkobodirectory is not None: self.kobodirectory = tmpkobodirectory diff --git a/Obok_plugin/dialogs.py b/Obok_plugin/dialogs.py index 85abfaf3..16bfcb08 100644 --- a/Obok_plugin/dialogs.py +++ b/Obok_plugin/dialogs.py @@ -409,7 +409,7 @@ class ReadOnlyTableWidgetItem(QTableWidgetItem): def __init__(self, text): if text is None: text = '' - QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, text, QTableWidgetItem.ItemType.UserType) self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) class AuthorTableWidgetItem(ReadOnlyTableWidgetItem): @@ -448,7 +448,7 @@ def __lt__(self, other): class NumericTableWidgetItem(QTableWidgetItem): def __init__(self, number, is_read_only=False): - QTableWidgetItem.__init__(self, '', QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, '', QTableWidgetItem.ItemType.UserType) self.setData(Qt.DisplayRole, number) if is_read_only: self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) From fed8bb716befd2a6f9715dce3d6bda2f1dec5eba Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 13 Jul 2022 17:31:14 +0200 Subject: [PATCH 087/154] Add some Python2 compat code I forgot to add earlier --- DeDRM_plugin/ineptpdf.py | 21 +++++++++++---------- DeDRM_plugin/utilities.py | 10 ++++++++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 310ab1e5..24fc1508 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -50,13 +50,14 @@ # 9.1.0 - Support for decrypting with owner password, support for V=5, R=5 and R=6 PDF files, support for AES256-encrypted PDFs. # 9.1.1 - Only support PyCryptodome; clean up the code # 10.0.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10) +# 10.0.2 - Fix some Python2 stuff """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "10.0.0" +__version__ = "10.0.2" import codecs import hashlib @@ -65,6 +66,8 @@ import re import zlib import struct +import binascii +import base64 from io import BytesIO from decimal import Decimal import itertools @@ -1369,7 +1372,7 @@ def recover_encryption_key_with_password(self, password, docid, param): return file_key - def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: int = 1, iv: bytes = None): + def process_with_aes(self, key, encrypt, data, repetitions = 1, iv = None): if iv is None: keylen = len(key) iv = bytes([0x00]*keylen) @@ -1601,19 +1604,17 @@ def initialize_standard(self, password, docid, param): def initialize_ebx_ignoble(self, keyb64, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True - try: - key = keyb64.decode('base64')[:16] - # This will probably always error, but I'm not 100% sure, so lets leave the old code in. - except AttributeError: - key = codecs.decode(keyb64.encode("ascii"), 'base64')[:16] + key = keyb64.decode('base64')[:16] length = int_value(param.get('Length', 0)) / 8 - rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') + rights = codecs.decode(str_value(param.get('ADEPT_LICENSE')), "base64") rights = zlib.decompress(rights, -15) rights = etree.fromstring(rights) expr = './/{http://ns.adobe.com/adept}encryptedKey' - bookkey = ''.join(rights.findtext(expr)).decode('base64') - bookkey = unpad(AES.new(key, AES.MODE_CBC, b'\x00'*16).decrypt(bookkey), 16) # PKCS#7 + bookkey = ''.join(rights.findtext(expr)) + bookkey = base64.b64decode(bookkey) + bookkey = AES.new(key, AES.MODE_CBC, b'\x00'*16).decrypt(bookkey) + bookkey = unpad(bookkey, 16) # PKCS#7 if len(bookkey) > 16: bookkey = bookkey[-16:] ebx_V = int_value(param.get('V', 4)) diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index bd008b59..cd08a665 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -4,6 +4,7 @@ #@@CALIBRE_COMPAT_CODE@@ from ignoblekeyGenPassHash import generate_key +import sys __license__ = 'GPL v3' @@ -21,8 +22,13 @@ def uStrCmp (s1, s2, caseless=False): import unicodedata as ud - str1 = s1 if isinstance(s1, str) else str(s1) - str2 = s2 if isinstance(s2, str) else str(s2) + if sys.version_info[0] == 2: + str1 = s1 if isinstance(s1, unicode) else unicode(s1) + str2 = s2 if isinstance(s2, unicode) else unicode(s2) + else: + str1 = s1 if isinstance(s1, str) else str(s1) + str2 = s2 if isinstance(s2, str) else str(s2) + if caseless: return ud.normalize('NFC', str1.lower()) == ud.normalize('NFC', str2.lower()) else: From 077e8f5c2a6381f4c3803ea4f0b87b1ca85f6fb4 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 13 Jul 2022 17:21:49 +0200 Subject: [PATCH 088/154] Prepare release v10.0.3 --- CHANGELOG.md | 10 +++++++--- DeDRM_plugin/DeDRM_Help.htm | 6 +++--- DeDRM_plugin/__version.py | 2 +- Obok_plugin/__init__.py | 4 ++-- Obok_plugin/obok/obok.py | 3 +++ Obok_plugin/obok_dedrm_Help.htm | 2 +- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f3940e7..e206d763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ List of changes since the fork of Apprentice Harper's repository: - Fix small issue with elibri watermark removal. - Adobe key name will now contain account email. -## Fixes on master (not yet released): +## Fixes in v10.0.3 (2022-07-13): - Fix issue where importing a key from Adobe Digital Editions would fail in Python2 (Calibre < 5) if there were non-ASCII characters in the username. - Add code to support importing multiple decryption keys from ADE. @@ -56,9 +56,8 @@ List of changes since the fork of Apprentice Harper's repository: - Drop support for importing key data from the ancient, pre "DeDRM" Calibre plugins ("Ignoble Epub DeDRM", "eReader PDB 2 PML" and "K4MobiDeDRM"). These are from 2011, I doubt anyone still has these installed, I can't even find a working link for these to test them. If you still have encryption keys in one of these plugins, you will need to update to DeDRM v10.0.2 or older (to convert the keys) before updating to DeDRM v10.0.3 or newer. - Some Python3 bugfixes for Amazon books (merged #10 by ableeker). - Fix a bug where extracting an Adobe key from ADE on Linux through Wine did fail when using the OpenSSL backend (instead of PyCrypto). See #13 and #14 for details, thanks acaloiaro for the bugfix. -- Make the plugin work on Calibre 6 (Qt 6). If you're running the Calibre 6 beta and you notice any issues, please open a bug report. - Fix IndexError when DeDRMing some Amazon eBooks. -- Add support for books with the new ADE3.0+ DRM by merging #48 by a980e066a01. Thanks a lot! +- Add support for books with the new ADE3.0+ DRM by merging #48 by a980e066a01. Thanks a lot! (Also fixes #96 on MacOS) - Remove OpenSSL support, now the plugin will always use the Python crypto libraries. - Obok: Fix issues with invalid UTF-8 characters by merging #26 by baby-bell. - ineptpdf: Fix broken V=3 key obfuscation algorithm. @@ -66,3 +65,8 @@ List of changes since the fork of Apprentice Harper's repository: - Fix broken Amazon K4PC key retrieval (fixes #38) - Fix bug that corrupts output file for Print-Replica Amazon books (fixes #30). - Fix Nook Study key retrieval code (partially fixes #50). +- Make the plugin work on Calibre 6 (Qt 6). (fixes #54 and #98) If you're running Calibre 6 and you notice any issues, please open a bug report. + +## Fixes on master (not yet released): + +- (None) \ No newline at end of file diff --git a/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_plugin/DeDRM_Help.htm index c94d074b..5d851592 100644 --- a/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_plugin/DeDRM_Help.htm @@ -17,7 +17,7 @@ -

      DeDRM Plugin (v10.0.2)

      +

      DeDRM Plugin (v10.0.3)

      This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.

      @@ -39,14 +39,14 @@

      Configuration

      Troubleshooting:

      -

      If you find that it’s not working for you , you can save a lot of time by trying to add the ebook to Calibre in debug mode. This will print out a lot of helpful info that can be copied into any online help requests.

      +

      If you find that it’s not working for you , you can save a lot of time by trying to add the ebook to Calibre in debug mode. This will print out a lot of helpful info that can be copied into any online help requests.

      Open a command prompt (terminal window) and type "calibre-debug -g" (without the quotes). Calibre will launch, and you can can add the problem ebook the usual way. The debug info will be output to the original command prompt (terminal window). Copy the resulting output and paste it into the comment you make at my blog.

      Note: The Mac version of Calibre doesn’t install the command line tools by default. If you go to the ‘Preferences’ page and click on the miscellaneous button, you’ll find the option to install the command line tools.

      Credits:

        -
      • NoDRM for a bunch of updates and maintenance since November 2021, and the Readium LCP support
      • +
      • NoDRM for a bunch of updates and maintenance since November 2021, and the Readium LCP support
      • The Dark Reverser for the Mobipocket and eReader scripts
      • i♥cabbages for the Adobe Digital Editions scripts
      • Skindle aka Bart Simpson for the Amazon Kindle for PC script
      • diff --git a/DeDRM_plugin/__version.py b/DeDRM_plugin/__version.py index db5eaa1e..ab2ebb0f 100644 --- a/DeDRM_plugin/__version.py +++ b/DeDRM_plugin/__version.py @@ -4,7 +4,7 @@ #@@CALIBRE_COMPAT_CODE@@ PLUGIN_NAME = "DeDRM" -__version__ = '10.0.2' +__version__ = '10.0.3' PLUGIN_VERSION_TUPLE = tuple([int(x) for x in __version__.split(".")]) PLUGIN_VERSION = ".".join([str(x)for x in PLUGIN_VERSION_TUPLE]) diff --git a/Obok_plugin/__init__.py b/Obok_plugin/__init__.py index 2ecc16a9..f752d5cd 100644 --- a/Obok_plugin/__init__.py +++ b/Obok_plugin/__init__.py @@ -3,7 +3,7 @@ print_function) __license__ = 'GPL v3' -__version__ = '10.0.0' +__version__ = '10.0.3' __docformat__ = 'restructuredtext en' ##################################################################### @@ -20,7 +20,7 @@ PLUGIN_NAME = 'Obok DeDRM' PLUGIN_SAFE_NAME = PLUGIN_NAME.strip().lower().replace(' ', '_') PLUGIN_DESCRIPTION = _('Removes DRM from Kobo kepubs and adds them to the library.') -PLUGIN_VERSION_TUPLE = (10, 0, 0) +PLUGIN_VERSION_TUPLE = (10, 0, 3) PLUGIN_VERSION = '.'.join([str(x) for x in PLUGIN_VERSION_TUPLE]) HELPFILE_NAME = PLUGIN_SAFE_NAME + '_Help.htm' PLUGIN_AUTHORS = 'Anon' diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index e7da4307..a986965a 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -1,6 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# Version 10.0.3 July 2022 +# Fix Calibre 6 +# # Version 10.0.1 February 2022 # Remove OpenSSL support to only support PyCryptodome; clean up the code. # diff --git a/Obok_plugin/obok_dedrm_Help.htm b/Obok_plugin/obok_dedrm_Help.htm index c79eb5d2..4d1247e1 100644 --- a/Obok_plugin/obok_dedrm_Help.htm +++ b/Obok_plugin/obok_dedrm_Help.htm @@ -8,7 +8,7 @@

        Obok DeDRM Plugin

        -

        (version 10.0.0)

        +

        (version 10.0.2)

        Installation:

        From c15135b12ff2a0944f456314fa801d5881c2b161 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 16 Jul 2022 09:48:27 +0200 Subject: [PATCH 089/154] Fix RSA.import_key (fixes #101) Apparently "import_key" only exists in newer versions (as an alias to "importKey"). "importKey" works in all versions ... --- CHANGELOG.md | 2 +- DeDRM_plugin/ineptepub.py | 2 +- DeDRM_plugin/ineptpdf.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e206d763..8d48de7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,4 +69,4 @@ List of changes since the fork of Apprentice Harper's repository: ## Fixes on master (not yet released): -- (None) \ No newline at end of file +- Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). \ No newline at end of file diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index b9ec1491..6b4b6760 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -302,7 +302,7 @@ def decryptBook(userkey, inpath, outpath): if len(bookkey) != 64: # Normal or "hardened" Adobe ADEPT - rsakey = RSA.import_key(userkey) # parses the ASN1 structure + rsakey = RSA.importKey(userkey) # parses the ASN1 structure bookkey = base64.b64decode(bookkey) if int(keytype, 10) > 2: bookkey = removeHardening(rights, keytype, bookkey) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 24fc1508..7a147505 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1669,7 +1669,7 @@ def removeHardening(rights, keytype, keydata): def initialize_ebx_inept(self, password, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True - rsakey = RSA.import_key(password) # parses the ASN1 structure + rsakey = RSA.importKey(password) # parses the ASN1 structure length = int_value(param.get('Length', 0)) // 8 rights = codecs.decode(param.get('ADEPT_LICENSE'), 'base64') rights = zlib.decompress(rights, -15) From 59839ae5c7720f48019d72f31c47a043f1c9d58e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 3 Aug 2022 17:16:42 +0200 Subject: [PATCH 090/154] Fix Calibre 6 issue in Obok plugin --- CHANGELOG.md | 3 ++- Obok_plugin/common_utils.py | 8 ++++---- Obok_plugin/utilities.py | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d48de7e..feb8a84a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,4 +69,5 @@ List of changes since the fork of Apprentice Harper's repository: ## Fixes on master (not yet released): -- Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). \ No newline at end of file +- Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). +- Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). diff --git a/Obok_plugin/common_utils.py b/Obok_plugin/common_utils.py index 21b7f195..fe67f425 100644 --- a/Obok_plugin/common_utils.py +++ b/Obok_plugin/common_utils.py @@ -265,13 +265,13 @@ class ReadOnlyTableWidgetItem(QTableWidgetItem): def __init__(self, text): if text is None: text = '' - QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, text, QTableWidgetItem.ItemType.UserType) self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) class RatingTableWidgetItem(QTableWidgetItem): def __init__(self, rating, is_read_only=False): - QTableWidgetItem.__init__(self, '', QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, '', QTableWidgetItem.ItemType.UserType) self.setData(Qt.DisplayRole, rating) if is_read_only: self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) @@ -284,11 +284,11 @@ def __init__(self, date_read, is_read_only=False, default_to_today=False, fmt=No if date_read is None or date_read == UNDEFINED_DATE and default_to_today: date_read = now() if is_read_only: - QTableWidgetItem.__init__(self, format_date(date_read, fmt), QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, format_date(date_read, fmt), QTableWidgetItem.ItemType.UserType) self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) self.setData(Qt.DisplayRole, QDateTime(date_read)) else: - QTableWidgetItem.__init__(self, '', QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, '', QTableWidgetItem.ItemType.UserType) self.setData(Qt.DisplayRole, QDateTime(date_read)) from calibre.gui2.library.delegates import DateDelegate as _DateDelegate diff --git a/Obok_plugin/utilities.py b/Obok_plugin/utilities.py index b2f02ade..ba0d7fc5 100644 --- a/Obok_plugin/utilities.py +++ b/Obok_plugin/utilities.py @@ -224,5 +224,5 @@ class ReadOnlyTableWidgetItem(QTableWidgetItem): def __init__(self, text): if text is None: text = '' - QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType) + QTableWidgetItem.__init__(self, text, QTableWidgetItem.ItemType.UserType) self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) From 9a11f480b527e3d1064b890b1b5043e1c5363957 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 3 Aug 2022 19:49:20 +0200 Subject: [PATCH 091/154] Fix plugin crash with invalid ADE key --- CHANGELOG.md | 1 + DeDRM_plugin/__init__.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index feb8a84a..8f3c7f20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,3 +71,4 @@ List of changes since the fork of Apprentice Harper's repository: - Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). +- Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). \ No newline at end of file diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index ad68ab41..ba9e2ec2 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -511,10 +511,10 @@ def ePubDecrypt(self,path_to_ebook): continue # Found matching key - userkey = codecs.decode(userkeyhex, 'hex') print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".epub") try: + userkey = codecs.decode(userkeyhex, 'hex') result = ineptepub.decryptBook(userkey, inf.name, of.name) of.close() if result == 0: @@ -531,12 +531,13 @@ def ePubDecrypt(self,path_to_ebook): # Attempt to decrypt epub with each encryption key (generated or provided). for keyname, userkeyhex in dedrmprefs['adeptkeys'].items(): - userkey = codecs.decode(userkeyhex, 'hex') + print("{0} v{1}: Trying Encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".epub") # Give the user key, ebook and TemporaryPersistent file to the decryption function. try: + userkey = codecs.decode(userkeyhex, 'hex') result = ineptepub.decryptBook(userkey, inf.name, of.name) except ineptepub.ADEPTNewVersionError: print("{0} v{1}: Book uses unsupported (too new) Adobe DRM.".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) @@ -673,11 +674,11 @@ def PDFIneptDecrypt(self, path_to_ebook): continue # Found matching key - userkey = codecs.decode(userkeyhex, 'hex') print("{0} v{1}: Trying UUID-matched encryption key {2:s}".format(PLUGIN_NAME, PLUGIN_VERSION, keyname)) of = self.temporary_file(".pdf") try: + userkey = codecs.decode(userkeyhex, 'hex') result = ineptpdf.decryptBook(userkey, path_to_ebook, of.name) of.close() if result == 0: From 80cbaa4841622ffb4605f53107cc0bad0801ef35 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 13:53:03 +0200 Subject: [PATCH 092/154] Fix ZIP attribute "external_attr" getting reset --- CHANGELOG.md | 3 ++- DeDRM_plugin/epubfontdecrypt.py | 9 +++++++++ DeDRM_plugin/epubwatermark.py | 26 ++++++++++++++++++++++++++ DeDRM_plugin/ineptepub.py | 12 ++++++++++++ DeDRM_plugin/zeroedzipinfo.py | 30 ++++++++++++++++++++++++++++++ DeDRM_plugin/zipfilerugged.py | 13 +++++++++++++ DeDRM_plugin/zipfix.py | 30 ++++++++++++++++++++++-------- 7 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 DeDRM_plugin/zeroedzipinfo.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f3c7f20..783ce756 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,4 +71,5 @@ List of changes since the fork of Apprentice Harper's repository: - Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). -- Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). \ No newline at end of file +- Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). +- Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer. diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py index ea08175b..4baa3752 100644 --- a/DeDRM_plugin/epubfontdecrypt.py +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -25,6 +25,7 @@ import zlib import zipfile from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from zeroedzipinfo import ZeroedZipInfo from contextlib import closing from lxml import etree import itertools @@ -298,13 +299,21 @@ def decryptFontsBook(inpath, outpath): zi.internal_attr = oldzi.internal_attr # external attributes are dependent on the create system, so copy both. zi.external_attr = oldzi.external_attr + zi.volume = oldzi.volume zi.create_system = oldzi.create_system + zi.create_version = oldzi.create_version + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): # If the file name or the comment contains any non-ASCII char, set the UTF8-flag zi.flag_bits |= 0x800 except: pass + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if zi.external_attr == 0: + zi = ZeroedZipInfo(zi) + if path == "mimetype": outf.writestr(zi, inf.read('mimetype')) elif path == "META-INF/encryption.xml": diff --git a/DeDRM_plugin/epubwatermark.py b/DeDRM_plugin/epubwatermark.py index 176c77fd..67199351 100644 --- a/DeDRM_plugin/epubwatermark.py +++ b/DeDRM_plugin/epubwatermark.py @@ -16,6 +16,7 @@ import traceback from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from zeroedzipinfo import ZeroedZipInfo from contextlib import closing from lxml import etree import re @@ -133,13 +134,22 @@ def removeHTMLwatermarks(object, path_to_ebook): zi.extra = oldzi.extra zi.internal_attr = oldzi.internal_attr zi.external_attr = oldzi.external_attr + zi.volume = oldzi.volume zi.create_system = oldzi.create_system + zi.create_version = oldzi.create_version + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): # If the file name or the comment contains any non-ASCII char, set the UTF8-flag zi.flag_bits |= 0x800 except: pass + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if zi.external_attr == 0: + zi = ZeroedZipInfo(zi) + + outf.writestr(zi, data) except: traceback.print_exc() @@ -249,13 +259,21 @@ def removeOPFwatermarks(object, path_to_ebook): zi.extra = oldzi.extra zi.internal_attr = oldzi.internal_attr zi.external_attr = oldzi.external_attr + zi.volume = oldzi.volume zi.create_system = oldzi.create_system + zi.create_version = oldzi.create_version + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): # If the file name or the comment contains any non-ASCII char, set the UTF8-flag zi.flag_bits |= 0x800 except: pass + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if zi.external_attr == 0: + zi = ZeroedZipInfo(zi) + outf.writestr(zi, data) except: traceback.print_exc() @@ -301,13 +319,21 @@ def removeCDPwatermark(object, path_to_ebook): zi.extra = oldzi.extra zi.internal_attr = oldzi.internal_attr zi.external_attr = oldzi.external_attr + zi.volume = oldzi.volume zi.create_system = oldzi.create_system + zi.create_version = oldzi.create_version + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): # If the file name or the comment contains any non-ASCII char, set the UTF8-flag zi.flag_bits |= 0x800 except: pass + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if zi.external_attr == 0: + zi = ZeroedZipInfo(zi) + outf.writestr(zi, data) print("Watermark: Successfully removed cdp.info watermark") diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 6b4b6760..094cb8c8 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -48,6 +48,7 @@ import zlib import zipfile from zipfile import ZipInfo, ZipFile, ZIP_STORED, ZIP_DEFLATED +from zeroedzipinfo import ZeroedZipInfo from contextlib import closing from lxml import etree from uuid import UUID @@ -356,12 +357,23 @@ def decryptBook(userkey, inpath, outpath): zi.internal_attr = oldzi.internal_attr # external attributes are dependent on the create system, so copy both. zi.external_attr = oldzi.external_attr + + zi.volume = oldzi.volume zi.create_system = oldzi.create_system + zi.create_version = oldzi.create_version + if any(ord(c) >= 128 for c in path) or any(ord(c) >= 128 for c in zi.comment): # If the file name or the comment contains any non-ASCII char, set the UTF8-flag zi.flag_bits |= 0x800 except: pass + + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if zi.external_attr == 0: + zi = ZeroedZipInfo(zi) + + if path == "META-INF/encryption.xml": outf.writestr(zi, data) else: diff --git a/DeDRM_plugin/zeroedzipinfo.py b/DeDRM_plugin/zeroedzipinfo.py new file mode 100644 index 00000000..08c65d06 --- /dev/null +++ b/DeDRM_plugin/zeroedzipinfo.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + + +""" +Python 3's "zipfile" has an annoying bug where the `external_attr` field +of a ZIP file cannot be set to 0. However, if the original DRMed ZIP has +that set to 0 then we want the DRM-free ZIP to have that as 0, too. +See https://github.com/python/cpython/issues/87713 + +We cannot just set the "external_attr" to 0 as the code to save the ZIP +resets that variable. + +So, here's a class that inherits from ZipInfo and ensures that EVERY +read access to that variable will return a 0 ... + +""" + +import zipfile + +class ZeroedZipInfo(zipfile.ZipInfo): + def __init__(self, zinfo): + for k in self.__slots__: + if hasattr(zinfo, k): + setattr(self, k, getattr(zinfo, k)) + + def __getattribute__(self, name): + if name == "external_attr": + return 0 + return object.__getattribute__(self, name) diff --git a/DeDRM_plugin/zipfilerugged.py b/DeDRM_plugin/zipfilerugged.py index aef9ea3f..1941cc06 100755 --- a/DeDRM_plugin/zipfilerugged.py +++ b/DeDRM_plugin/zipfilerugged.py @@ -394,6 +394,19 @@ def _decodeExtra(self): extra = extra[ln+4:] +class ZeroedZipInfo(ZipInfo): + def __init__(self, zinfo): + for k in self.__slots__: + if hasattr(zinfo, k): + setattr(self, k, getattr(zinfo, k)) + + def __getattribute__(self, name): + if name == "external_attr": + return 0 + return object.__getattribute__(self, name) + + + class _ZipDecrypter: """Class to handle decryption of files stored within a ZIP archive. diff --git a/DeDRM_plugin/zipfix.py b/DeDRM_plugin/zipfix.py index 3fbfbcea..9cb4ff15 100644 --- a/DeDRM_plugin/zipfix.py +++ b/DeDRM_plugin/zipfix.py @@ -26,6 +26,7 @@ import zlib import zipfilerugged +from zipfilerugged import ZipInfo, ZeroedZipInfo import getopt from struct import unpack @@ -36,12 +37,6 @@ _MAX_SIZE = 64 * 1024 _MIMETYPE = 'application/epub+zip' -class ZipInfo(zipfilerugged.ZipInfo): - def __init__(self, *args, **kwargs): - if 'compress_type' in kwargs: - compress_type = kwargs.pop('compress_type') - super(ZipInfo, self).__init__(*args, **kwargs) - self.compress_type = compress_type class fixZip: def __init__(self, zinput, zoutput): @@ -117,7 +112,8 @@ def fix(self): # if epub write mimetype file first, with no compression if self.ztype == 'epub': # first get a ZipInfo with current time and no compression - mimeinfo = ZipInfo(b'mimetype',compress_type=zipfilerugged.ZIP_STORED) + mimeinfo = ZipInfo(b'mimetype') + mimeinfo.compress_type = zipfilerugged.ZIP_STORED mimeinfo.internal_attr = 1 # text file try: # if the mimetype is present, get its info, including time-stamp @@ -129,8 +125,16 @@ def fix(self): mimeinfo.internal_attr = oldmimeinfo.internal_attr mimeinfo.external_attr = oldmimeinfo.external_attr mimeinfo.create_system = oldmimeinfo.create_system + mimeinfo.create_version = oldmimeinfo.create_version + mimeinfo.volume = oldmimeinfo.volume except: pass + + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if mimeinfo.external_attr == 0: + mimeinfo = ZeroedZipInfo(mimeinfo) + self.outzip.writestr(mimeinfo, _MIMETYPE.encode('ascii')) # write the rest of the files @@ -145,13 +149,23 @@ def fix(self): zinfo.filename = local_name # create new ZipInfo with only the useful attributes from the old info - nzinfo = ZipInfo(zinfo.filename, zinfo.date_time, compress_type=zinfo.compress_type) + nzinfo = ZipInfo(zinfo.filename) + nzinfo.date_time = zinfo.date_time + nzinfo.compress_type = zinfo.compress_type nzinfo.comment=zinfo.comment nzinfo.extra=zinfo.extra nzinfo.internal_attr=zinfo.internal_attr nzinfo.external_attr=zinfo.external_attr nzinfo.create_system=zinfo.create_system + nzinfo.create_version = zinfo.create_version + nzinfo.volume = zinfo.volume nzinfo.flag_bits = zinfo.flag_bits & 0x800 # preserve UTF-8 flag + + # Python 3 has a bug where the external_attr is reset to `0o600 << 16` + # if it's NULL, so we need a workaround: + if nzinfo.external_attr == 0: + nzinfo = ZeroedZipInfo(nzinfo) + self.outzip.writestr(nzinfo,data) self.bzf.close() From 41df9ecda04083905364dedf033b1bc8df9573b6 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 15:29:05 +0200 Subject: [PATCH 093/154] Fix PDF corruption in Calibre 4 (#104) --- CHANGELOG.md | 1 + DeDRM_plugin/ineptpdf.py | 38 +++++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 783ce756..5a3197eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,3 +73,4 @@ List of changes since the fork of Apprentice Harper's repository: - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). - Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). - Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer. +- Fix PDF decryption issues on Calibre 4 (hopefully fixes #104). \ No newline at end of file diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 7a147505..7e6cd81b 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -51,13 +51,14 @@ # 9.1.1 - Only support PyCryptodome; clean up the code # 10.0.0 - Add support for "hardened" Adobe DRM (RMSDK >= 10) # 10.0.2 - Fix some Python2 stuff +# 10.0.4 - Fix more Python2 stuff """ Decrypts Adobe ADEPT-encrypted PDF files. """ __license__ = 'GPL v3' -__version__ = "10.0.2" +__version__ = "10.0.4" import codecs import hashlib @@ -200,7 +201,10 @@ def nunpack(s, default=0): elif l == 2: return struct.unpack('>H', s)[0] elif l == 3: - return struct.unpack('>L', bytes([0]) + s)[0] + if sys.version_info[0] == 2: + return struct.unpack('>L', '\x00'+s)[0] + else: + return struct.unpack('>L', bytes([0]) + s)[0] elif l == 4: return struct.unpack('>L', s)[0] else: @@ -459,7 +463,10 @@ def parse_literal_hex(self, s, i): self.hex += c return (self.parse_literal_hex, i+1) if self.hex: - self.token += bytes([int(self.hex, 16)]) + if sys.version_info[0] == 2: + self.token += chr(int(self.hex, 16)) + else: + self.token += bytes([int(self.hex, 16)]) return (self.parse_literal, i) def parse_number(self, s, i): @@ -543,10 +550,18 @@ def parse_string_1(self, s, i): self.oct += c return (self.parse_string_1, i+1) if self.oct: - self.token += bytes([int(self.oct, 8)]) + if sys.version_info[0] == 2: + self.token += chr(int(self.oct, 8)) + else: + self.token += bytes([int(self.oct, 8)]) return (self.parse_string, i) if c in ESC_STRING: - self.token += bytes([ESC_STRING[c]]) + + if sys.version_info[0] == 2: + self.token += chr(ESC_STRING[c]) + else: + self.token += bytes([ESC_STRING[c]]) + return (self.parse_string, i+1) def parse_wopen(self, s, i): @@ -572,14 +587,19 @@ def parse_wclose(self, s, i): return (self.parse_main, i) def parse_hexstring(self, s, i): - m1 = END_HEX_STRING.search(s, i) - if not m1: + m = END_HEX_STRING.search(s, i) + if not m: self.token += s[i:] return (self.parse_hexstring, len(s)) - j = m1.start(0) + j = m.start(0) self.token += s[i:j] - token = HEX_PAIR.sub(lambda m2: bytes([int(m2.group(0), 16)]), + if sys.version_info[0] == 2: + token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)), + SPC.sub('', self.token)) + else: + token = HEX_PAIR.sub(lambda m: bytes([int(m.group(0), 16)]), SPC.sub(b'', self.token)) + self.add_token(token) return (self.parse_main, j) From 1cc5d383ccd60269cc2296b7ecd94e5fbf85e3f3 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 19:56:18 +0200 Subject: [PATCH 094/154] Delete unused files --- DeDRM_plugin/_unused_activitybar.py | 77 ------- DeDRM_plugin/_unused_scrolltextwidget.py | 30 --- DeDRM_plugin/askfolder_ed.py | 213 ------------------ DeDRM_plugin/ignoblekeyfetch.py | 265 ----------------------- DeDRM_plugin/simpleprefs.py | 81 ------- 5 files changed, 666 deletions(-) delete mode 100644 DeDRM_plugin/_unused_activitybar.py delete mode 100644 DeDRM_plugin/_unused_scrolltextwidget.py delete mode 100644 DeDRM_plugin/askfolder_ed.py delete mode 100644 DeDRM_plugin/ignoblekeyfetch.py delete mode 100644 DeDRM_plugin/simpleprefs.py diff --git a/DeDRM_plugin/_unused_activitybar.py b/DeDRM_plugin/_unused_activitybar.py deleted file mode 100644 index 8ebc10c8..00000000 --- a/DeDRM_plugin/_unused_activitybar.py +++ /dev/null @@ -1,77 +0,0 @@ -# I think this file is unused? - -import sys -import tkinter -import tkinter.constants - -class ActivityBar(tkinter.Frame): - - def __init__(self, master, length=300, height=20, barwidth=15, interval=50, bg='white', fillcolor='orchid1',\ - bd=2, relief=tkinter.constants.GROOVE, *args, **kw): - tkinter.Frame.__init__(self, master, bg=bg, width=length, height=height, *args, **kw) - self._master = master - self._interval = interval - self._maximum = length - self._startx = 0 - self._barwidth = barwidth - self._bardiv = length / barwidth - if self._bardiv < 10: - self._bardiv = 10 - stopx = self._startx + self._barwidth - if stopx > self._maximum: - stopx = self._maximum - # self._canv = Tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\ - # highlightthickness=0, relief='flat', bd=0) - self._canv = tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\ - highlightthickness=0, relief=relief, bd=bd) - self._canv.pack(fill='both', expand=1) - self._rect = self._canv.create_rectangle(0, 0, self._canv.winfo_reqwidth(), self._canv.winfo_reqheight(), fill=fillcolor, width=0) - - self._set() - self.bind('', self._update_coords) - self._running = False - - def _update_coords(self, event): - '''Updates the position of the rectangle inside the canvas when the size of - the widget gets changed.''' - # looks like we have to call update_idletasks() twice to make sure - # to get the results we expect - self._canv.update_idletasks() - self._maximum = self._canv.winfo_width() - self._startx = 0 - self._barwidth = self._maximum / self._bardiv - if self._barwidth < 2: - self._barwidth = 2 - stopx = self._startx + self._barwidth - if stopx > self._maximum: - stopx = self._maximum - self._canv.coords(self._rect, 0, 0, stopx, self._canv.winfo_height()) - self._canv.update_idletasks() - - def _set(self): - if self._startx < 0: - self._startx = 0 - if self._startx > self._maximum: - self._startx = self._startx % self._maximum - stopx = self._startx + self._barwidth - if stopx > self._maximum: - stopx = self._maximum - self._canv.coords(self._rect, self._startx, 0, stopx, self._canv.winfo_height()) - self._canv.update_idletasks() - - def start(self): - self._running = True - self.after(self._interval, self._step) - - def stop(self): - self._running = False - self._set() - - def _step(self): - if self._running: - stepsize = self._barwidth / 4 - if stepsize < 2: - stepsize = 2 - self._startx += stepsize - self._set() - self.after(self._interval, self._step) diff --git a/DeDRM_plugin/_unused_scrolltextwidget.py b/DeDRM_plugin/_unused_scrolltextwidget.py deleted file mode 100644 index 5969ea1b..00000000 --- a/DeDRM_plugin/_unused_scrolltextwidget.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - -# I think this file is unused? - - -import tkinter -import tkinter.constants - -# basic scrolled text widget -class ScrolledText(tkinter.Text): - def __init__(self, master=None, **kw): - self.frame = tkinter.Frame(master) - self.vbar = tkinter.Scrollbar(self.frame) - self.vbar.pack(side=tkinter.constants.RIGHT, fill=tkinter.constants.Y) - kw.update({'yscrollcommand': self.vbar.set}) - tkinter.Text.__init__(self, self.frame, **kw) - self.pack(side=tkinter.constants.LEFT, fill=tkinter.constants.BOTH, expand=True) - self.vbar['command'] = self.yview - # Copy geometry methods of self.frame without overriding Text - # methods = hack! - text_meths = list(vars(tkinter.Text).keys()) - methods = list(vars(tkinter.Pack).keys()) + list(vars(tkinter.Grid).keys()) + list(vars(tkinter.Place).keys()) - methods = set(methods).difference(text_meths) - for m in methods: - if m[0] != '_' and m != 'config' and m != 'configure': - setattr(self, m, getattr(self.frame, m)) - - def __str__(self): - return str(self.frame) diff --git a/DeDRM_plugin/askfolder_ed.py b/DeDRM_plugin/askfolder_ed.py deleted file mode 100644 index 8c586fef..00000000 --- a/DeDRM_plugin/askfolder_ed.py +++ /dev/null @@ -1,213 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - -# to work around tk_chooseDirectory not properly returning unicode paths on Windows -# need to use a dialog that can be hacked up to actually return full unicode paths -# originally based on AskFolder from EasyDialogs for Windows but modified to fix it -# to actually use unicode for path - -# The original license for EasyDialogs is as follows -# -# Copyright (c) 2003-2005 Jimmy Retzlaff -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the "Software"), -# to deal in the Software without restriction, including without limitation -# the rights to use, copy, modify, merge, publish, distribute, sublicense, -# and/or sell copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -# DEALINGS IN THE SOFTWARE. - -# Adjusted for Python 3, September 2020 - -""" -AskFolder(...) -- Ask the user to select a folder Windows specific -""" - -import os - -import ctypes -from ctypes import POINTER, byref, cdll, c_int, windll -from ctypes.wintypes import LPCWSTR, LPWSTR -import ctypes.wintypes as wintypes - - -__all__ = ['AskFolder'] - -# Load required Windows DLLs -ole32 = ctypes.windll.ole32 -shell32 = ctypes.windll.shell32 -user32 = ctypes.windll.user32 - - -# Windows Constants -BFFM_INITIALIZED = 1 -BFFM_SETOKTEXT = 1129 -BFFM_SETSELECTIONA = 1126 -BFFM_SETSELECTIONW = 1127 -BIF_EDITBOX = 16 -BS_DEFPUSHBUTTON = 1 -CB_ADDSTRING = 323 -CB_GETCURSEL = 327 -CB_SETCURSEL = 334 -CDM_SETCONTROLTEXT = 1128 -EM_GETLINECOUNT = 186 -EM_GETMARGINS = 212 -EM_POSFROMCHAR = 214 -EM_SETSEL = 177 -GWL_STYLE = -16 -IDC_STATIC = -1 -IDCANCEL = 2 -IDNO = 7 -IDOK = 1 -IDYES = 6 -MAX_PATH = 260 -OFN_ALLOWMULTISELECT = 512 -OFN_ENABLEHOOK = 32 -OFN_ENABLESIZING = 8388608 -OFN_ENABLETEMPLATEHANDLE = 128 -OFN_EXPLORER = 524288 -OFN_OVERWRITEPROMPT = 2 -OPENFILENAME_SIZE_VERSION_400 = 76 -PBM_GETPOS = 1032 -PBM_SETMARQUEE = 1034 -PBM_SETPOS = 1026 -PBM_SETRANGE = 1025 -PBM_SETRANGE32 = 1030 -PBS_MARQUEE = 8 -PM_REMOVE = 1 -SW_HIDE = 0 -SW_SHOW = 5 -SW_SHOWNORMAL = 1 -SWP_NOACTIVATE = 16 -SWP_NOMOVE = 2 -SWP_NOSIZE = 1 -SWP_NOZORDER = 4 -VER_PLATFORM_WIN32_NT = 2 -WM_COMMAND = 273 -WM_GETTEXT = 13 -WM_GETTEXTLENGTH = 14 -WM_INITDIALOG = 272 -WM_NOTIFY = 78 - -# Windows function prototypes -BrowseCallbackProc = ctypes.WINFUNCTYPE(ctypes.c_int, wintypes.HWND, ctypes.c_uint, wintypes.LPARAM, wintypes.LPARAM) - -# Windows types -LPCTSTR = ctypes.c_char_p -LPTSTR = ctypes.c_char_p -LPVOID = ctypes.c_voidp -TCHAR = ctypes.c_char - -class BROWSEINFO(ctypes.Structure): - _fields_ = [ - ("hwndOwner", wintypes.HWND), - ("pidlRoot", LPVOID), - ("pszDisplayName", LPTSTR), - ("lpszTitle", LPCTSTR), - ("ulFlags", ctypes.c_uint), - ("lpfn", BrowseCallbackProc), - ("lParam", wintypes.LPARAM), - ("iImage", ctypes.c_int) - ] - - -# Utilities -def CenterWindow(hwnd): - desktopRect = GetWindowRect(user32.GetDesktopWindow()) - myRect = GetWindowRect(hwnd) - x = width(desktopRect) // 2 - width(myRect) // 2 - y = height(desktopRect) // 2 - height(myRect) // 2 - user32.SetWindowPos(hwnd, 0, - desktopRect.left + x, - desktopRect.top + y, - 0, 0, - SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER - ) - - -def GetWindowRect(hwnd): - rect = wintypes.RECT() - user32.GetWindowRect(hwnd, ctypes.byref(rect)) - return rect - -def width(rect): - return rect.right-rect.left - -def height(rect): - return rect.bottom-rect.top - - -def AskFolder( - message=None, - version=None, - defaultLocation=None, - location=None, - windowTitle=None, - actionButtonLabel=None, - cancelButtonLabel=None, - multiple=None): - """Display a dialog asking the user for select a folder. - modified to use unicode strings as much as possible - returns unicode path - """ - - def BrowseCallback(hwnd, uMsg, lParam, lpData): - if uMsg == BFFM_INITIALIZED: - if actionButtonLabel: - label = str(actionButtonLabel, errors='replace') - user32.SendMessageW(hwnd, BFFM_SETOKTEXT, 0, label) - if cancelButtonLabel: - label = str(cancelButtonLabel, errors='replace') - cancelButton = user32.GetDlgItem(hwnd, IDCANCEL) - if cancelButton: - user32.SetWindowTextW(cancelButton, label) - if windowTitle: - title = str(windowTitle, errors='replace') - user32.SetWindowTextW(hwnd, title) - if defaultLocation: - user32.SendMessageW(hwnd, BFFM_SETSELECTIONW, 1, defaultLocation.replace('/', '\\')) - if location: - x, y = location - desktopRect = wintypes.RECT() - user32.GetWindowRect(0, ctypes.byref(desktopRect)) - user32.SetWindowPos(hwnd, 0, - desktopRect.left + x, - desktopRect.top + y, 0, 0, - SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER) - else: - CenterWindow(hwnd) - return 0 - - # This next line is needed to prevent gc of the callback - callback = BrowseCallbackProc(BrowseCallback) - - browseInfo = BROWSEINFO() - browseInfo.pszDisplayName = ctypes.c_char_p('\0' * (MAX_PATH+1)) - browseInfo.lpszTitle = message - browseInfo.lpfn = callback - - pidl = shell32.SHBrowseForFolder(ctypes.byref(browseInfo)) - if not pidl: - result = None - else: - path = LPCWSTR(" " * (MAX_PATH+1)) - shell32.SHGetPathFromIDListW(pidl, path) - ole32.CoTaskMemFree(pidl) - result = path.value - return result - - - - diff --git a/DeDRM_plugin/ignoblekeyfetch.py b/DeDRM_plugin/ignoblekeyfetch.py deleted file mode 100644 index 278879b1..00000000 --- a/DeDRM_plugin/ignoblekeyfetch.py +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# ignoblekeyfetch.py -# Copyright © 2015-2020 Apprentice Harper et al. - -# Released under the terms of the GNU General Public Licence, version 3 -# - -# Based on discoveries by "Nobody You Know" -# Code partly based on ignoblekeygen.py by several people. - -# Windows users: Before running this program, you must first install Python. -# We recommend ActiveState Python 2.7.X for Windows from -# http://www.activestate.com/activepython/downloads. -# Then save this script file as ignoblekeyfetch.pyw and double-click on it to run it. -# -# Mac OS X users: Save this script file as ignoblekeyfetch.pyw. You can run this -# program from the command line (python ignoblekeyfetch.pyw) or by double-clicking -# it when it has been associated with PythonLauncher. - -# Revision history: -# 1.0 - Initial version -# 1.1 - Try second URL if first one fails -# 2.0 - Python 3 for calibre 5.0 - -""" -Fetch Barnes & Noble EPUB user key from B&N servers using email and password. - -NOTE: This script used to work in the past, but the server it uses is long gone. -It can no longer be used to download keys from B&N servers, it is no longer -supported by the Calibre plugin, and it will be removed in the future. - -""" - -__license__ = 'GPL v3' -__version__ = "2.0" - -import sys -import os - -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["ignoblekeyfetch.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - - -class IGNOBLEError(Exception): - pass - -def fetch_key(email, password): - # change email and password to utf-8 if unicode - if type(email)==str: - email = email.encode('utf-8') - if type(password)==str: - password = password.encode('utf-8') - - import random - random = "%030x" % random.randrange(16**30) - - import urllib.parse, urllib.request, re - - # try the URL from nook for PC - fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword=" - fetch_url += urllib.parse.quote(password,'')+"&devID=PC_BN_2.5.6.9575_"+random+"&emailAddress=" - fetch_url += urllib.parse.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB" - #print fetch_url - - found = '' - try: - response = urllib.request.urlopen(fetch_url) - the_page = response.read() - #print the_page - found = re.search('ccHash>(.+?)(.+?) ".format(progname)) - return 1 - email, password, keypath = argv[1:] - userkey = fetch_key(email, password) - if len(userkey) == 28: - open(keypath,'wb').write(userkey) - return 0 - print("Failed to fetch key.") - return 1 - - -def gui_main(): - try: - import tkinter - import tkinter.filedialog - import tkinter.constants - import tkinter.messagebox - import traceback - except: - return cli_main() - - class DecryptionDialog(tkinter.Frame): - def __init__(self, root): - tkinter.Frame.__init__(self, root, border=5) - self.status = tkinter.Label(self, text="Enter parameters") - self.status.pack(fill=tkinter.constants.X, expand=1) - body = tkinter.Frame(self) - body.pack(fill=tkinter.constants.X, expand=1) - sticky = tkinter.constants.E + tkinter.constants.W - body.grid_columnconfigure(1, weight=2) - tkinter.Label(body, text="Account email address").grid(row=0) - self.name = tkinter.Entry(body, width=40) - self.name.grid(row=0, column=1, sticky=sticky) - tkinter.Label(body, text="Account password").grid(row=1) - self.ccn = tkinter.Entry(body, width=40) - self.ccn.grid(row=1, column=1, sticky=sticky) - tkinter.Label(body, text="Output file").grid(row=2) - self.keypath = tkinter.Entry(body, width=40) - self.keypath.grid(row=2, column=1, sticky=sticky) - self.keypath.insert(2, "bnepubkey.b64") - button = tkinter.Button(body, text="...", command=self.get_keypath) - button.grid(row=2, column=2) - buttons = tkinter.Frame(self) - buttons.pack() - botton = tkinter.Button( - buttons, text="Fetch", width=10, command=self.generate) - botton.pack(side=tkinter.constants.LEFT) - tkinter.Frame(buttons, width=10).pack(side=tkinter.constants.LEFT) - button = tkinter.Button( - buttons, text="Quit", width=10, command=self.quit) - button.pack(side=tkinter.constants.RIGHT) - - def get_keypath(self): - keypath = tkinter.filedialog.asksaveasfilename( - parent=None, title="Select B&N ePub key file to produce", - defaultextension=".b64", - filetypes=[('base64-encoded files', '.b64'), - ('All Files', '.*')]) - if keypath: - keypath = os.path.normpath(keypath) - self.keypath.delete(0, tkinter.constants.END) - self.keypath.insert(0, keypath) - return - - def generate(self): - email = self.name.get() - password = self.ccn.get() - keypath = self.keypath.get() - if not email: - self.status['text'] = "Email address not given" - return - if not password: - self.status['text'] = "Account password not given" - return - if not keypath: - self.status['text'] = "Output keyfile path not set" - return - self.status['text'] = "Fetching..." - try: - userkey = fetch_key(email, password) - except Exception as e: - self.status['text'] = "Error: {0}".format(e.args[0]) - return - if len(userkey) == 28: - open(keypath,'wb').write(userkey) - self.status['text'] = "Keyfile fetched successfully" - else: - self.status['text'] = "Keyfile fetch failed." - - root = tkinter.Tk() - root.title("Barnes & Noble ePub Keyfile Fetch v.{0}".format(__version__)) - root.resizable(True, False) - root.minsize(300, 0) - DecryptionDialog(root).pack(fill=tkinter.constants.X, expand=1) - root.mainloop() - return 0 - -if __name__ == '__main__': - if len(sys.argv) > 1: - sys.exit(cli_main()) - sys.exit(gui_main()) diff --git a/DeDRM_plugin/simpleprefs.py b/DeDRM_plugin/simpleprefs.py deleted file mode 100644 index bf8c5d46..00000000 --- a/DeDRM_plugin/simpleprefs.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - -import sys -import os, os.path -import shutil - -class SimplePrefsError(Exception): - pass - -class SimplePrefs(object): - def __init__(self, target, description): - self.prefs = {} - self.key2file={} - self.file2key={} - for keyfilemap in description: - [key, filename] = keyfilemap - self.key2file[key] = filename - self.file2key[filename] = key - self.target = target + 'Prefs' - if sys.platform.startswith('win'): - try: - import winreg - except ImportError: - import _winreg as winreg - regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders\\") - path = winreg.QueryValueEx(regkey, 'Local AppData')[0] - prefdir = path + os.sep + self.target - elif sys.platform.startswith('darwin'): - home = os.getenv('HOME') - prefdir = os.path.join(home,'Library','Preferences','org.' + self.target) - else: - # linux and various flavors of unix - home = os.getenv('HOME') - prefdir = os.path.join(home,'.' + self.target) - if not os.path.exists(prefdir): - os.makedirs(prefdir) - self.prefdir = prefdir - self.prefs['dir'] = self.prefdir - self._loadPreferences() - - def _loadPreferences(self): - filenames = os.listdir(self.prefdir) - for filename in filenames: - if filename in self.file2key: - key = self.file2key[filename] - filepath = os.path.join(self.prefdir,filename) - if os.path.isfile(filepath): - try : - data = file(filepath,'rb').read() - self.prefs[key] = data - except Exception as e: - pass - - def getPreferences(self): - return self.prefs - - def setPreferences(self, newprefs={}): - if 'dir' not in newprefs: - raise SimplePrefsError('Error: Attempt to Set Preferences in unspecified directory') - if newprefs['dir'] != self.prefs['dir']: - raise SimplePrefsError('Error: Attempt to Set Preferences in unspecified directory') - for key in newprefs: - if key != 'dir': - if key in self.key2file: - filename = self.key2file[key] - filepath = os.path.join(self.prefdir,filename) - data = newprefs[key] - if data != None: - data = str(data) - if data == None or data == '': - if os.path.exists(filepath): - os.remove(filepath) - else: - try: - file(filepath,'wb').write(data) - except Exception as e: - pass - self.prefs = newprefs - return From b404605878391f56fc485bd0824c8c168a9c1a1a Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 19:57:20 +0200 Subject: [PATCH 095/154] Another Python2 Bugfix for Obok --- Obok_plugin/obok/obok.py | 13 ++++++++++--- Other_Tools/Kobo/obok.py | 14 +++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index a986965a..4de76446 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -224,10 +224,17 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,str): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.buffer.write(data) - self.stream.buffer.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) diff --git a/Other_Tools/Kobo/obok.py b/Other_Tools/Kobo/obok.py index ae088008..c26d4221 100644 --- a/Other_Tools/Kobo/obok.py +++ b/Other_Tools/Kobo/obok.py @@ -276,12 +276,20 @@ def __init__(self, stream): if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + class KoboLibrary(object): From de23b5c221d89a047807910edbc561992b1a88e3 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 20:09:30 +0200 Subject: [PATCH 096/154] Move SafeUnbuffered to own Python file --- DeDRM_plugin/__init__.py | 25 ++-------------------- DeDRM_plugin/convert2xml.py | 24 +-------------------- DeDRM_plugin/erdr2pml.py | 24 +-------------------- DeDRM_plugin/genbook.py | 24 +-------------------- DeDRM_plugin/ignoblekeyGenPassHash.py | 30 +-------------------------- DeDRM_plugin/ignoblekeyNookStudy.py | 27 ++---------------------- DeDRM_plugin/ineptepub.py | 30 +-------------------------- DeDRM_plugin/ineptpdf.py | 24 +-------------------- DeDRM_plugin/k4mobidedrm.py | 27 +----------------------- DeDRM_plugin/kindlekey.py | 24 +-------------------- DeDRM_plugin/kindlepid.py | 27 +----------------------- DeDRM_plugin/mobidedrm.py | 24 +-------------------- DeDRM_plugin/topazextract.py | 28 ++----------------------- DeDRM_plugin/utilities.py | 26 +++++++++++++++++++++++ 14 files changed, 42 insertions(+), 322 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index ba9e2ec2..eaf505a2 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -134,29 +134,8 @@ class FileTypePlugin: config_dir = "" -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get safely -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered + PLUGIN_NAME = __version.PLUGIN_NAME PLUGIN_VERSION = __version.PLUGIN_VERSION diff --git a/DeDRM_plugin/convert2xml.py b/DeDRM_plugin/convert2xml.py index fe33ecab..5cb9adb3 100644 --- a/DeDRM_plugin/convert2xml.py +++ b/DeDRM_plugin/convert2xml.py @@ -5,29 +5,7 @@ # For use with Topaz Scripts Version 2.6 # Python 3, September 2020 -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered import sys import csv diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 6a20fdb9..df25f86c 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -79,29 +79,7 @@ #@@CALIBRE_COMPAT_CODE@@ -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index 21186b8c..b0624fd9 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -4,29 +4,7 @@ # Python 3 for calibre 5.0 from __future__ import print_function -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered import sys import csv diff --git a/DeDRM_plugin/ignoblekeyGenPassHash.py b/DeDRM_plugin/ignoblekeyGenPassHash.py index e1cdba05..7d3bec70 100644 --- a/DeDRM_plugin/ignoblekeyGenPassHash.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -50,35 +50,7 @@ except ImportError: from Crypto.Cipher import AES -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') +from utilities import SafeUnbuffered def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index fd85660e..ba789347 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -27,35 +27,12 @@ import getopt import re -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered try: - from calibre.constants import iswindows, isosx + from calibre.constants import iswindows except: iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 094cb8c8..c4f8dd19 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -70,35 +70,7 @@ def unpad(data, padding=16): return data[:-pad_len] -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') +from utilities import SafeUnbuffered def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 7e6cd81b..64e21f88 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -93,29 +93,7 @@ def unpad(data, padding=16): return data[:-pad_len] -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index 3ddb9e8a..bbd229ec 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -88,32 +88,7 @@ class DrmException(Exception): import androidkindlekey import kfxdedrm -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -iswindows = sys.platform.startswith('win') -isosx = sys.platform.startswith('darwin') +from utilities import SafeUnbuffered def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 0ce800d8..304a891e 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -62,29 +62,7 @@ class RegError(Exception): # Routines common to Mac and PC -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered try: from calibre.constants import iswindows, isosx diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index ba80e9b6..aea3509a 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -16,32 +16,7 @@ import sys import binascii -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -iswindows = sys.platform.startswith('win') -isosx = sys.platform.startswith('darwin') +from utilities import SafeUnbuffered def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 902edd15..fe761c4a 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -85,29 +85,7 @@ except: print("AlfCrypto not found. Using python PC1 implementation.") -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) +from utilities import SafeUnbuffered iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index f65d25ac..3455cf3f 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -23,33 +23,9 @@ from struct import unpack from alfcrypto import Topaz_Cipher +from utilities import SafeUnbuffered -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -iswindows = sys.platform.startswith('win') -isosx = sys.platform.startswith('darwin') +from argv_utils import unicode_argv def unicode_argv(): if iswindows: diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index cd08a665..5537349d 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -45,3 +45,29 @@ def parseCustString(keystuff): except: pass return userkeys + + +# Wrap a stream so that output gets flushed immediately +# and also make sure that any unicode strings get safely +# encoded using "replace" before writing them. +class SafeUnbuffered: + def __init__(self, stream): + self.stream = stream + self.encoding = stream.encoding + if self.encoding == None: + self.encoding = "utf-8" + def write(self, data): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 + data = data.encode(self.encoding,"replace") + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise + def __getattr__(self, attr): + return getattr(self.stream, attr) + \ No newline at end of file From 9276d77f6328866394fcbc568b843c4d2cdd3065 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 20:10:51 +0200 Subject: [PATCH 097/154] Couple Python 2 fixes in (unsupported) standalone scripts --- .../Adobe_Digital_Editions/adobekey.pyw | 14 ++++++-- .../Barnes_and_Noble_ePubs/ignoblekey.pyw | 14 ++++++-- .../ignoblekeyfetch.pyw | 14 ++++++-- .../Barnes_and_Noble_ePubs/ignoblekeygen.pyw | 14 ++++++-- .../Kindle_for_Android/androidkindlekey.pyw | 14 ++++++-- .../Kindle_for_Mac_and_PC/kindlekey.pyw | 35 ++++++++++++------- .../Kindle_for_iOS/kindleiospidgen.pyw | 14 ++++++-- 7 files changed, 88 insertions(+), 31 deletions(-) diff --git a/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw b/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw index cbc30389..8e9061ec 100644 --- a/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Adobe_Digital_Editions/adobekey.pyw @@ -68,12 +68,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx diff --git a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw index f6a93ebf..b6ddb2c1 100644 --- a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekey.pyw @@ -39,12 +39,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx diff --git a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeyfetch.pyw b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeyfetch.pyw index e9637a17..3bed9795 100644 --- a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeyfetch.pyw +++ b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeyfetch.pyw @@ -45,12 +45,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx diff --git a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeygen.pyw b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeygen.pyw index d2917c75..8d3ea1a2 100644 --- a/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeygen.pyw +++ b/Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeygen.pyw @@ -56,12 +56,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx diff --git a/Other_Tools/DRM_Key_Scripts/Kindle_for_Android/androidkindlekey.pyw b/Other_Tools/DRM_Key_Scripts/Kindle_for_Android/androidkindlekey.pyw index ff8d1ee5..1d8cc89e 100644 --- a/Other_Tools/DRM_Key_Scripts/Kindle_for_Android/androidkindlekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Kindle_for_Android/androidkindlekey.pyw @@ -48,12 +48,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx diff --git a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw index 99b8d227..a463f1f4 100644 --- a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw @@ -51,12 +51,20 @@ class SafeUnbuffered: if self.encoding == None: self.encoding = "utf-8" def write(self, data): - if isinstance(data,unicode): + if isinstance(data,str) or isinstance(data,unicode): + # str for Python3, unicode for Python2 data = data.encode(self.encoding,"replace") - self.stream.write(data) - self.stream.flush() + try: + buffer = getattr(self.stream, 'buffer', self.stream) + # self.stream.buffer for Python3, self.stream for Python2 + buffer.write(data) + buffer.flush() + except: + # We can do nothing if a write fails + raise def __getattr__(self, attr): return getattr(self.stream, attr) + try: from calibre.constants import iswindows, isosx @@ -292,7 +300,7 @@ if iswindows: numBlocks, numExtraBytes = divmod(len(self.bytesToDecrypt), self.blockSize) if more == None: # no more calls to decrypt, should have all the data if numExtraBytes != 0: - raise DecryptNotBlockAlignedError, 'Data not block aligned on decrypt' + raise DecryptNotBlockAlignedError('Data not block aligned on decrypt') # hold back some bytes in case last decrypt has zero len if (more != None) and (numExtraBytes == 0) and (numBlocks >0) : @@ -334,7 +342,7 @@ if iswindows: def removePad(self, paddedBinaryString, blockSize): """ Remove padding from a binary string """ if not(0 Date: Sat, 6 Aug 2022 20:13:19 +0200 Subject: [PATCH 098/154] Remove AlfCrypto libraries and perform everything in Python The old AlfCrypto DLL, SO and DYLIB files are ancient, I don't have the systems to recompile them all, they cause issues on ARM Macs, and I doubt with all the Python improvements over the last years that they have a significant performance advantage. And even if that's the case, nobody is importing hundreds of DRM books at the same time so it shouldn't hurt if some decryptions might take a bit longer. --- DeDRM_plugin/__init__.py | 13 +- DeDRM_plugin/alfcrypto.dll | Bin 70144 -> 0 bytes DeDRM_plugin/alfcrypto.py | 330 ++++++++------------------------ DeDRM_plugin/alfcrypto64.dll | Bin 52224 -> 0 bytes DeDRM_plugin/alfcrypto_src.zip | Bin 17393 -> 0 bytes DeDRM_plugin/libalfcrypto.dylib | Bin 87160 -> 0 bytes DeDRM_plugin/libalfcrypto32.so | Bin 23859 -> 0 bytes DeDRM_plugin/libalfcrypto64.so | Bin 33417 -> 0 bytes DeDRM_plugin/mobidedrm.py | 49 +---- DeDRM_plugin/subasyncio.py | 148 -------------- 10 files changed, 89 insertions(+), 451 deletions(-) delete mode 100644 DeDRM_plugin/alfcrypto.dll delete mode 100644 DeDRM_plugin/alfcrypto64.dll delete mode 100644 DeDRM_plugin/alfcrypto_src.zip delete mode 100644 DeDRM_plugin/libalfcrypto.dylib delete mode 100644 DeDRM_plugin/libalfcrypto32.so delete mode 100644 DeDRM_plugin/libalfcrypto64.so delete mode 100644 DeDRM_plugin/subasyncio.py diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index eaf505a2..913d05e3 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -187,15 +187,12 @@ def initialize(self): os.mkdir(self.alfdir) # only continue if we've never run this version of the plugin before self.verdir = os.path.join(self.maindir,PLUGIN_VERSION) - if not os.path.exists(self.verdir): - if iswindows: - names = ["alfcrypto.dll","alfcrypto64.dll"] - elif isosx: - names = ["libalfcrypto.dylib"] - else: - names = ["libalfcrypto32.so","libalfcrypto64.so","kindlekey.py","adobekey.py","subasyncio.py"] + if not os.path.exists(self.verdir) and not iswindows and not isosx: + + names = ["kindlekey.py","adobekey.py","ignoblekeyNookStudy.py"] + lib_dict = self.load_resources(names) - print("{0} v{1}: Copying needed library files from plugin's zip".format(PLUGIN_NAME, PLUGIN_VERSION)) + print("{0} v{1}: Copying needed Python scripts from plugin's zip".format(PLUGIN_NAME, PLUGIN_VERSION)) for entry, data in lib_dict.items(): file_path = os.path.join(self.alfdir, entry) diff --git a/DeDRM_plugin/alfcrypto.dll b/DeDRM_plugin/alfcrypto.dll deleted file mode 100644 index 26d740ddb0ed3be82128b3fbe0e45471b0e04f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70144 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 G!2bbGSZYrI diff --git a/DeDRM_plugin/alfcrypto.py b/DeDRM_plugin/alfcrypto.py index 5a31d095..ecb79166 100644 --- a/DeDRM_plugin/alfcrypto.py +++ b/DeDRM_plugin/alfcrypto.py @@ -8,260 +8,90 @@ # pbkdf2.py Copyright © 2009 Daniel Holth # pbkdf2.py This code may be freely used and modified for any purpose. -import sys, os import hmac from struct import pack import hashlib - -# interface to needed routines libalfcrypto -def _load_libalfcrypto(): - import ctypes - from ctypes import CDLL, byref, POINTER, c_void_p, c_char_p, c_int, c_long, \ - Structure, c_ulong, create_string_buffer, addressof, string_at, cast, sizeof - - pointer_size = ctypes.sizeof(ctypes.c_voidp) - name_of_lib = None - if sys.platform.startswith('darwin'): - name_of_lib = 'libalfcrypto.dylib' - elif sys.platform.startswith('win'): - if pointer_size == 4: - name_of_lib = 'alfcrypto.dll' - else: - name_of_lib = 'alfcrypto64.dll' - else: - if pointer_size == 4: - name_of_lib = 'libalfcrypto32.so' - else: - name_of_lib = 'libalfcrypto64.so' - - # hard code to local location for libalfcrypto - libalfcrypto = os.path.join(sys.path[0],name_of_lib) - if not os.path.isfile(libalfcrypto): - libalfcrypto = os.path.join(sys.path[0], 'lib', name_of_lib) - if not os.path.isfile(libalfcrypto): - libalfcrypto = os.path.join('.',name_of_lib) - if not os.path.isfile(libalfcrypto): - raise Exception('libalfcrypto not found at %s' % libalfcrypto) - - libalfcrypto = CDLL(libalfcrypto) - - c_char_pp = POINTER(c_char_p) - c_int_p = POINTER(c_int) - - - def F(restype, name, argtypes): - func = getattr(libalfcrypto, name) - func.restype = restype - func.argtypes = argtypes - return func - - # aes cbc decryption - # - # struct aes_key_st { - # unsigned long rd_key[4 *(AES_MAXNR + 1)]; - # int rounds; - # }; - # - # typedef struct aes_key_st AES_KEY; - # - # int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); - # - # - # void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, - # const unsigned long length, const AES_KEY *key, - # unsigned char *ivec, const int enc); - - AES_MAXNR = 14 - - class AES_KEY(Structure): - _fields_ = [('rd_key', c_long * (4 * (AES_MAXNR + 1))), ('rounds', c_int)] - - AES_KEY_p = POINTER(AES_KEY) - AES_cbc_encrypt = F(None, 'AES_cbc_encrypt',[c_char_p, c_char_p, c_ulong, AES_KEY_p, c_char_p, c_int]) - AES_set_decrypt_key = F(c_int, 'AES_set_decrypt_key',[c_char_p, c_int, AES_KEY_p]) - - - - # Pukall 1 Cipher - # unsigned char *PC1(const unsigned char *key, unsigned int klen, const unsigned char *src, - # unsigned char *dest, unsigned int len, int decryption); - - PC1 = F(c_char_p, 'PC1', [c_char_p, c_ulong, c_char_p, c_char_p, c_ulong, c_ulong]) - - # Topaz Encryption - # typedef struct _TpzCtx { - # unsigned int v[2]; - # } TpzCtx; - # - # void topazCryptoInit(TpzCtx *ctx, const unsigned char *key, int klen); - # void topazCryptoDecrypt(const TpzCtx *ctx, const unsigned char *in, unsigned char *out, int len); - - class TPZ_CTX(Structure): - _fields_ = [('v', c_long * 2)] - - TPZ_CTX_p = POINTER(TPZ_CTX) - topazCryptoInit = F(None, 'topazCryptoInit', [TPZ_CTX_p, c_char_p, c_ulong]) - topazCryptoDecrypt = F(None, 'topazCryptoDecrypt', [TPZ_CTX_p, c_char_p, c_char_p, c_ulong]) - - - class AES_CBC(object): - def __init__(self): - self._blocksize = 0 - self._keyctx = None - self._iv = 0 - - def set_decrypt_key(self, userkey, iv): - self._blocksize = len(userkey) - if (self._blocksize != 16) and (self._blocksize != 24) and (self._blocksize != 32) : - raise Exception('AES CBC improper key used') - return - keyctx = self._keyctx = AES_KEY() - self._iv = iv - rv = AES_set_decrypt_key(userkey, len(userkey) * 8, keyctx) - if rv < 0: - raise Exception('Failed to initialize AES CBC key') - - def decrypt(self, data): - out = create_string_buffer(len(data)) - mutable_iv = create_string_buffer(self._iv, len(self._iv)) - rv = AES_cbc_encrypt(data, out, len(data), self._keyctx, mutable_iv, 0) - if rv == 0: - raise Exception('AES CBC decryption failed') - return out.raw - - class Pukall_Cipher(object): - def __init__(self): - self.key = None - - def PC1(self, key, src, decryption=True): - self.key = key - out = create_string_buffer(len(src)) - de = 0 +import aescbc + +class Pukall_Cipher(object): + def __init__(self): + self.key = None + + def PC1(self, key, src, decryption=True): + sum1 = 0; + sum2 = 0; + keyXorVal = 0; + if len(key)!=16: + raise Exception("PC1: Bad key length") + wkey = [] + for i in range(8): + wkey.append(key[i*2]<<8 | key[i*2+1]) + dst = bytearray(len(src)) + for i in range(len(src)): + temp1 = 0; + byteXorVal = 0; + for j in range(8): + temp1 ^= wkey[j] + sum2 = (sum2+j)*20021 + sum1 + sum1 = (temp1*346)&0xFFFF + sum2 = (sum2+sum1)&0xFFFF + temp1 = (temp1*20021+1)&0xFFFF + byteXorVal ^= temp1 ^ sum2 + curByte = src[i] + if not decryption: + keyXorVal = curByte * 257; + curByte = ((curByte ^ (byteXorVal >> 8)) ^ byteXorVal) & 0xFF if decryption: - de = 1 - rv = PC1(key, len(key), src, out, len(src), de) - return out.raw - - class Topaz_Cipher(object): - def __init__(self): - self._ctx = None - - def ctx_init(self, key): - tpz_ctx = self._ctx = TPZ_CTX() - topazCryptoInit(tpz_ctx, key, len(key)) - return tpz_ctx - - def decrypt(self, data, ctx=None): - if ctx == None: - ctx = self._ctx - out = create_string_buffer(len(data)) - topazCryptoDecrypt(ctx, data, out, len(data)) - return out.raw - - print("Using Library AlfCrypto DLL/DYLIB/SO") - return (AES_CBC, Pukall_Cipher, Topaz_Cipher) - - -def _load_python_alfcrypto(): - - import aescbc - - class Pukall_Cipher(object): - def __init__(self): - self.key = None - - def PC1(self, key, src, decryption=True): - sum1 = 0; - sum2 = 0; - keyXorVal = 0; - if len(key)!=16: - raise Exception('Pukall_Cipher: Bad key length.') - wkey = [] - for i in range(8): - wkey.append(ord(key[i*2])<<8 | ord(key[i*2+1])) - dst = "" - for i in range(len(src)): - temp1 = 0; - byteXorVal = 0; - for j in range(8): - temp1 ^= wkey[j] - sum2 = (sum2+j)*20021 + sum1 - sum1 = (temp1*346)&0xFFFF - sum2 = (sum2+sum1)&0xFFFF - temp1 = (temp1*20021+1)&0xFFFF - byteXorVal ^= temp1 ^ sum2 - curByte = ord(src[i]) - if not decryption: - keyXorVal = curByte * 257; - curByte = ((curByte ^ (byteXorVal >> 8)) ^ byteXorVal) & 0xFF - if decryption: - keyXorVal = curByte * 257; - for j in range(8): - wkey[j] ^= keyXorVal; - dst+=chr(curByte) - return dst - - class Topaz_Cipher(object): - def __init__(self): - self._ctx = None - - def ctx_init(self, key): - ctx1 = 0x0CAFFE19E - if isinstance(key, str): - key = key.encode('latin-1') - for keyByte in key: - ctx2 = ctx1 - ctx1 = ((((ctx1 >>2) * (ctx1 >>7))&0xFFFFFFFF) ^ (keyByte * keyByte * 0x0F902007)& 0xFFFFFFFF ) - self._ctx = [ctx1, ctx2] - return [ctx1,ctx2] - - def decrypt(self, data, ctx=None): - if ctx == None: - ctx = self._ctx - ctx1 = ctx[0] - ctx2 = ctx[1] - plainText = "" - if isinstance(data, str): - data = data.encode('latin-1') - for dataByte in data: - m = (dataByte ^ ((ctx1 >> 3) &0xFF) ^ ((ctx2<<3) & 0xFF)) &0xFF - ctx2 = ctx1 - ctx1 = (((ctx1 >> 2) * (ctx1 >> 7)) &0xFFFFFFFF) ^((m * m * 0x0F902007) &0xFFFFFFFF) - plainText += chr(m) - return plainText - - class AES_CBC(object): - def __init__(self): - self._key = None - self._iv = None - self.aes = None - - def set_decrypt_key(self, userkey, iv): - self._key = userkey - self._iv = iv - self.aes = aescbc.AES_CBC(userkey, aescbc.noPadding(), len(userkey)) - - def decrypt(self, data): - iv = self._iv - cleartext = self.aes.decrypt(iv + data) - return cleartext - - print("Using Library AlfCrypto Python") - return (AES_CBC, Pukall_Cipher, Topaz_Cipher) - - -def _load_crypto(): - AES_CBC = Pukall_Cipher = Topaz_Cipher = None - cryptolist = (_load_libalfcrypto, _load_python_alfcrypto) - for loader in cryptolist: - try: - AES_CBC, Pukall_Cipher, Topaz_Cipher = loader() - break - except (ImportError, Exception): - pass - return AES_CBC, Pukall_Cipher, Topaz_Cipher - -AES_CBC, Pukall_Cipher, Topaz_Cipher = _load_crypto() + keyXorVal = curByte * 257; + for j in range(8): + wkey[j] ^= keyXorVal; + dst[i] = curByte + return bytes(dst) + +class Topaz_Cipher(object): + def __init__(self): + self._ctx = None + + def ctx_init(self, key): + ctx1 = 0x0CAFFE19E + if isinstance(key, str): + key = key.encode('latin-1') + for keyByte in key: + ctx2 = ctx1 + ctx1 = ((((ctx1 >>2) * (ctx1 >>7))&0xFFFFFFFF) ^ (keyByte * keyByte * 0x0F902007)& 0xFFFFFFFF ) + self._ctx = [ctx1, ctx2] + return [ctx1,ctx2] + + def decrypt(self, data, ctx=None): + if ctx == None: + ctx = self._ctx + ctx1 = ctx[0] + ctx2 = ctx[1] + plainText = "" + if isinstance(data, str): + data = data.encode('latin-1') + for dataByte in data: + m = (dataByte ^ ((ctx1 >> 3) &0xFF) ^ ((ctx2<<3) & 0xFF)) &0xFF + ctx2 = ctx1 + ctx1 = (((ctx1 >> 2) * (ctx1 >> 7)) &0xFFFFFFFF) ^((m * m * 0x0F902007) &0xFFFFFFFF) + plainText += chr(m) + return plainText + +class AES_CBC(object): + def __init__(self): + self._key = None + self._iv = None + self.aes = None + + def set_decrypt_key(self, userkey, iv): + self._key = userkey + self._iv = iv + self.aes = aescbc.AES_CBC(userkey, aescbc.noPadding(), len(userkey)) + + def decrypt(self, data): + iv = self._iv + cleartext = self.aes.decrypt(iv + data) + return cleartext class KeyIVGen(object): diff --git a/DeDRM_plugin/alfcrypto64.dll b/DeDRM_plugin/alfcrypto64.dll deleted file mode 100644 index 7bef68eac0d0a751b0c7090f5b5427a1d5ab1a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52224 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 NdK>>N@IQ70{vUg3cj*8C diff --git a/DeDRM_plugin/alfcrypto_src.zip b/DeDRM_plugin/alfcrypto_src.zip deleted file mode 100644 index 269810cfa24541f8be10050e7192fb6211a45a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17393 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 diff --git a/DeDRM_plugin/libalfcrypto32.so b/DeDRM_plugin/libalfcrypto32.so deleted file mode 100644 index 9a5a442617a2046fb9b7050d339b18bca8993e7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23859 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 diff --git a/DeDRM_plugin/libalfcrypto64.so b/DeDRM_plugin/libalfcrypto64.so deleted file mode 100644 index a08ac28930fdd54e0eb4e8973a398e5e951d3825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33417 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 Ko^Mvd(mwtG diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index fe761c4a..22cdb351 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -80,10 +80,7 @@ import os import struct import binascii -try: - from alfcrypto import Pukall_Cipher -except: - print("AlfCrypto not found. Using python PC1 implementation.") +from alfcrypto import Pukall_Cipher from utilities import SafeUnbuffered @@ -140,41 +137,8 @@ def PC1(key, src, decryption=True): # if we can get it from alfcrypto, use that try: return Pukall_Cipher().PC1(key,src,decryption) - except NameError: - pass - except TypeError: - pass - - # use slow python version, since Pukall_Cipher didn't load - sum1 = 0; - sum2 = 0; - keyXorVal = 0; - if len(key)!=16: - DrmException ("PC1: Bad key length") - wkey = [] - for i in range(8): - wkey.append(key[i*2]<<8 | key[i*2+1]) - dst = bytearray(len(src)) - for i in range(len(src)): - temp1 = 0; - byteXorVal = 0; - for j in range(8): - temp1 ^= wkey[j] - sum2 = (sum2+j)*20021 + sum1 - sum1 = (temp1*346)&0xFFFF - sum2 = (sum2+sum1)&0xFFFF - temp1 = (temp1*20021+1)&0xFFFF - byteXorVal ^= temp1 ^ sum2 - curByte = src[i] - if not decryption: - keyXorVal = curByte * 257; - curByte = ((curByte ^ (byteXorVal >> 8)) ^ byteXorVal) & 0xFF - if decryption: - keyXorVal = curByte * 257; - for j in range(8): - wkey[j] ^= keyXorVal; - dst[i] = curByte - return bytes(dst) + except: + raise # accepts unicode returns unicode def checksumPid(s): @@ -232,12 +196,7 @@ def cleanup(self): pass def __init__(self, infile): - print("MobiDeDrm v{0:s}.\nCopyright © 2008-2020 The Dark Reverser, Apprentice Harper et al.".format(__version__)) - - try: - from alfcrypto import Pukall_Cipher - except: - print("AlfCrypto not found. Using python PC1 implementation.") + print("MobiDeDrm v{0:s}.\nCopyright © 2008-2022 The Dark Reverser, Apprentice Harper et al.".format(__version__)) # initial sanity check on file self.data_file = open(infile, 'rb').read() diff --git a/DeDRM_plugin/subasyncio.py b/DeDRM_plugin/subasyncio.py deleted file mode 100644 index de084d30..00000000 --- a/DeDRM_plugin/subasyncio.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python -# vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab - -import os, sys -import signal -import threading -import subprocess -from subprocess import Popen, PIPE, STDOUT - -# **heavily** chopped up and modfied version of asyncproc.py -# to make it actually work on Windows as well as Mac/Linux -# For the original see: -# "http://www.lysator.liu.se/~bellman/download/" -# author is "Thomas Bellman " -# available under GPL version 3 or Later - -# create an asynchronous subprocess whose output can be collected in -# a non-blocking manner - -# What a mess! Have to use threads just to get non-blocking io -# in a cross-platform manner - -# luckily all thread use is hidden within this class - -class Process(object): - def __init__(self, *params, **kwparams): - if len(params) <= 3: - kwparams.setdefault('stdin', subprocess.PIPE) - if len(params) <= 4: - kwparams.setdefault('stdout', subprocess.PIPE) - if len(params) <= 5: - kwparams.setdefault('stderr', subprocess.PIPE) - self.__pending_input = [] - self.__collected_outdata = [] - self.__collected_errdata = [] - self.__exitstatus = None - self.__lock = threading.Lock() - self.__inputsem = threading.Semaphore(0) - self.__quit = False - - self.__process = subprocess.Popen(*params, **kwparams) - - if self.__process.stdin: - self.__stdin_thread = threading.Thread( - name="stdin-thread", - target=self.__feeder, args=(self.__pending_input, - self.__process.stdin)) - self.__stdin_thread.setDaemon(True) - self.__stdin_thread.start() - - if self.__process.stdout: - self.__stdout_thread = threading.Thread( - name="stdout-thread", - target=self.__reader, args=(self.__collected_outdata, - self.__process.stdout)) - self.__stdout_thread.setDaemon(True) - self.__stdout_thread.start() - - if self.__process.stderr: - self.__stderr_thread = threading.Thread( - name="stderr-thread", - target=self.__reader, args=(self.__collected_errdata, - self.__process.stderr)) - self.__stderr_thread.setDaemon(True) - self.__stderr_thread.start() - - def pid(self): - return self.__process.pid - - def kill(self, signal): - self.__process.send_signal(signal) - - # check on subprocess (pass in 'nowait') to act like poll - def wait(self, flag): - if flag.lower() == 'nowait': - rc = self.__process.poll() - else: - rc = self.__process.wait() - if rc != None: - if self.__process.stdin: - self.closeinput() - if self.__process.stdout: - self.__stdout_thread.join() - if self.__process.stderr: - self.__stderr_thread.join() - return self.__process.returncode - - def terminate(self): - if self.__process.stdin: - self.closeinput() - self.__process.terminate() - - # thread gets data from subprocess stdout - def __reader(self, collector, source): - while True: - data = os.read(source.fileno(), 65536) - self.__lock.acquire() - collector.append(data) - self.__lock.release() - if data == "": - source.close() - break - return - - # thread feeds data to subprocess stdin - def __feeder(self, pending, drain): - while True: - self.__inputsem.acquire() - self.__lock.acquire() - if not pending and self.__quit: - drain.close() - self.__lock.release() - break - data = pending.pop(0) - self.__lock.release() - drain.write(data) - - # non-blocking read of data from subprocess stdout - def read(self): - self.__lock.acquire() - outdata = "".join(self.__collected_outdata) - del self.__collected_outdata[:] - self.__lock.release() - return outdata - - # non-blocking read of data from subprocess stderr - def readerr(self): - self.__lock.acquire() - errdata = "".join(self.__collected_errdata) - del self.__collected_errdata[:] - self.__lock.release() - return errdata - - # non-blocking write to stdin of subprocess - def write(self, data): - if self.__process.stdin is None: - raise ValueError("Writing to process with stdin not a pipe") - self.__lock.acquire() - self.__pending_input.append(data) - self.__inputsem.release() - self.__lock.release() - - # close stdinput of subprocess - def closeinput(self): - self.__lock.acquire() - self.__quit = True - self.__inputsem.release() - self.__lock.release() From a0bb84fbfcceb79f42eb1675c237b00420a8760e Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 20:19:18 +0200 Subject: [PATCH 099/154] Move unicode_argv to its own file --- DeDRM_plugin/androidkindlekey.py | 69 +------------------------- DeDRM_plugin/argv_utils.py | 59 ++++------------------ DeDRM_plugin/epubtest.py | 70 ++------------------------- DeDRM_plugin/erdr2pml.py | 38 +-------------- DeDRM_plugin/ignoblekeyGenPassHash.py | 39 +-------------- DeDRM_plugin/ignoblekeyNookStudy.py | 40 ++------------- DeDRM_plugin/ineptepub.py | 36 +------------- DeDRM_plugin/ineptpdf.py | 37 +------------- DeDRM_plugin/k4mobidedrm.py | 39 ++------------- DeDRM_plugin/kindlekey.py | 40 ++------------- DeDRM_plugin/kindlepid.py | 38 +-------------- DeDRM_plugin/mobidedrm.py | 41 +--------------- DeDRM_plugin/topazextract.py | 37 +------------- 13 files changed, 37 insertions(+), 546 deletions(-) diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index 971d7c30..b8b1a316 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -41,71 +41,6 @@ # Routines common to Mac and PC -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["kindlekey.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class DrmException(Exception): pass @@ -342,9 +277,7 @@ def usage(progname): def cli_main(): - sys.stdout=SafeUnbuffered(sys.stdout) - sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=sys.argv progname = os.path.basename(argv[0]) print("{0} v{1}\nCopyright © 2010-2020 Thom, Apprentice Harper et al.".format(progname,__version__)) diff --git a/DeDRM_plugin/argv_utils.py b/DeDRM_plugin/argv_utils.py index 37bfb896..2ca47762 100644 --- a/DeDRM_plugin/argv_utils.py +++ b/DeDRM_plugin/argv_utils.py @@ -1,14 +1,17 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import sys, os -import locale -import codecs -import importlib +import sys # get sys.argv arguments and encode them into utf-8 -def unicode_argv(): - if sys.platform.startswith('win'): +def unicode_argv(default_name): + + try: + from calibre.constants import iswindows + except: + iswindows = sys.platform.startswith('win') + + if iswindows: # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode # strings. @@ -38,50 +41,8 @@ def unicode_argv(): range(start, argc.value)] # if we don't have any arguments at all, just pass back script name # this should never happen - return ["DeDRM.py"] + return [ default_name ] else: argvencoding = sys.stdin.encoding or "utf-8" return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - -def add_cp65001_codec(): - try: - codecs.lookup('cp65001') - except LookupError: - codecs.register( - lambda name: name == 'cp65001' and codecs.lookup('utf-8') or None) - return - - -def set_utf8_default_encoding(): - if sys.getdefaultencoding() == 'utf-8': - return - - # Regenerate setdefaultencoding. - importlib.reload(sys) - sys.setdefaultencoding('utf-8') - - for attr in dir(locale): - if attr[0:3] != 'LC_': - continue - aref = getattr(locale, attr) - try: - locale.setlocale(aref, '') - except locale.Error: - continue - try: - lang = locale.getlocale(aref)[0] - except (TypeError, ValueError): - continue - if lang: - try: - locale.setlocale(aref, (lang, 'UTF-8')) - except locale.Error: - os.environ[attr] = lang + '.UTF-8' - try: - locale.setlocale(locale.LC_ALL, '') - except locale.Error: - pass - return - - diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index 79657a58..9213df8e 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -53,75 +53,13 @@ import zlib import zipfile import xml.etree.ElementTree as etree +from argv_utils import unicode_argv NSMAP = {'adept': 'http://ns.adobe.com/adept', 'enc': 'http://www.w3.org/2001/04/xmlenc#'} -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) - -try: - from calibre.constants import iswindows, isosx -except: - iswindows = sys.platform.startswith('win') - isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["epubtest.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from utilities import SafeUnbuffered + _FILENAME_LEN_OFFSET = 26 _EXTRA_LEN_OFFSET = 28 @@ -219,7 +157,7 @@ def encryption(infile): return encryption def main(): - argv=unicode_argv() + argv=unicode_argv("epubtest.py") if len(argv) < 2: print("Give an ePub file as a parameter.") else: diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index df25f86c..1ec99932 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -84,41 +84,7 @@ iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["mobidedrm.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv import cgi import logging @@ -485,7 +451,7 @@ def getuser_key(name,cc): def cli_main(): print("eRdr2Pml v{0}. Copyright © 2009–2020 The Dark Reverser et al.".format(__version__)) - argv=unicode_argv() + argv=unicode_argv("erdr2pml.py") try: opts, args = getopt.getopt(argv[1:], "hp", ["make-pmlz"]) except getopt.GetoptError as err: diff --git a/DeDRM_plugin/ignoblekeyGenPassHash.py b/DeDRM_plugin/ignoblekeyGenPassHash.py index 7d3bec70..6f09bc4e 100644 --- a/DeDRM_plugin/ignoblekeyGenPassHash.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -52,42 +52,7 @@ from utilities import SafeUnbuffered -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["ignoblekeygen.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - +from argv_utils import unicode_argv class IGNOBLEError(Exception): pass @@ -120,7 +85,7 @@ def generate_key(name, ccn): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("ignoblekeyGenPassHash.py") progname = os.path.basename(argv[0]) if len(argv) != 4: print("usage: {0} ".format(progname)) diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index ba789347..6a5f1cfc 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -34,41 +34,7 @@ except: iswindows = sys.platform.startswith('win') -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["ignoblekey.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv class DrmException(Exception): pass @@ -221,7 +187,7 @@ def usage(progname): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("ignoblekeyNookStudy.py") progname = os.path.basename(argv[0]) print("{0} v{1}\nCopyright © 2015 Apprentice Alf".format(progname,__version__)) @@ -282,7 +248,7 @@ def __init__(self, root, text): self.text.insert(tkinter.constants.END, text) - argv=unicode_argv() + argv=unicode_argv("ignoblekeyNookStudy.py") root = tkinter.Tk() root.withdraw() progpath, progname = os.path.split(argv[0]) diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index c4f8dd19..8d112e42 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -72,39 +72,7 @@ def unpad(data, padding=16): from utilities import SafeUnbuffered -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - return ["ineptepub.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv class ADEPTError(Exception): @@ -359,7 +327,7 @@ def decryptBook(userkey, inpath, outpath): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("ineptepub.py") progname = os.path.basename(argv[0]) if len(argv) != 4: print("usage: {0} ".format(progname)) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 64e21f88..b34b38cf 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -98,40 +98,7 @@ def unpad(data, padding=16): iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - return ["ineptpdf.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] - +from argv_utils import unicode_argv class ADEPTError(Exception): pass @@ -2305,7 +2272,7 @@ def getPDFencryptionType(inpath): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("ineptpdf.py") progname = os.path.basename(argv[0]) if len(argv) != 4: print("usage: {0} ".format(progname)) diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index bbd229ec..c3200b6d 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -90,41 +90,8 @@ class DrmException(Exception): from utilities import SafeUnbuffered -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["mobidedrm.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv + # cleanup unicode filenames # borrowed from calibre from calibre/src/calibre/__init__.py @@ -286,7 +253,7 @@ def usage(progname): # Main # def cli_main(): - argv=unicode_argv() + argv=unicode_argv("k4mobidedrm.py") progname = os.path.basename(argv[0]) print("K4MobiDeDrm v{0}.\nCopyright © 2008-2020 Apprentice Harper et al.".format(__version__)) diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 304a891e..60a6065d 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -70,41 +70,7 @@ class RegError(Exception): iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["kindlekey.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv class DrmException(Exception): pass @@ -967,7 +933,7 @@ def usage(progname): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("kindlekey.py") progname = os.path.basename(argv[0]) print("{0} v{1}\nCopyright © 2010-2020 by some_updates, Apprentice Harper et al.".format(progname,__version__)) @@ -1028,7 +994,7 @@ def __init__(self, root, text): self.text.insert(tkinter.constants.END, text) - argv=unicode_argv() + argv=unicode_argv("kindlekey.py") root = tkinter.Tk() root.withdraw() progpath, progname = os.path.split(argv[0]) diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index aea3509a..24e0fe82 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -18,41 +18,7 @@ from utilities import SafeUnbuffered -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["kindlepid.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv letters = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' @@ -92,7 +58,7 @@ def pidFromSerial(s, l): def cli_main(): print("Mobipocket PID calculator for Amazon Kindle. Copyright © 2007, 2009 Igor Skochinsky") - argv=unicode_argv() + argv=unicode_argv("kindlepid.py") if len(argv)==2: serial = argv[1] else: diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 22cdb351..03748362 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -84,44 +84,7 @@ from utilities import SafeUnbuffered -iswindows = sys.platform.startswith('win') -isosx = sys.platform.startswith('darwin') - -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["mobidedrm.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] +from argv_utils import unicode_argv class DrmException(Exception): @@ -481,7 +444,7 @@ def getUnencryptedBook(infile,pidlist): def cli_main(): - argv=unicode_argv() + argv=unicode_argv("mobidedrm.py") progname = os.path.basename(argv[0]) if len(argv)<3 or len(argv)>4: print("MobiDeDrm v{0:s}.\nCopyright © 2008-2020 The Dark Reverser, Apprentice Harper et al.".format(__version__)) diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 3455cf3f..1eaa2a57 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -27,41 +27,6 @@ from argv_utils import unicode_argv -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. - - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["mobidedrm.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] #global switch debug = False @@ -434,7 +399,7 @@ def usage(progname): # Main def cli_main(): - argv=unicode_argv() + argv=unicode_argv("topazextract.py") progname = os.path.basename(argv[0]) print("TopazExtract v{0}.".format(__version__)) From dfa247bf88194b143ddfb3045e08dfa19f37090a Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 20:19:36 +0200 Subject: [PATCH 100/154] Cleanup --- DeDRM_plugin/convert2xml.py | 3 +-- DeDRM_plugin/utilities.py | 12 ------------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/DeDRM_plugin/convert2xml.py b/DeDRM_plugin/convert2xml.py index 5cb9adb3..6af190bb 100644 --- a/DeDRM_plugin/convert2xml.py +++ b/DeDRM_plugin/convert2xml.py @@ -11,8 +11,7 @@ import csv import os import getopt -from struct import pack -from struct import unpack +from struct import pack, unpack class TpzDRMError(Exception): pass diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index 5537349d..949b1691 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -8,18 +8,6 @@ __license__ = 'GPL v3' -DETAILED_MESSAGE = \ -'You have personal information stored in this plugin\'s customization '+ \ -'string from a previous version of this plugin.\n\n'+ \ -'This new version of the plugin can convert that info '+ \ -'into key data that the new plugin can then use (which doesn\'t '+ \ -'require personal information to be stored/displayed in an insecure '+ \ -'manner like the old plugin did).\n\nIf you choose NOT to migrate this data at this time '+ \ -'you will be prompted to save that personal data to a file elsewhere; and you\'ll have '+ \ -'to manually re-configure this plugin with your information.\n\nEither way... ' + \ -'this new version of the plugin will not be responsible for storing that personal '+ \ -'info in plain sight any longer.' - def uStrCmp (s1, s2, caseless=False): import unicodedata as ud if sys.version_info[0] == 2: From ca6d30b2d91cff47f67f9b6acc3927a51374a450 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 6 Aug 2022 20:25:07 +0200 Subject: [PATCH 101/154] More stuff I missed --- CHANGELOG.md | 5 ++- DeDRM_plugin/__init__.py | 12 +++----- DeDRM_plugin/adobekey.py | 66 ++++------------------------------------ 3 files changed, 14 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a3197eb..808ce31b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,4 +73,7 @@ List of changes since the fork of Apprentice Harper's repository: - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). - Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). - Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer. -- Fix PDF decryption issues on Calibre 4 (hopefully fixes #104). \ No newline at end of file +- Fix PDF decryption issues on Calibre 4 (hopefully fixes #104). +- Small Python 2 / Calibre 4 bugfix for Obok. +- Removing ancient AlfCrypto machine code libraries, moving all encryption / decryption to Python code. +- General cleanup and removal of dead code. diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 913d05e3..8ac3c9a0 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -161,12 +161,8 @@ def cli_main(self, data): def initialize(self): """ - Dynamic modules can't be imported/loaded from a zipfile. - So this routine will extract the appropriate - library for the target OS and copy it to the 'alfcrypto' subdirectory of - calibre's configuration directory. That 'alfcrypto' directory is then - inserted into the syspath (as the very first entry) in the run function - so the CDLL stuff will work in the alfcrypto.py script. + Extracting a couple Python scripts if running on Linux, + just in case we need to run them in Wine. The extraction only happens once per version of the plugin Also perform upgrade of preferences once per version @@ -189,7 +185,7 @@ def initialize(self): self.verdir = os.path.join(self.maindir,PLUGIN_VERSION) if not os.path.exists(self.verdir) and not iswindows and not isosx: - names = ["kindlekey.py","adobekey.py","ignoblekeyNookStudy.py"] + names = ["kindlekey.py","adobekey.py","ignoblekeyNookStudy.py","utilities.py","argv_utils.py"] lib_dict = self.load_resources(names) print("{0} v{1}: Copying needed Python scripts from plugin's zip".format(PLUGIN_NAME, PLUGIN_VERSION)) @@ -204,7 +200,7 @@ def initialize(self): try: open(file_path,'wb').write(data) except: - print("{0} v{1}: Exception when copying needed library files".format(PLUGIN_NAME, PLUGIN_VERSION)) + print("{0} v{1}: Exception when copying needed python scripts".format(PLUGIN_NAME, PLUGIN_VERSION)) traceback.print_exc() pass diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 50e2c713..4994dd00 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -45,29 +45,10 @@ from base64 import b64decode -# Wrap a stream so that output gets flushed immediately -# and also make sure that any unicode strings get -# encoded using "replace" before writing them. -class SafeUnbuffered: - def __init__(self, stream): - self.stream = stream - self.encoding = stream.encoding - if self.encoding == None: - self.encoding = "utf-8" - def write(self, data): - if isinstance(data,str) or isinstance(data,unicode): - # str for Python3, unicode for Python2 - data = data.encode(self.encoding,"replace") - try: - buffer = getattr(self.stream, 'buffer', self.stream) - # self.stream.buffer for Python3, self.stream for Python2 - buffer.write(data) - buffer.flush() - except: - # We can do nothing if a write fails - raise - def __getattr__(self, attr): - return getattr(self.stream, attr) + +from utilities import SafeUnbuffered +from argv_utils import unicode_argv + try: from calibre.constants import iswindows, isosx @@ -75,41 +56,6 @@ def __getattr__(self, attr): iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -def unicode_argv(): - if iswindows: - # Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode - # strings. - - # Versions 2.x of Python don't support Unicode in sys.argv on - # Windows, with the underlying Windows API instead replacing multi-byte - # characters with '?'. So use shell32.GetCommandLineArgvW to get sys.argv - # as a list of Unicode strings and encode them as utf-8 - - from ctypes import POINTER, byref, cdll, c_int, windll - from ctypes.wintypes import LPCWSTR, LPWSTR - - GetCommandLineW = cdll.kernel32.GetCommandLineW - GetCommandLineW.argtypes = [] - GetCommandLineW.restype = LPCWSTR - - CommandLineToArgvW = windll.shell32.CommandLineToArgvW - CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)] - CommandLineToArgvW.restype = POINTER(LPWSTR) - - cmd = GetCommandLineW() - argc = c_int(0) - argv = CommandLineToArgvW(cmd, byref(argc)) - if argc.value > 0: - # Remove Python executable and commands if present - start = argc.value - len(sys.argv) - return [argv[i] for i in - range(start, argc.value)] - # if we don't have any arguments at all, just pass back script name - # this should never happen - return ["adobekey.py"] - else: - argvencoding = sys.stdin.encoding or "utf-8" - return [arg if (isinstance(arg, str) or isinstance(arg,unicode)) else str(arg, argvencoding) for arg in sys.argv] class ADEPTError(Exception): pass @@ -507,7 +453,7 @@ def usage(progname): def cli_main(): sys.stdout=SafeUnbuffered(sys.stdout) sys.stderr=SafeUnbuffered(sys.stderr) - argv=unicode_argv() + argv=unicode_argv("adobekey.py") progname = os.path.basename(argv[0]) print("{0} v{1}\nCopyright © 2009-2020 i♥cabbages, Apprentice Harper et al.".format(progname,__version__)) @@ -585,7 +531,7 @@ def __init__(self, root, text): self.text.insert(tkinter.constants.END, text) - argv=unicode_argv() + argv=unicode_argv("adobekey.py") root = tkinter.Tk() root.withdraw() progpath, progname = os.path.split(argv[0]) From b12e567c5fdf06c22bf583329bf9e0b70cae0735 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 7 Aug 2022 09:30:24 +0200 Subject: [PATCH 102/154] Cleanup / SafeUnbuffered bugfix --- DeDRM_plugin/__init__.py | 6 +++--- DeDRM_plugin/utilities.py | 12 ------------ 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 8ac3c9a0..13a91902 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -134,7 +134,7 @@ class FileTypePlugin: config_dir = "" -from utilities import SafeUnbuffered +import utilities PLUGIN_NAME = __version.PLUGIN_NAME @@ -998,8 +998,8 @@ def eReaderDecrypt(self,path_to_ebook): def run(self, path_to_ebook): # make sure any unicode output gets converted safely with 'replace' - sys.stdout=SafeUnbuffered(sys.stdout) - sys.stderr=SafeUnbuffered(sys.stderr) + sys.stdout=utilities.SafeUnbuffered(sys.stdout) + sys.stderr=utilities.SafeUnbuffered(sys.stderr) print("{0} v{1}: Trying to decrypt {2}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook))) self.starttime = time.time() diff --git a/DeDRM_plugin/utilities.py b/DeDRM_plugin/utilities.py index 949b1691..50a7de84 100644 --- a/DeDRM_plugin/utilities.py +++ b/DeDRM_plugin/utilities.py @@ -3,7 +3,6 @@ #@@CALIBRE_COMPAT_CODE@@ -from ignoblekeyGenPassHash import generate_key import sys __license__ = 'GPL v3' @@ -22,17 +21,6 @@ def uStrCmp (s1, s2, caseless=False): else: return ud.normalize('NFC', str1) == ud.normalize('NFC', str2) -def parseCustString(keystuff): - userkeys = [] - ar = keystuff.split(':') - for i in ar: - try: - name, ccn = i.split(',') - # Generate Barnes & Noble EPUB user key from name and credit card number. - userkeys.append(generate_key(name, ccn)) - except: - pass - return userkeys # Wrap a stream so that output gets flushed immediately From 52cf3faa591c2fce5b04d899484afb491c490531 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 7 Aug 2022 09:31:49 +0200 Subject: [PATCH 103/154] Fix DeACSM import for PDF files --- CHANGELOG.md | 1 + DeDRM_plugin/__init__.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 808ce31b..da8525a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,3 +77,4 @@ List of changes since the fork of Apprentice Harper's repository: - Small Python 2 / Calibre 4 bugfix for Obok. - Removing ancient AlfCrypto machine code libraries, moving all encryption / decryption to Python code. - General cleanup and removal of dead code. +- Fix a bug where ADE account keys weren't automatically imported from the DeACSM plugin when importing a PDF file. diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 13a91902..9204600b 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -733,10 +733,10 @@ def PDFIneptDecrypt(self, path_to_ebook): if newkey is not None: if codecs.encode(newkey, 'hex').decode('ascii') not in dedrmprefs['adeptkeys'].values(): print("{0} v{1}: Found new key '{2}' in DeACSM plugin".format(PLUGIN_NAME, PLUGIN_VERSION, newname)) - newkeys.append(keyvalue) + newkeys.append(newkey) newnames.append(newname) except: - pass + traceback.print_exc() if len(newkeys) > 0: try: @@ -770,7 +770,7 @@ def PDFIneptDecrypt(self, path_to_ebook): print("{0} v{1}: Failed to decrypt with new default key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION,time.time()-self.starttime)) except Exception as e: - pass + traceback.print_exc() # Unable to decrypt the PDF with any of the existing keys. Is it a B&N PDF? From 88b09669617d9e56f8085717d4a2cc64e6783bee Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 7 Aug 2022 15:58:01 +0200 Subject: [PATCH 104/154] Fix tons of PDF-related issues --- CHANGELOG.md | 3 +- DeDRM_plugin/ineptpdf.py | 78 ++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da8525a6..a2599407 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,8 +73,9 @@ List of changes since the fork of Apprentice Harper's repository: - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). - Fix a bug where invalid Adobe keys could cause the plugin to stop trying subsequent keys (partially fixes #109). - Fix DRM removal sometimes resetting the ZIP's internal "external_attr" value on Calibre 5 and newer. -- Fix PDF decryption issues on Calibre 4 (hopefully fixes #104). +- Fix tons of PDF decryption issues (hopefully fixes #104 and other PDF-related issues). - Small Python 2 / Calibre 4 bugfix for Obok. - Removing ancient AlfCrypto machine code libraries, moving all encryption / decryption to Python code. - General cleanup and removal of dead code. - Fix a bug where ADE account keys weren't automatically imported from the DeACSM plugin when importing a PDF file. +- Re-enable Xrefs in exported PDF files since the file corruption bug is hopefully fixed. Please open bug reports if you encounter new issues with PDF files. diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index b34b38cf..621416cd 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -117,7 +117,7 @@ def SHA256(message): # 1 = only if present in input # 2 = always -GEN_XREF_STM = 0 +GEN_XREF_STM = 1 # This is the value for the current document gen_xref_stm = False # will be set in PDFSerializer @@ -565,7 +565,11 @@ def nextline(self): while 1: self.fillbuf() if eol: - c = bytes([self.buf[self.charpos]]) + if sys.version_info[0] == 2: + c = self.buf[self.charpos] + else: + c = bytes([self.buf[self.charpos]]) + # handle '\r\n' if c == b'\n': linebuf += c @@ -575,10 +579,17 @@ def nextline(self): if m: linebuf += self.buf[self.charpos:m.end(0)] self.charpos = m.end(0) - if bytes([linebuf[-1]]) == b'\r': - eol = True - else: - break + if sys.version_info[0] == 2: + if linebuf[-1] == b'\r': + eol = True + else: + break + else: + if bytes([linebuf[-1]]) == b'\r': + eol = True + else: + break + else: linebuf += self.buf[self.charpos:] self.charpos = len(self.buf) @@ -954,9 +965,14 @@ def decode(self): for i in range(0, len(data), columns+1): pred = data[i] ent1 = data[i+1:i+1+columns] - if pred == 2: - ent1 = b''.join(bytes([(a+b) & 255]) \ - for (a,b) in zip(ent0,ent1)) + if sys.version_info[0] == 2: + if pred == '\x02': + ent1 = ''.join(chr((ord(a)+ord(b)) & 255) \ + for (a,b) in zip(ent0,ent1)) + else: + if pred == 2: + ent1 = b''.join(bytes([(a+b) & 255]) \ + for (a,b) in zip(ent0,ent1)) buf += ent1 ent0 = ent1 data = buf @@ -1070,8 +1086,6 @@ def getpos(self, objid): return (None, pos) -## PDFXRefStream -## class PDFXRefStream(object): def __init__(self): @@ -1404,7 +1418,10 @@ def check_owner_password_V4(self, password, docid, param): x = ARC4.new(hash).decrypt(Odata) # 4 if R >= 3: for i in range(1,19+1): - k = b''.join(bytes([c ^ i]) for c in hash ) + if sys.version_info[0] == 2: + k = b''.join(chr(ord(c) ^ i) for c in hash ) + else: + k = b''.join(bytes([c ^ i]) for c in hash ) x = ARC4.new(k).decrypt(x) @@ -1462,7 +1479,10 @@ def check_user_password_V4(self, password, docid, param): hash.update(docid[0]) # 3 x = ARC4.new(key).decrypt(hash.digest()[:16]) # 4 for i in range(1,19+1): - k = b''.join(bytes([c ^ i]) for c in key ) + if sys.version_info[0] == 2: + k = b''.join(chr(ord(c) ^ i) for c in key ) + else: + k = b''.join(bytes([c ^ i]) for c in key ) x = ARC4.new(k).decrypt(x) u1 = x+x # 32bytes total if R == 2: @@ -1490,8 +1510,8 @@ def initialize_standard(self, password, docid, param): # check owner pass: retval = self.check_owner_password(password, docid, param) - if retval is True or retval is not None: - #print("Owner pass is valid - " + str(retval)) + if retval is True or (retval is not False and retval is not None): + #print("Owner pass is valid") if retval is True: self.decrypt_key = self.recover_encryption_key_with_password(password, docid, param) else: @@ -1500,7 +1520,7 @@ def initialize_standard(self, password, docid, param): if self.decrypt_key is None or self.decrypt_key is True or self.decrypt_key is False: # That's not the owner password. Check if it's the user password. retval = self.check_user_password(password, docid, param) - if retval is True or retval is not None: + if retval is True or (retval is not False and retval is not None): #print("User pass is valid") if retval is True: self.decrypt_key = self.recover_encryption_key_with_password(password, docid, param) @@ -1723,7 +1743,11 @@ def decrypt_aes(self, objid, genno, data): data = data[16:] plaintext = AES.new(key,AES.MODE_CBC,ivector).decrypt(data) # remove pkcs#5 aes padding - cutter = -1 * plaintext[-1] + if sys.version_info[0] == 2: + cutter = -1 * ord(plaintext[-1]) + else: + cutter = -1 * plaintext[-1] + plaintext = plaintext[:cutter] return plaintext @@ -2199,7 +2223,11 @@ def serialize_object(self, obj): elif isinstance(obj, bytearray): self.write(b'(%s)' % self.escape_string(obj)) elif isinstance(obj, bytes): - self.write(b'(%s)' % self.escape_string(obj)) + # I'm not 100% sure if this is correct, but it seems to fix some PDFs ... + # If needed, revert that change. + self.write(b'<%s>' % binascii.hexlify(obj).upper()) + print("ineptpdf.py: Unknown bytes element found - guessing.") + print("If this PDF is corrupted and/or doesn't work, please open a bug report.") elif isinstance(obj, str): self.write(b'(%s)' % self.escape_string(obj.encode('utf-8'))) elif isinstance(obj, bool): @@ -2226,6 +2254,20 @@ def serialize_object(self, obj): self.write(b'(deleted)') else: data = obj.get_decdata() + + # Fix length: + # We've decompressed and then recompressed the PDF stream. + # Depending on the algorithm, the implementation, and the compression level, + # the resulting recompressed stream is unlikely to have the same length as the original. + # So we need to update the PDF object to contain the new proper length. + + # Without this change, all PDFs exported by this plugin are slightly corrupted - + # even though most if not all PDF readers can correct that on-the-fly. + + if 'Length' in obj.dic: + obj.dic['Length'] = len(data) + + self.serialize_object(obj.dic) self.write(b'stream\n') self.write(data) From 21281baf21389c7f1c93321c64be0ec3715a0016 Mon Sep 17 00:00:00 2001 From: Roland W-H Date: Tue, 9 Aug 2022 17:10:26 +0100 Subject: [PATCH 105/154] fix 2 spelling errors in FAQs.md --- FAQs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FAQs.md b/FAQs.md index 31071f35..c5c43a04 100644 --- a/FAQs.md +++ b/FAQs.md @@ -31,7 +31,7 @@ Verify the one of the following cryptographic hash values, using software of you * SHA-1: 7AB9A86B954CB23D622BD79E3257F8E2182D791C * SHA-256: 28DC21246A9C7CDEDD2D6F0F4082E6BF7EF9DB9CE9D485548E8A9E1D19EAE2AC -You will need to go to the preferences and uncheck the auto update checkbox. Then download and install 1.17 over the top of the newer installation. You'll also need to delete the KFX folders from your My Kindle Content folder. You may also need to take further action to prevent an auto update. The simplest wayis to find the 'updates' folder and replace it with a file. See [this thread] (http://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead for a Script to do this on a PC. On a Mac you can find the folder at ~/Library/Application Support/Kindle/. Make the 'updates' folder read-only, or delete it and save a blank text file called 'updates' in its place. +You will need to go to the preferences and uncheck the auto update checkbox. Then download and install 1.17 over the top of the newer installation. You'll also need to delete the KFX folders from your My Kindle Content folder. You may also need to take further action to prevent an auto update. The simplest way is to find the 'updates' folder and replace it with a file. See [this thread] (http://www.mobileread.com/forums/showthread.php?t=283371) at MobileRead for a Script to do this on a PC. On a Mac you can find the folder at ~/Library/Application Support/Kindle/. Make the 'updates' folder read-only, or delete it and save a blank text file called 'updates' in its place. Another possible solution is to use 1.19 or later, but disable KFX by renaming or disabling a necessary component of the application. This may or may not work on versions after 1.25. In a command window, enter the following commands when Kindle for PC/Mac is not running: @@ -183,7 +183,7 @@ Amazon turned off backup for Kindle for Android, so the tools can no longer find Apple regularly change the details of their DRM and so the tools in the main tools archive will not work with these ebooks. Apple’s Fairplay DRM scheme can be removed using Requiem if the appropriate version of iTunes can still be installed and used. See the post Apple and ebooks: iBookstore DRM and how to remove it at Apprentice Alf's blog for more details. ## Why don't the tools work with LCP-encrypted ebooks? / Error message about a "DMCA takedown" -Support for LCP DRM removal was included in the past, but Readium (the company who developed that particular DRM) has decided to [open a DMCA takedown request](https://github.com/github/dmca/blob/master/2022/01/2022-01-04-readium.md) in January 2022. This means that for legal reasons, this GitHun repository no longer contains the code needed to remove DRM from LCP-encrypted books. For more information please read [this bug report](https://github.com/noDRM/DeDRM_tools/issues/18). +Support for LCP DRM removal was included in the past, but Readium (the company who developed that particular DRM) has decided to [open a DMCA takedown request](https://github.com/github/dmca/blob/master/2022/01/2022-01-04-readium.md) in January 2022. This means that for legal reasons, this GitHub repository no longer contains the code needed to remove DRM from LCP-encrypted books. For more information please read [this bug report](https://github.com/noDRM/DeDRM_tools/issues/18). ## I’ve got the tools archive and I’ve read all the FAQs but I still can’t install the tools and/or the DRM removal doesn’t work * Read the `ReadMe_Overview.txt` file in the top level of the tools archive From 2d4c5d2c4bd58872e0828d36b584661352bbc531 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 10 Sep 2022 11:42:59 +0200 Subject: [PATCH 106/154] Fix key import sometimes generating corrupted keys. Should fix #145, #134, #119, #116, #115, #109 and maybe others. --- DeDRM_plugin/config.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 193b8f69..79129c31 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -1152,7 +1152,8 @@ def __init__(self, parent=None,): zip_function = zip for key, name in zip_function(defaultkeys, defaultnames): - if codecs.encode(key,'hex').decode("latin-1") in self.parent.plugin_keys.values(): + key = codecs.encode(key,'hex').decode("latin-1") + if key in self.parent.plugin_keys.values(): print("Found key '{0}' in ADE - already present, skipping.".format(name)) else: self.new_keys.append(key) @@ -1167,8 +1168,8 @@ def __init__(self, parent=None,): key, name = checkForDeACSMkeys() if key is not None: - - if codecs.encode(key,'hex').decode("latin-1") in self.parent.plugin_keys.values(): + key = codecs.encode(key,'hex').decode("latin-1") + if key in self.parent.plugin_keys.values(): print("Found key '{0}' in DeACSM - already present, skipping.".format(name)) else: # Found new key, add that. @@ -1202,7 +1203,7 @@ def key_name(self): @property def key_value(self): - return codecs.encode(self.new_keys[0],'hex').decode("utf-8") + return codecs.encode(self.new_keys[0],'hex').decode("latin-1") @property From eb45c71fd90989a22ef832f741b21658b1c0690a Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 10 Sep 2022 11:44:55 +0200 Subject: [PATCH 107/154] Cleanup --- DeDRM_plugin/androidkindlekey.py | 2 +- DeDRM_plugin/ineptpdf.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index b8b1a316..74208e06 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -396,7 +396,7 @@ def generate(self): return self.status['text'] = "Select backup.ab file" - argv=unicode_argv() + argv=sys.argv() progpath, progname = os.path.split(argv[0]) root = tkinter.Tk() root.title("Kindle for Android Key Extraction v.{0}".format(__version__)) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 621416cd..7fb99789 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1086,6 +1086,8 @@ def getpos(self, objid): return (None, pos) +## PDFXRefStream +## class PDFXRefStream(object): def __init__(self): From 1cc245b1034f112a01b67b0d50cca15040ca82f1 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 10 Sep 2022 11:47:15 +0200 Subject: [PATCH 108/154] Update README, fixes #136 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 51efe66c..94366a9d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # DeDRM_tools DeDRM tools for ebooks -This is a fork of Apprentice Harper's version of the DeDRM tools. I've added some of the PRs that still haven't been merged, as well as added some more features / bugfixes myself. +This is a fork of Apprentice Harper's version of the DeDRM tools. Apprentice Harper said that the original version of the plugin [is no longer maintained](https://github.com/apprenticeharper/DeDRM_tools#no-longer-maintained), so I've taken over, merged a bunch of open PRs, and added a ton more features and bugfixes. -Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0 so there won't be conflicting / duplicate version numbers when Apprentice Harper's version is updated again. +Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0. The v10.0.0 versions of this plugin should both work with Calibre 5.x (Python 3) as well as Calibre 4.x and lower (Python 2). If you encounter issues with this plugin in Calibre 4.x or lower, please open a bug report. From 6c8051eded405926e2f1b8ca3ff0e7f804a8bd5a Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 10 Sep 2022 11:57:35 +0200 Subject: [PATCH 109/154] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2599407..09c6914f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,3 +79,5 @@ List of changes since the fork of Apprentice Harper's repository: - General cleanup and removal of dead code. - Fix a bug where ADE account keys weren't automatically imported from the DeACSM plugin when importing a PDF file. - Re-enable Xrefs in exported PDF files since the file corruption bug is hopefully fixed. Please open bug reports if you encounter new issues with PDF files. +- Fix a bug that would sometimes cause corrupted keys to be added when adding them through the config dialog (fixes #145, #134, #119, #116, #115, #109). +- Update the README (fixes #136) to indicate that Apprentice Harper's version is no longer being updated. From 06648eeb1c4e12de9be0f268f5c1eee8715de436 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Mon, 17 Oct 2022 17:12:03 +0200 Subject: [PATCH 110/154] Add support for empty arrays (<>) in PDF objects. Fixes #183. --- CHANGELOG.md | 1 + DeDRM_plugin/ineptpdf.py | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09c6914f..6886c0e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,3 +81,4 @@ List of changes since the fork of Apprentice Harper's repository: - Re-enable Xrefs in exported PDF files since the file corruption bug is hopefully fixed. Please open bug reports if you encounter new issues with PDF files. - Fix a bug that would sometimes cause corrupted keys to be added when adding them through the config dialog (fixes #145, #134, #119, #116, #115, #109). - Update the README (fixes #136) to indicate that Apprentice Harper's version is no longer being updated. +- Fix a bug where PDFs with empty arrays (`<>`) in a PDF object failed to decrypt, fixes #183. diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 7fb99789..adb99374 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -270,6 +270,11 @@ def keyword_name(x): OCT_STRING = re.compile(br'[0-7]') ESC_STRING = { b'b':8, b't':9, b'n':10, b'f':12, b'r':13, b'(':40, b')':41, b'\\':92 } +class EmptyArrayValue(object): + def __str__(self): + return "<>" + + class PSBaseParser(object): ''' @@ -519,6 +524,13 @@ def parse_wopen(self, s, i): if c == b'<': self.add_token(KEYWORD_DICT_BEGIN) i += 1 + if c == b'>': + # Empty array without any contents. Why though? + # We need to add some dummy python object that will serialize to + # nothing, otherwise the code removes the whole array. + self.add_token(EmptyArrayValue()) + i += 1 + return (self.parse_main, i) def parse_wclose(self, s, i): @@ -544,7 +556,6 @@ def parse_hexstring(self, s, i): else: token = HEX_PAIR.sub(lambda m: bytes([int(m.group(0), 16)]), SPC.sub(b'', self.token)) - self.add_token(token) return (self.parse_main, j) @@ -1591,7 +1602,13 @@ def initialize_standard(self, password, docid, param): def initialize_ebx_ignoble(self, keyb64, docid, param): self.is_printable = self.is_modifiable = self.is_extractable = True - key = keyb64.decode('base64')[:16] + + try: + key = keyb64.decode('base64')[:16] + # This will probably always error, but I'm not 100% sure, so lets leave the old code in. + except AttributeError: + key = codecs.decode(keyb64.encode("ascii"), 'base64')[:16] + length = int_value(param.get('Length', 0)) / 8 rights = codecs.decode(str_value(param.get('ADEPT_LICENSE')), "base64") @@ -2225,11 +2242,7 @@ def serialize_object(self, obj): elif isinstance(obj, bytearray): self.write(b'(%s)' % self.escape_string(obj)) elif isinstance(obj, bytes): - # I'm not 100% sure if this is correct, but it seems to fix some PDFs ... - # If needed, revert that change. self.write(b'<%s>' % binascii.hexlify(obj).upper()) - print("ineptpdf.py: Unknown bytes element found - guessing.") - print("If this PDF is corrupted and/or doesn't work, please open a bug report.") elif isinstance(obj, str): self.write(b'(%s)' % self.escape_string(obj.encode('utf-8'))) elif isinstance(obj, bool): From 06df18bea331b6e26dd416e8c58dec17d538a942 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 19 Oct 2022 16:39:39 +0200 Subject: [PATCH 111/154] Strip whitespace from Kindle serials (#158) --- CHANGELOG.md | 1 + DeDRM_plugin/config.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6886c0e2..26c27fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,3 +82,4 @@ List of changes since the fork of Apprentice Harper's repository: - Fix a bug that would sometimes cause corrupted keys to be added when adding them through the config dialog (fixes #145, #134, #119, #116, #115, #109). - Update the README (fixes #136) to indicate that Apprentice Harper's version is no longer being updated. - Fix a bug where PDFs with empty arrays (`<>`) in a PDF object failed to decrypt, fixes #183. +- Automatically strip whitespace from entered Amazon Kindle serial numbers, should fix #158. diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 79129c31..82ee89f3 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -1326,7 +1326,7 @@ def key_name(self): @property def key_value(self): - return str(self.key_ledit.text()).replace(' ', '') + return str(self.key_ledit.text()).replace(' ', '').replace('\r', '').replace('\n', '').replace('\t', '') def accept(self): if len(self.key_name) == 0 or self.key_name.isspace(): From e16748e85486f4e7aac0d73b380e272b6712ac01 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 19 Oct 2022 17:14:26 +0200 Subject: [PATCH 112/154] Untested code for the Obok plugin to allow adding duplicate books. See #148 --- CHANGELOG.md | 2 ++ Obok_plugin/action.py | 5 ++++- Obok_plugin/config.py | 26 ++++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26c27fab..3d610943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,3 +83,5 @@ List of changes since the fork of Apprentice Harper's repository: - Update the README (fixes #136) to indicate that Apprentice Harper's version is no longer being updated. - Fix a bug where PDFs with empty arrays (`<>`) in a PDF object failed to decrypt, fixes #183. - Automatically strip whitespace from entered Amazon Kindle serial numbers, should fix #158. +- Obok: Add new setting option "Add new entry" for duplicate books to always add them to the Calibre database as a new book. Untested. Should fix #148. +- Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset. Untested. diff --git a/Obok_plugin/action.py b/Obok_plugin/action.py index fb8f26ef..e4ef377d 100644 --- a/Obok_plugin/action.py +++ b/Obok_plugin/action.py @@ -237,7 +237,10 @@ def add_new_books(self, books_to_add): :param books_to_add: List of calibre bookmaps (created in get_decrypted_kobo_books) ''' - added = self.db.add_books(books_to_add, add_duplicates=False, run_hooks=False) + + cfg_add_duplicates = (cfg['finding_homes_for_formats'] == 'Add new entry') + + added = self.db.add_books(books_to_add, add_duplicates=cfg_add_duplicates, run_hooks=False) if len(added[0]): # Record the id(s) that got added for id in added[0]: diff --git a/Obok_plugin/config.py b/Obok_plugin/config.py index a9363ad4..fdfb424b 100644 --- a/Obok_plugin/config.py +++ b/Obok_plugin/config.py @@ -39,8 +39,13 @@ def __init__(self, plugin_action): self.find_homes = QComboBox() self.find_homes.setToolTip(_('

        Default behavior when duplicates are detected. None of the choices will cause calibre ebooks to be overwritten')) layout.addWidget(self.find_homes) - self.find_homes.addItems([_('Ask'), _('Always'), _('Never')]) + + self.find_homes.addItems([_('Ask'), _('Always'), _('Never'), _('Add new entry')]) + index = self.find_homes.findText(plugin_prefs['finding_homes_for_formats']) + if index == -1: + index = self.find_homes.findText(_(plugin_prefs['finding_homes_for_formats'])) + self.find_homes.setCurrentIndex(index) self.serials_button = QtGui.QPushButton(self) @@ -69,7 +74,24 @@ def edit_kobo_directory(self): def save_settings(self): - plugin_prefs['finding_homes_for_formats'] = self.find_homes.currentText() + + + # Make sure the config file string is *always* english. + find_homes = None + if self.find_homes.currentText() == _('Ask'): + find_homes = 'Ask' + elif self.find_homes.currentText() == _('Always'): + find_homes = 'Always' + elif self.find_homes.currentText() == _('Never'): + find_homes = 'Never' + elif self.find_homes.currentText() == _('Add new entry'): + find_homes = 'Add new entry' + + if find_homes is None: + # Fallback + find_homes = self.find_homes.currentText() + + plugin_prefs['finding_homes_for_formats'] = find_homes plugin_prefs['kobo_serials'] = self.tmpserials plugin_prefs['kobo_directory'] = self.kobodirectory From 901a6c091d116b232044a803e5eaf337bcb115c0 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 23 Dec 2022 10:42:25 +0100 Subject: [PATCH 113/154] Fix exception in error logging in ineptpdf --- DeDRM_plugin/ineptpdf.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index adb99374..ea509ad4 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1636,13 +1636,15 @@ def initialize_ebx_ignoble(self, keyb64, docid, param): else: print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % bookkey[0]) + if len(bookkey) > 0: + print("bookkey[0] is %d" % bookkey[0]) raise ADEPTError('error decrypting book session key - mismatched length') else: # proper length unknown try with whatever you have print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % ord(bookkey[0])) + if len(bookkey) > 0: + print("bookkey[0] is %d" % ord(bookkey[0])) if ebx_V == 3: V = 3 else: @@ -1708,13 +1710,15 @@ def initialize_ebx_inept(self, password, docid, param): else: print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % bookkey[0]) + if len(bookkey) > 0: + print("bookkey[0] is %d" % bookkey[0]) raise ADEPTError('error decrypting book session key - mismatched length') else: # proper length unknown try with whatever you have print("ebx_V is %d and ebx_type is %d" % (ebx_V, ebx_type)) print("length is %d and len(bookkey) is %d" % (length, len(bookkey))) - print("bookkey[0] is %d" % bookkey[0]) + if len(bookkey) > 0: + print("bookkey[0] is %d" % bookkey[0]) if ebx_V == 3: V = 3 else: From a30405bebfc99626aeea2ffb20c4b428008221e5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 23 Dec 2022 10:44:45 +0100 Subject: [PATCH 114/154] Fix Python3 bug in stylexml2css.py, fixes #232 --- CHANGELOG.md | 5 +++-- DeDRM_plugin/stylexml2css.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d610943..845a90a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,5 +83,6 @@ List of changes since the fork of Apprentice Harper's repository: - Update the README (fixes #136) to indicate that Apprentice Harper's version is no longer being updated. - Fix a bug where PDFs with empty arrays (`<>`) in a PDF object failed to decrypt, fixes #183. - Automatically strip whitespace from entered Amazon Kindle serial numbers, should fix #158. -- Obok: Add new setting option "Add new entry" for duplicate books to always add them to the Calibre database as a new book. Untested. Should fix #148. -- Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset. Untested. +- Obok: Add new setting option "Add new entry" for duplicate books to always add them to the Calibre database as a new book. Fixes #148. +- Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset. +- Fix Python3 bug in stylexml2css.php script, fixes #232. diff --git a/DeDRM_plugin/stylexml2css.py b/DeDRM_plugin/stylexml2css.py index 1d46a9e5..3721da42 100644 --- a/DeDRM_plugin/stylexml2css.py +++ b/DeDRM_plugin/stylexml2css.py @@ -181,7 +181,7 @@ def process(self): print("Scale not defined!") scale = 1.0 - if val == "": + if not val: val = 0 if not ((attr == b'hang') and (int(val) == 0)): From a7119543237c0d14db812ad0d6fd9f8d3b49acb7 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 29 Dec 2022 19:52:08 +0100 Subject: [PATCH 115/154] PDF: Ignore invalid objid in non-strict mode, fixes #233 --- DeDRM_plugin/ineptpdf.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index ea509ad4..ab481303 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1831,7 +1831,19 @@ def getobj(self, objid): try: obj = objs[i] except IndexError: - raise PDFSyntaxError('Invalid object number: objid=%r' % (objid)) + # This IndexError used to just raise an exception. + # Unfortunately that seems to break some PDFs, see this issue: + # https://github.com/noDRM/DeDRM_tools/issues/233 + # I'm not sure why this is the case, but lets try only raising that exception + # when in STRICT mode, and make it a warning otherwise. + if STRICT: + raise PDFSyntaxError('Invalid object number: objid=%r' % (objid)) + + print('Invalid object number: objid=%r' % (objid)) + print("Continuing anyways?") + print("If the resulting PDF is corrupted, please open a bug report.") + return None + if isinstance(obj, PDFStream): obj.set_objid(objid, 0) else: From 08e7ac79ca2b9d56ab4e8ea30d785ba9166a256b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 29 Dec 2022 19:53:59 +0100 Subject: [PATCH 116/154] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 845a90a5..8e8f105d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,3 +86,4 @@ List of changes since the fork of Apprentice Harper's repository: - Obok: Add new setting option "Add new entry" for duplicate books to always add them to the Calibre database as a new book. Fixes #148. - Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset. - Fix Python3 bug in stylexml2css.php script, fixes #232. +- PDF: Ignore invalid PDF objids unless the script is running in strict mode. Fixes some PDFs, apparently. Fixes #233. From 3151dbbd98cf90215b36951ea33a0ae4df4054b7 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 29 Dec 2022 19:58:29 +0100 Subject: [PATCH 117/154] Try fixing a Python2 bug in the Obok plugin (#235) --- Obok_plugin/obok/obok.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index 4de76446..dc0a30d7 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -312,11 +312,17 @@ def __init__ (self, serials = [], device_path = None, desktopkobodir = u""): if sys.getwindowsversion().major > 5: if 'LOCALAPPDATA' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x - self.kobodir = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") + if sys.version_info[0] == 2: + self.kobodir = winreg.ExpandEnvironmentStrings(u"%LOCALAPPDATA%") + else: + self.kobodir = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") if (self.kobodir == u""): if 'USERPROFILE' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x - self.kobodir = os.path.join(winreg.ExpandEnvironmentStrings("%USERPROFILE%"), "Local Settings", "Application Data") + if sys.version_info[0] == 2: + self.kobodir = os.path.join(winreg.ExpandEnvironmentStrings(u"%USERPROFILE%"), "Local Settings", "Application Data") + else: + self.kobodir = os.path.join(winreg.ExpandEnvironmentStrings("%USERPROFILE%"), "Local Settings", "Application Data") self.kobodir = os.path.join(self.kobodir, "Kobo", "Kobo Desktop Edition") elif sys.platform.startswith('darwin'): self.kobodir = os.path.join(os.environ['HOME'], "Library", "Application Support", "Kobo", "Kobo Desktop Edition") From 3c12806f38eecfd5b37a5ace890f7c00cbe52169 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 6 Jan 2023 14:29:56 +0100 Subject: [PATCH 118/154] Fix issue with remaining data in encryption.xml --- DeDRM_plugin/ineptepub.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index 8d112e42..d403dacc 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -89,7 +89,7 @@ class Decryptor(object): def __init__(self, bookkey, encryption): enc = lambda tag: '{%s}%s' % (NSMAP['enc'], tag) self._aes = AES.new(bookkey, AES.MODE_CBC, b'\x00'*16) - encryption = etree.fromstring(encryption) + self._encryption = etree.fromstring(encryption) self._encrypted = encrypted = set() self._otherData = otherData = set() @@ -97,7 +97,7 @@ def __init__(self, bookkey, encryption): self._has_remaining_xml = False expr = './%s/%s/%s' % (enc('EncryptedData'), enc('CipherData'), enc('CipherReference')) - for elem in encryption.findall(expr): + for elem in self._encryption.findall(expr): path = elem.get('URI', None) encryption_type_url = (elem.getparent().getparent().find("./%s" % (enc('EncryptionMethod'))).get('Algorithm', None)) if path is not None: From fb8b0034448fd191fa2f3abc12233391d931e4a2 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 6 Jan 2023 14:32:25 +0100 Subject: [PATCH 119/154] Support for Adobe's 'aes128-cbc-uncompressed' encryption (see #242) --- CHANGELOG.md | 2 ++ DeDRM_plugin/ineptepub.py | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e8f105d..0e4301bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,3 +87,5 @@ List of changes since the fork of Apprentice Harper's repository: - Obok: Fix where changing the Calibre UI language to some languages would cause the "duplicate book" setting to reset. - Fix Python3 bug in stylexml2css.php script, fixes #232. - PDF: Ignore invalid PDF objids unless the script is running in strict mode. Fixes some PDFs, apparently. Fixes #233. +- Bugfix: EPUBs with remaining content in the encryption.xml after decryption weren't written correctly. +- Support for Adobe's 'aes128-cbc-uncompressed' encryption method (fixes #242). diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index d403dacc..f118ce69 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -91,6 +91,7 @@ def __init__(self, bookkey, encryption): self._aes = AES.new(bookkey, AES.MODE_CBC, b'\x00'*16) self._encryption = etree.fromstring(encryption) self._encrypted = encrypted = set() + self._encryptedForceNoDecomp = encryptedForceNoDecomp = set() self._otherData = otherData = set() self._json_elements_to_remove = json_elements_to_remove = set() @@ -106,6 +107,11 @@ def __init__(self, bookkey, encryption): path = path.encode('utf-8') encrypted.add(path) json_elements_to_remove.add(elem.getparent().getparent()) + elif (encryption_type_url == "http://ns.adobe.com/adept/xmlenc#aes128-cbc-uncompressed"): + # Adobe uncompressed, for stuff like video files + path = path.encode('utf-8') + encryptedForceNoDecomp.add(path) + json_elements_to_remove.add(elem.getparent().getparent()) else: path = path.encode('utf-8') otherData.add(path) @@ -134,14 +140,15 @@ def decompress(self, bytes): return decompressed_bytes def decrypt(self, path, data): - if path.encode('utf-8') in self._encrypted: + if path.encode('utf-8') in self._encrypted or path.encode('utf-8') in self._encryptedForceNoDecomp: data = self._aes.decrypt(data)[16:] if type(data[-1]) != int: place = ord(data[-1]) else: place = data[-1] data = data[:-place] - data = self.decompress(data) + if not path.encode('utf-8') in self._encryptedForceNoDecomp: + data = self.decompress(data) return data # check file to make check whether it's probably an Adobe Adept encrypted ePub From 740b46546f69a0790a48ad1b32e03609e8084644 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 23 Jun 2023 19:30:06 +0200 Subject: [PATCH 120/154] Try to add support for new K4PC Co-authored-by: Andrew Innes Co-authored-by: Satsuoni --- CHANGELOG.md | 1 + DeDRM_plugin/ion.py | 124 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 120 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e4301bf..98524fbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,3 +89,4 @@ List of changes since the fork of Apprentice Harper's repository: - PDF: Ignore invalid PDF objids unless the script is running in strict mode. Fixes some PDFs, apparently. Fixes #233. - Bugfix: EPUBs with remaining content in the encryption.xml after decryption weren't written correctly. - Support for Adobe's 'aes128-cbc-uncompressed' encryption method (fixes #242). +- Two bugfixes for Amazon DeDRM from Satuoni ( https://github.com/noDRM/DeDRM_tools/issues/315#issuecomment-1508305428 ) and andrewc12 ( https://github.com/andrewc12/DeDRM_tools/commit/d9233d61f00d4484235863969919059f4d0b2057 ) that might make the plugin work with newer versions. diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 45e96109..7e3c9de9 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -835,6 +835,107 @@ def obfuscate(secret, version): return obfuscated + +# scramble() and obfuscate2() from https://github.com/andrewc12/DeDRM_tools/commit/d9233d61f00d4484235863969919059f4d0b2057 + +def scramble(st,magic): + ret=bytearray(len(st)) + padlen=len(st) + for counter in range(len(st)): + ivar2=(padlen//2)-2*(counter%magic)+magic+counter-1 + ret[ivar2%padlen]=st[counter] + return ret + + +def obfuscate2(secret, version): + if version == 1: # v1 does not use obfuscation + return secret + magic, word = OBFUSCATION_TABLE["V%d" % version] + # extend secret so that its length is divisible by the magic number + if len(secret) % magic != 0: + secret = secret + b'\x00' * (magic - len(secret) % magic) + obfuscated = bytearray(len(secret)) + wordhash = bytearray(hashlib.sha256(word).digest()[16:]) + #print(wordhash.hex()) + shuffled = bytearray(scramble(secret,magic)) + for i in range(0, len(secret)): + obfuscated[i] = shuffled[i] ^ wordhash[i % 16] + return obfuscated + +# scramble3() and obfuscate3() from https://github.com/Satsuoni/DeDRM_tools/commit/da6b6a0c911b6d45fe1b13042b690daebc1cc22f + +def scramble3(st,magic): + ret=bytearray(len(st)) + padlen=len(st) + divs = padlen // magic + cntr = 0 + iVar6 = 0 + offset = 0 + if (0 < ((magic - 1) + divs)): + while True: + if (offset & 1) == 0 : + uVar4 = divs - 1 + if offset < divs: + iVar3 = 0 + uVar4 = offset + else: + iVar3 = (offset - divs) + 1 + if uVar4>=0: + iVar5 = uVar4 * magic + index = ((padlen - 1) - cntr) + while True: + if (magic <= iVar3): break + ret[index] = st[iVar3 + iVar5] + iVar3 = iVar3 + 1 + cntr = cntr + 1 + uVar4 = uVar4 - 1 + iVar5 = iVar5 - magic + index -= 1 + if uVar4<=-1: break + else: + if (offset < magic): + iVar3 = 0 + else : + iVar3 = (offset - magic) + 1 + if (iVar3 < divs): + uVar4 = offset + if (magic <= offset): + uVar4 = magic - 1 + + index = ((padlen - 1) - cntr) + iVar5 = iVar3 * magic + while True: + if (uVar4 < 0) : break + iVar3 += 1 + ret[index] = st[uVar4 + iVar5] + uVar4 -= 1 + index=index-1 + iVar5 = iVar5 + magic; + cntr += 1; + if iVar3>=divs: break + offset = offset + 1 + if offset >= ((magic - 1) + divs) :break + return ret + +#not sure if the third variant is used anywhere, but it is in Kindle, so I tried to add it +def obfuscate3(secret, version): + if version == 1: # v1 does not use obfuscation + return secret + magic, word = OBFUSCATION_TABLE["V%d" % version] + # extend secret so that its length is divisible by the magic number + if len(secret) % magic != 0: + secret = secret + b'\x00' * (magic - len(secret) % magic) + #secret = bytearray(secret) + obfuscated = bytearray(len(secret)) + wordhash = bytearray(hashlib.sha256(word).digest()) + #print(wordhash.hex()) + shuffled=bytearray(scramble3(secret,magic)) + #print(shuffled) + # shuffle secret and xor it with the first half of the word hash + for i in range(0, len(secret)): + obfuscated[i] = shuffled[i] ^ wordhash[i % 16] + return obfuscated + class DrmIonVoucher(object): envelope = None version = None @@ -878,12 +979,25 @@ def decryptvoucher(self): else: _assert(False, "Unknown lock parameter: %s" % param) - sharedsecret = obfuscate(shared, self.version) - key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() - aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) - b = aes.decrypt(self.ciphertext) - b = pkcs7unpad(b, 16) + sharedsecrets = [obfuscate(shared, self.version),obfuscate2(shared, self.version),obfuscate3(shared, self.version)] + decrypted=False + ex=None + for sharedsecret in sharedsecrets: + key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() + aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) + try: + b = aes.decrypt(self.ciphertext) + b = pkcs7unpad(b, 16) + decrypted=True + print("Decryption succeeded") + break + except Exception as ex: + print("Decryption failed, trying next fallback ") + if not decrypted: + raise ex + + sharedsecret = obfuscate(shared, self.version) self.drmkey = BinaryIonParser(BytesIO(b)) addprottable(self.drmkey) From a553a71f459b299f2bb3c9cfd7f83799fb9fbe55 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 23 Jun 2023 19:44:24 +0200 Subject: [PATCH 121/154] Fix font decryption with multiple IDs (#347) --- CHANGELOG.md | 1 + DeDRM_plugin/epubfontdecrypt.py | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98524fbc..cdb0d6d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,3 +90,4 @@ List of changes since the fork of Apprentice Harper's repository: - Bugfix: EPUBs with remaining content in the encryption.xml after decryption weren't written correctly. - Support for Adobe's 'aes128-cbc-uncompressed' encryption method (fixes #242). - Two bugfixes for Amazon DeDRM from Satuoni ( https://github.com/noDRM/DeDRM_tools/issues/315#issuecomment-1508305428 ) and andrewc12 ( https://github.com/andrewc12/DeDRM_tools/commit/d9233d61f00d4484235863969919059f4d0b2057 ) that might make the plugin work with newer versions. +- Fix font decryption not working with some books (fixes #347), thanks for the patch @bydioeds. diff --git a/DeDRM_plugin/epubfontdecrypt.py b/DeDRM_plugin/epubfontdecrypt.py index 4baa3752..c9a982f6 100644 --- a/DeDRM_plugin/epubfontdecrypt.py +++ b/DeDRM_plugin/epubfontdecrypt.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # epubfontdecrypt.py -# Copyright © 2021 by noDRM +# Copyright © 2021-2023 by noDRM # Released under the terms of the GNU General Public Licence, version 3 # @@ -10,6 +10,7 @@ # Revision history: # 1 - Initial release +# 2 - Bugfix for multiple book IDs, reported at #347 """ Decrypts / deobfuscates font files in EPUB files @@ -18,7 +19,7 @@ from __future__ import print_function __license__ = 'GPL v3' -__version__ = "1" +__version__ = "2" import os import traceback @@ -193,9 +194,10 @@ def decryptFontsBook(inpath, outpath): pass try: - identify_element = container.find(packageNS("metadata")).find(metadataDCNS("identifier")) - if (secret_key_name is None or secret_key_name == identify_element.get("id")): - font_master_key = identify_element.text + identify_elements = container.find(packageNS("metadata")).findall(metadataDCNS("identifier")) + for element in identify_elements: + if (secret_key_name is None or secret_key_name == element.get("id")): + font_master_key = element.text except: pass From f86cff285be1ed43c296e4adc2c3899ca14fd64b Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sat, 24 Jun 2023 09:53:55 +0200 Subject: [PATCH 122/154] Fix python2 issues in Kindle and Nook code (#355) --- CHANGELOG.md | 1 + DeDRM_plugin/ignoblekeyNookStudy.py | 17 ++++++++++++++--- DeDRM_plugin/kindlekey.py | 5 ++++- DeDRM_plugin/topazextract.py | 2 ++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdb0d6d9..cb0ecbcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,3 +91,4 @@ List of changes since the fork of Apprentice Harper's repository: - Support for Adobe's 'aes128-cbc-uncompressed' encryption method (fixes #242). - Two bugfixes for Amazon DeDRM from Satuoni ( https://github.com/noDRM/DeDRM_tools/issues/315#issuecomment-1508305428 ) and andrewc12 ( https://github.com/andrewc12/DeDRM_tools/commit/d9233d61f00d4484235863969919059f4d0b2057 ) that might make the plugin work with newer versions. - Fix font decryption not working with some books (fixes #347), thanks for the patch @bydioeds. +- Fix a couple unicode errors for Python2 in Kindle and Nook code. diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index 6a5f1cfc..4cf52469 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -54,15 +54,26 @@ def getNookLogFiles(): paths = set() if 'LOCALAPPDATA' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x - path = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") + if sys.version_info[0] == 2: + path = winreg.ExpandEnvironmentStrings(u"%LOCALAPPDATA%") + else: + path = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") if os.path.isdir(path): paths.add(path) if 'USERPROFILE' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x - path = winreg.ExpandEnvironmentStrings("%USERPROFILE%")+"\\AppData\\Local" + if sys.version_info[0] == 2: + path = winreg.ExpandEnvironmentStrings(u"%USERPROFILE%")+u"\\AppData\\Local" + else: + path = winreg.ExpandEnvironmentStrings("%USERPROFILE%")+"\\AppData\\Local" + if os.path.isdir(path): paths.add(path) - path = winreg.ExpandEnvironmentStrings("%USERPROFILE%")+"\\AppData\\Roaming" + + if sys.version_info[0] == 2: + path = winreg.ExpandEnvironmentStrings(u"%USERPROFILE%")+u"\\AppData\\Roaming" + else: + path = winreg.ExpandEnvironmentStrings("%USERPROFILE%")+"\\AppData\\Roaming" if os.path.isdir(path): paths.add(path) # User Shell Folders show take precedent over Shell Folders if present diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 60a6065d..14e4ed18 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -279,7 +279,10 @@ def getKindleInfoFiles(): path = "" if 'LOCALAPPDATA' in os.environ.keys(): # Python 2.x does not return unicode env. Use Python 3.x - path = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") + if sys.version_info[0] == 2: + path = winreg.ExpandEnvironmentStrings(u"%LOCALAPPDATA%") + else: + path = winreg.ExpandEnvironmentStrings("%LOCALAPPDATA%") # this is just another alternative. # path = getEnvironmentVariable('LOCALAPPDATA') if not os.path.isdir(path): diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 1eaa2a57..8848bd9a 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from __future__ import print_function + # topazextract.py # Mostly written by some_updates based on code from many others From 133e67fa0314a484e188367410b41975054180d7 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 25 Jun 2023 16:27:31 +0200 Subject: [PATCH 123/154] Added fix for padding being correct on accident Co-authored-by: Satsuoni --- DeDRM_plugin/ion.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 7e3c9de9..a268c63c 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -989,7 +989,13 @@ def decryptvoucher(self): try: b = aes.decrypt(self.ciphertext) b = pkcs7unpad(b, 16) + self.drmkey = BinaryIonParser(BytesIO(b)) + addprottable(self.drmkey) + + _assert(self.drmkey.hasnext() and self.drmkey.next() == TID_LIST and self.drmkey.gettypename() == "com.amazon.drm.KeySet@1.0", + "Expected KeySet, got %s" % self.drmkey.gettypename()) decrypted=True + print("Decryption succeeded") break except Exception as ex: @@ -997,14 +1003,6 @@ def decryptvoucher(self): if not decrypted: raise ex - sharedsecret = obfuscate(shared, self.version) - - self.drmkey = BinaryIonParser(BytesIO(b)) - addprottable(self.drmkey) - - _assert(self.drmkey.hasnext() and self.drmkey.next() == TID_LIST and self.drmkey.gettypename() == "com.amazon.drm.KeySet@1.0", - "Expected KeySet, got %s" % self.drmkey.gettypename()) - self.drmkey.stepin() while self.drmkey.hasnext(): self.drmkey.next() From abc5de018ef84f2362f7b67a833142b391e235d2 Mon Sep 17 00:00:00 2001 From: Satsuoni Date: Sun, 25 Jun 2023 16:38:55 +0200 Subject: [PATCH 124/154] Added several more scramble functions to Kindle decrypt --- DeDRM_plugin/ion.py | 386 ++- DeDRM_plugin/kfxtables.py | 5771 +++++++++++++++++++++++++++++++++++++ 2 files changed, 6146 insertions(+), 11 deletions(-) create mode 100644 DeDRM_plugin/kfxtables.py diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index a268c63c..63084e0b 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -57,6 +57,7 @@ # Windows-friendly choice: pylzma wheels import pylzma as lzma +from kfxtables import * TID_NULL = 0 TID_BOOLEAN = 1 @@ -769,6 +770,7 @@ def pkcs7unpad(msg, blocklen): # every VoucherEnvelope version has a corresponding "word" and magic number, used in obfuscating the shared secret +# 4-digit versions use their own obfuscation/scramble. It does not seem to depend on the "word" and number OBFUSCATION_TABLE = { "V1": (0x00, None), "V2": (0x05, b'Antidisestablishmentarianism'), @@ -779,26 +781,26 @@ def pkcs7unpad(msg, blocklen): "V7": (0x05, b'\x10\x1bJ\x18\nh!\x10"\x03>Z\'\r\x01]W\x06\x1c\x1e?\x0f\x13'), "V8": (0x09, b"K\x0c6\x1d\x1a\x17pO}Rk\x1d'w1^\x1f$\x1c{C\x02Q\x06\x1d`"), "V9": (0x05, b'X.\x0eW\x1c*K\x12\x12\t\n\n\x17Wx\x01\x02Yf\x0f\x18\x1bVXPi\x01'), - "V10": (0x07, b'z3\n\x039\x12\x13`\x06=v,\x02MTK\x1e%}L\x1c\x1f\x15\x0c\x11\x02\x0c\n8\x17p'), + "V10": (0x07, b'z3\n\x039\x12\x13`\x06=v;\x02MTK\x1e%}L\x1c\x1f\x15\x0c\x11\x02\x0c\n8\x17p'), "V11": (0x05, b'L=\nhVm\x07go\n6\x14\x06\x16L\r\x02\x0b\x0c\x1b\x04#p\t'), - "V12": (0x06, b',n\x1d\rl\x13\x1c\x13\x16p\x14\x07U\x0c\x1f\x19w\x16\x16\x1d5T'), + "V12": (0x06, b';n\x1d\rl\x13\x1c\x13\x16p\x14\x07U\x0c\x1f\x19w\x16\x16\x1d5T'), "V13": (0x07, b'I\x05\t\x08\x03r)\x01$N\x0fr3n\x0b062D\x0f\x13'), "V14": (0x05, b"\x03\x02\x1c9\x19\x15\x15q\x1057\x08\x16\x0cF\x1b.Fw\x01\x12\x03\x13\x02\x17S'hk6"), "V15": (0x0A, b'&,4B\x1dcI\x0bU\x03I\x07\x04\x1c\t\x05c\x07%ws\x0cj\t\x1a\x08\x0f'), - "V16": (0x0A, b'\x06\x18`h,b><\x06PqR\x02Zc\x034\n\x16\x1e\x18\x06#e'), + "V16": (0x0A, b'\x06\x18`h;b><\x06PqR\x02Zc\x034\n\x16\x1e\x18\x06#e'), "V17": (0x07, b'y\r\x12\x08fw.[\x02\t\n\x13\x11\x0c\x11b\x1e8L\x10(\x13)N\x02\x188\x016s\x13\x14\x1b\x16jeN\n\x146\x04\x18\x1c\x0c\x19\x1f,\x02]'), - "V20": (0x08, b'_\r\x01\x12]\\\x14*\x17i\x14\r\t!\x1e,~hZ\x12jK\x17\x1e*1'), + "V20": (0x08, b'_\r\x01\x12]\\\x14*\x17i\x14\r\t!\x1e;~hZ\x12jK\x17\x1e*1'), "V21": (0x07, b'e\x1d\x19|\ty\x1di|N\x13\x0e\x04\x1bj\x14\x0c\x12\x10-\x13&\x18U\x1d\x05Rlt\x03!\x19\x1b\x13\x04]Y\x19,\t\x1b'), @@ -807,10 +809,367 @@ def pkcs7unpad(msg, blocklen): "V9479": (0x09, b'\x10\x1bJ\x18\nh!\x10"\x03>Z\'\r\x01]W\x06\x1c\x1e?\x0f\x13'), "V9888": (0x05, b"K\x0c6\x1d\x1a\x17pO}Rk\x1d'w1^\x1f$\x1c{C\x02Q\x06\x1d`"), "V4648": (0x07, b'X.\x0eW\x1c*K\x12\x12\t\n\n\x17Wx\x01\x02Yf\x0f\x18\x1bVXPi\x01'), - "V5683": (0x05, b'z3\n\x039\x12\x13`\x06=v,\x02MTK\x1e%}L\x1c\x1f\x15\x0c\x11\x02\x0c\n8\x17p'), + "V5683": (0x05, b'z3\n\x039\x12\x13`\x06=v;\x02MTK\x1e%}L\x1c\x1f\x15\x0c\x11\x02\x0c\n8\x17p'), } +#common str: "PIDv3AESAES/CBC/PKCS5PaddingHmacSHA256" +class workspace(object): + def __init__(self,initial_list): + self.work=initial_list + def shuffle(self,shuflist): + ll=len(shuflist) + rt=[] + for i in range(ll): + rt.append(self.work[shuflist[i]]) + self.work=rt + def sbox(self,table,matrix,skplist=[]): #table is list of 4-byte integers + offset=0 + nwork=list(self.work) + wo=0 + toff=0 + while offset<0x6000: + uv5=table[toff+nwork[wo+0]] + uv1=table[toff+nwork[wo+1]+0x100] + uv2=table[toff+nwork[wo+2]+0x200] + uv3=table[toff+nwork[wo+3]+0x300] + moff=0 + if 0 in skplist: + moff+=0x400 + else: + nib1=matrix[moff+offset+(uv1>>0x1c)|( (uv5>>0x18)&0xf0)] + moff+=0x100 + nib2=matrix[moff+offset+(uv3>>0x1c)|( (uv2>>0x18)&0xf0)] + moff+=0x100 + nib3=matrix[moff+offset+((uv1>>0x18)&0xf) |( (uv5>>0x14)&0xf0)] + moff+=0x100 + nib4=matrix[moff+offset+((uv3>>0x18)&0xf) |( (uv2>>0x14)&0xf0)] + moff+=0x100 + rnib1=matrix[moff+offset+nib1*0x10+nib2] + moff+=0x100 + rnib2=matrix[moff+offset+nib3*0x10+nib4] + moff+=0x100 + nwork[wo+0]=rnib1*0x10+rnib2 + if 1 in skplist: + moff+=0x400 + else: + nib1=matrix[moff+offset+((uv1>>0x14)&0xf)|( (uv5>>0x10)&0xf0)] + moff+=0x100 + nib2=matrix[moff+offset+((uv3>>0x14)&0xf)|( (uv2>>0x10)&0xf0)] + moff+=0x100 + nib3=matrix[moff+offset+((uv1>>0x10)&0xf) |( (uv5>>0xc)&0xf0)] + moff+=0x100 + nib4=matrix[moff+offset+((uv3>>0x10)&0xf) |( (uv2>>0xc)&0xf0)] + moff+=0x100 + + rnib1=matrix[moff+offset+nib1*0x10+nib2] + moff+=0x100 + rnib2=matrix[moff+offset+nib3*0x10+nib4] + moff+=0x100 + nwork[wo+1]=rnib1*0x10+rnib2 + if 2 in skplist: + moff+=0x400 + else: + nib1=matrix[moff+offset+((uv1>>0xc)&0xf)|( (uv5>>0x8)&0xf0)] + moff+=0x100 + nib2=matrix[moff+offset+((uv3>>0xc)&0xf)|( (uv2>>0x8)&0xf0)] + moff+=0x100 + nib3=matrix[moff+offset+((uv1>>0x8)&0xf) |( (uv5>>0x4)&0xf0)] + moff+=0x100 + nib4=matrix[moff+offset+((uv3>>0x8)&0xf) |( (uv2>>0x4)&0xf0)] + moff+=0x100 + rnib1=matrix[moff+offset+nib1*0x10+nib2] + moff+=0x100 + rnib2=matrix[moff+offset+nib3*0x10+nib4] + moff+=0x100 + nwork[wo+2]=rnib1*0x10+rnib2 + if 3 in skplist: + moff+=0x400 + else: + nib1=matrix[moff+offset+((uv1>>0x4)&0xf)|( (uv5)&0xf0)] + moff+=0x100 + nib2=matrix[moff+offset+((uv3>>0x4)&0xf)|( (uv2)&0xf0)] + moff+=0x100 + nib3=matrix[moff+offset+((uv1)&0xf)|( (uv5<<4)&0xf0) ] + moff+=0x100 + nib4=matrix[moff+offset+((uv3)&0xf)|( (uv2<<4)&0xf0) ] + moff+=0x100 + ############## + rnib1=matrix[moff+offset+nib1*0x10+nib2] + moff+=0x100 + rnib2=matrix[moff+offset+nib3*0x10+nib4] + moff+=0x100 + nwork[wo+3]=rnib1*0x10+rnib2 + offset = offset + 0x1800 + wo+=4 + toff+=0x400 + self.work=nwork + def lookup(self,ltable): + for a in range(len(self.work)): + self.work[a]=ltable[a] + def exlookup(self,ltable): + lookoffs=0 + for a in range(len(self.work)): + self.work[a]=ltable[self.work[a]+lookoffs] + lookoffs+=0x100 + def mask(self, chunk): + out=[] + for a in range(len(chunk)): + self.work[a]=self.work[a]^chunk[a] + out.append(self.work[a]) + return out + +def process_V9708(st): + #e9c457a7dae6aa24365e7ef219b934b17ed58ee7d5329343fc3aea7860ed51f9a73de14351c9 + ws=workspace([0x11]*16) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.shuffle(repl) + ws.sbox(d0x6a06ea70,d0x6a0dab50) + ws.sbox(d0x6a073a70,d0x6a0dab50) + ws.shuffle(repl) + ws.exlookup(d0x6a072a70) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16; + return bytes(out) + +def process_V1031(st): + #d53efea7fdd0fda3e1e0ebbae87cad0e8f5ef413c471c3ae81f39222a9ec8b8ed582e045918c + ws=workspace([0x06,0x18,0x60,0x68,0x3b,0x62,0x3e,0x3c,0x06,0x50,0x71,0x52,0x02,0x5a,0x63,0x03]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.shuffle(repl) + ws.sbox(d0x6a0797c0,d0x6a0dab50,[3]) + ws.sbox(d0x6a07e7c0,d0x6a0dab50,[3]) + ws.shuffle(repl) + ws.sbox(d0x6a0797c0,d0x6a0dab50,[3]) + ws.sbox(d0x6a07e7c0,d0x6a0dab50,[3]) + ws.exlookup(d0x6a07d7c0) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + #break + return bytes(out) + +def process_V2069(st): + #8e6196d754a304c9354e91b5d79f07b048026d31c7373a8691e513f2c802c706742731caa858 + ws=workspace([0x79,0x0d,0x12,0x08,0x66,0x77,0x2e,0x5b,0x02,0x09,0x0a,0x13,0x11,0x0c,0x11,0x62]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a084498,d0x6a0dab50,[2]) + ws.shuffle(repl) + ws.sbox(d0x6a089498,d0x6a0dab50,[2]) + ws.sbox(d0x6a089498,d0x6a0dab50,[2]) + ws.sbox(d0x6a084498,d0x6a0dab50,[2]) + ws.shuffle(repl) + ws.exlookup(d0x6a088498) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + + +def process_V9041(st): + #11f7db074b24e560dfa6fae3252b383c3b936e51f6ded570dc936cb1da9f4fc4a97ec686e7d8 + ws=workspace([0x49,0x0b,0x0e,0x3b,0x19,0x1a,0x49,0x61,0x10,0x73,0x19,0x67,0x5c,0x1b,0x11,0x21]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a094170,d0x6a0dab50,[1]) + ws.shuffle(repl) + ws.shuffle(repl) + ws.sbox(d0x6a08f170,d0x6a0dab50,[1]) + ws.sbox(d0x6a08f170,d0x6a0dab50,[1]) + ws.sbox(d0x6a094170,d0x6a0dab50,[1]) + + ws.exlookup(d0x6a093170) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + #break + return bytes(out) + +def process_V3646(st): + #d468aa362b44479282291983243b38197c4b4aa24c2c58e62c76ec4b81e08556ca0c54301664 + ws=workspace([0x0a,0x36,0x3e,0x29,0x4e,0x02,0x18,0x38,0x01,0x36,0x73,0x13,0x14,0x1b,0x16,0x6a]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.shuffle(repl) + ws.sbox(d0x6a099e48,d0x6a0dab50,[2,3]) + ws.sbox(d0x6a09ee48,d0x6a0dab50,[2,3]) + ws.sbox(d0x6a09ee48,d0x6a0dab50,[2,3]) + ws.shuffle(repl) + ws.sbox(d0x6a099e48,d0x6a0dab50,[2,3]) + ws.sbox(d0x6a099e48,d0x6a0dab50,[2,3]) + ws.shuffle(repl) + ws.sbox(d0x6a09ee48,d0x6a0dab50,[2,3]) + ws.exlookup(d0x6a09de48) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + + +def process_V6052(st): + #d683c8c4e4f46ae45812196f37e218eabce0fae08994f25fabb01d3e569b8bf3866b99d36f57 + ws=workspace([0x5f,0x0d,0x01,0x12,0x5d,0x5c,0x14,0x2a,0x17,0x69,0x14,0x0d,0x09,0x21,0x1e,0x3b]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.shuffle(repl) + ws.sbox(d0x6a0a4b20,d0x6a0dab50,[1,3]) + ws.shuffle(repl) + ws.sbox(d0x6a0a4b20,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0a9b20,d0x6a0dab50,[1,3]) + ws.shuffle(repl) + ws.sbox(d0x6a0a9b20,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0a9b20,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0a4b20,d0x6a0dab50,[1,3]) + + ws.exlookup(d0x6a0a8b20) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + +def process_V9479(st): + #925635db434bccd3f4791eb87b89d2dfc7c93be06e794744eb9de58e6d721e696980680ab551 + ws=workspace([0x65,0x1d,0x19,0x7c,0x09,0x79,0x1d,0x69,0x7c,0x4e,0x13,0x0e,0x04,0x1b,0x6a,0x3c ]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a0af7f8,d0x6a0dab50,[1,2,3]) + ws.sbox(d0x6a0af7f8,d0x6a0dab50,[1,2,3]) + ws.sbox(d0x6a0b47f8,d0x6a0dab50,[1,2,3]) + ws.sbox(d0x6a0af7f8,d0x6a0dab50,[1,2,3]) + ws.shuffle(repl) + ws.sbox(d0x6a0b47f8,d0x6a0dab50,[1,2,3]) + ws.shuffle(repl) + ws.shuffle(repl) + ws.sbox(d0x6a0b47f8,d0x6a0dab50,[1,2,3]) + ws.exlookup(d0x6a0b37f8) + + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + +def process_V9888(st): + #54c470723f8c105ba0186b6319050869de673ce31a5ec15d4439921d4cd05c5e860cb2a41fea + ws=workspace([0x3f,0x17,0x79,0x69,0x24,0x6b,0x37,0x50,0x63,0x09,0x45,0x6f,0x0c,0x07,0x07,0x09]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a0ba4d0,d0x6a0dab50,[1,2]) + ws.sbox(d0x6a0bf4d0,d0x6a0dab50,[1,2]) + ws.sbox(d0x6a0bf4d0,d0x6a0dab50,[1,2]) + ws.sbox(d0x6a0ba4d0,d0x6a0dab50,[1,2]) + ws.shuffle(repl) + ws.shuffle(repl) + ws.shuffle(repl) + ws.sbox(d0x6a0bf4d0,d0x6a0dab50,[1,2]) + ws.sbox(d0x6a0ba4d0,d0x6a0dab50,[1,2]) + ws.exlookup(d0x6a0be4d0) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + +def process_V4648(st): + #705bd4cd8b61d4596ef4ca40774d68e71f1f846c6e94bd23fd26e5c127e0beaa650a50171f1b + ws=workspace([0x16,0x2b,0x64,0x62,0x13,0x04,0x18,0x0d,0x63,0x25,0x14,0x17,0x0f,0x13,0x46,0x0c]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a0ca1a8,d0x6a0dab50,[1,3]) + ws.shuffle(repl) + ws.sbox(d0x6a0ca1a8,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0c51a8,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0ca1a8,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0c51a8,d0x6a0dab50,[1,3]) + ws.sbox(d0x6a0c51a8,d0x6a0dab50,[1,3]) + ws.shuffle(repl) + ws.shuffle(repl) + ws.exlookup(d0x6a0c91a8) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + +def process_V5683(st): + #1f5af733423e5104afb9d5594e682ecf839a776257f33747c9beee671c57ab3f84943f69d8fd + ws=workspace([0x7c,0x36,0x5c,0x1a,0x0d,0x10,0x0a,0x50,0x07,0x0f,0x75,0x1f,0x09,0x3b,0x0d,0x72]) + repl=[0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11] + remln=len(st) + sto=0 + out=[] + while(remln>0): + ws.sbox(d0x6a0d4e80,d0x6a0dab50,[]) + ws.shuffle(repl) + ws.sbox(d0x6a0cfe80,d0x6a0dab50,[]) + ws.sbox(d0x6a0d4e80,d0x6a0dab50,[]) + ws.sbox(d0x6a0cfe80,d0x6a0dab50,[]) + ws.sbox(d0x6a0d4e80,d0x6a0dab50,[]) + ws.shuffle(repl) + ws.sbox(d0x6a0cfe80,d0x6a0dab50,[]) + ws.shuffle(repl) + ws.exlookup(d0x6a0d3e80) + dat=ws.mask(st[sto:sto+16]) + out+=dat + sto+=16 + remln-=16 + return bytes(out) + + +# def a2hex(arr): +# ax=[] +# ha="0123456789abcdef" +# for a in arr: +# if a<0: a=256+a +# ax.append(ha[(a>>4)]+ha[a%16]) +# return "".join(ax) +# +# def memhex(adr,sz): +# emu=EmulatorHelper(currentProgram) +# arr=emu.readMemory(getAddress(adr),sz) +# return a2hex(arr) +# + + + + # obfuscate shared secret according to the VoucherEnvelope version def obfuscate(secret, version): if version == 1: # v1 does not use obfuscation @@ -980,7 +1339,12 @@ def decryptvoucher(self): _assert(False, "Unknown lock parameter: %s" % param) - sharedsecrets = [obfuscate(shared, self.version),obfuscate2(shared, self.version),obfuscate3(shared, self.version)] + # i know that version maps to scramble pretty much 1 to 1, but there was precendent where they changed it, so... + sharedsecrets = [obfuscate(shared, self.version),obfuscate2(shared, self.version),obfuscate3(shared, self.version), + process_V9708(shared), process_V1031(shared), process_V2069(shared), process_V9041(shared), + process_V3646(shared), process_V6052(shared), process_V9479(shared), process_V9888(shared), + process_V4648(shared), process_V5683(shared)] + decrypted=False ex=None for sharedsecret in sharedsecrets: @@ -995,7 +1359,7 @@ def decryptvoucher(self): _assert(self.drmkey.hasnext() and self.drmkey.next() == TID_LIST and self.drmkey.gettypename() == "com.amazon.drm.KeySet@1.0", "Expected KeySet, got %s" % self.drmkey.gettypename()) decrypted=True - + print("Decryption succeeded") break except Exception as ex: diff --git a/DeDRM_plugin/kfxtables.py b/DeDRM_plugin/kfxtables.py new file mode 100644 index 00000000..e03902d0 --- /dev/null +++ b/DeDRM_plugin/kfxtables.py @@ -0,0 +1,5771 @@ +d0x6a06ea70=[ 0x3d8d5f4b, 0x017b1e11, 0x8a4abb42, 0x95ac20ad, 0x7b717c3b, 0xf040d968, 0xac2f409d, 0x71ded106, 0xfa46d02e, 0x0ea19246, 0x9ed137fa, 0x80e5167f, 0x65ecf9c5, 0xd62522b7, 0x9f038d90, 0x75794a06, 0x5d1487e4, 0x8e448439, 0x0bd4b32c, 0x26cc5fa4, +0xd884b0f1, 0xeedd5c96, 0x60307cd4, 0xc7cb8f65, 0x149b8cb8, 0x143228c3, 0x2665fbdf, 0x27b741b5, 0x11eeadd2, 0x7aa3c651, 0xb3607f09, 0x3722f276, 0xd82d148a, 0x61e2c6be, 0x1f4f3f94, 0x7eadf92a, 0x38f87e21, 0x103c17b8, 0x85903715, 0xc36c1465, +0x05dc8511, 0x29bf7788, 0xa888db9d, 0xd9ffaee0, 0xb3c9db72, 0xcd642258, 0xc2170a74, 0xc7622b1e, 0xfb946a44, 0xe0d56aab, 0x8b31a553, 0x04a79b00, 0x58c802f5, 0x0575216a, 0xa95a61f7, 0x42f21c0b, 0x8137ac15, 0xd7f798dd, 0x392ac44b, 0x52ce0bb3, +0x01d2ba6a, 0x7177757d, 0xd22b1dcc, 0x53b515a2, 0x00000000, 0x4d28905c, 0x2db148f3, 0xb81d685e, 0x040e3f7b, 0xe1ae74ba, 0x6feaf083, 0x2310dab5, 0x6099d8af, 0xcdcd8623, 0xe07cced0, 0xadfdfaf7, 0x566990b3, 0xb2b2c563, 0x8f963e53, 0x00a9a47b, +0xbcbaf35e, 0x15e092a9, 0xeba87dfc, 0xb21b6118, 0xc619350f, 0x6a367592, 0x3257d31c, 0xff33f144, 0x1095b3c3, 0x947e9ac7, 0x0a060946, 0x5dbd239f, 0x0b7d1757, 0x1a93ba85, 0x84428d7f, 0x0e08363d, 0xd3f9a7a6, 0x614b62c5, 0xbdc1ed4f, 0xddf1919b, +0xea7ac796, 0xc8b8a749, 0xdc232bf1, 0xb8b4cc25, 0xc3c5b01e, 0x485db136, 0xf0e97d13, 0xac86e4e6, 0x47873d61, 0x0fda8c57, 0x498f0b5c, 0x94d73ebc, 0x3659ec67, 0x8b980128, 0x9faa29eb, 0xdd5835e0, 0x91a21fd6, 0x3d24fb30, 0x643e43af, 0x271ee5ce, +0x9070a5bc, 0x910bbbad, 0xeb01d987, 0x1be8a494, 0x28c46999, 0xa62949db, 0x9a76acfa, 0xf535f802, 0xb76e4072, 0x4cfa2a36, 0xbc135725, 0x226bc4a4, 0x4c538e4d, 0xc9c3b958, 0xff9a553f, 0x33856976, 0xefa64287, 0x56c034c8, 0x5cc63d8e, 0xfaef7455, +0x7bd8d840, 0xe472f1ab, 0xdc8a8f8a, 0xd9560a9b, 0xfe48ef55, 0x6a9fd1e9, 0x22c260df, 0xd35003dd, 0xccb69832, 0xe107d0c1, 0xfee14b2e, 0xe4db55d0, 0xb6bcfa18, 0xd282b9b7, 0xc96a1d23, 0xc2beae0f, 0xa22776a0, 0x425bb870, 0xa35c68b1, 0x6e91ee92, +0x8eed2042, 0x48f4154d, 0x114709a9, 0x1a3a1efe, 0x90d901c7, 0x819e086e, 0xf13bc779, 0xa75257ca, 0xef0fe6fc, 0xe5a04bc1, 0x6f4354f8, 0x154936d2, 0x2916d3f3, 0xcc1f3c49, 0x84eb2904, 0xa9f3c58c, 0x7a0a622a, 0x5c6f99f5, 0xb9cfd234, 0xb6155e63, +0x70a5cf17, 0x4926af27, 0x3851da5a, 0x8f3f9a28, 0xb966764f, 0x2c63f299, 0x4655870b, 0x286dcde2, 0xa680eda0, 0x1e342185, 0x6be4cff8, 0x74abf06c, 0x1b4100ef, 0x332ccd0d, 0xf59c5c79, 0x65455dbe, 0x7f7f4340, 0x4320a661, 0x1fe69bef, 0xb7c7e409, +0x32fe7767, 0xc8110332, 0x9ba41690, 0x1e9d85fe, 0xbd684934, 0x0f73282c, 0x8ae31f39, 0xf1926302, 0x57128ea2, 0x2cca56e2, 0x7fd6e73b, 0x39836030, 0x3cf6415a, 0x591ab89f, 0x9adf0881, 0xe509efba, 0xead363ed, 0x2d18ec88, 0x75d0ee7d, 0x6b4d6b83, +0x7e045d51, 0x59b31ce4, 0xa8217fe6, 0xd75e3ca6, 0xee74f8ed, 0xf4e74268, 0xd68c86cc, 0x4d813427, 0x4389021a, 0x700c6b6c, 0x472e991a, 0x36f0481c, 0x9b0db2eb, 0x6497e7d4, 0xf44ee613, 0xa7fbf3b1, 0x5861a68e, 0xc6b09174, 0x23b97ece, 0x8539936e, +0x804cb204, 0x6e384ae9, 0x9e789381, 0x3c5fe521, 0x46fc2370, 0x531cb1d9, 0x57bb2ad9, 0x74025417, 0xad545e8c, 0x5267afc8, 0x378b560d, 0x0aafad3d, 0xa3f5ccca, 0xfb3dce3f, 0x950584d6, 0xa28ed2db, 0xd730757a, 0xd79c90b7, 0xd822f50d, 0x3d09b55d, +0x1235911a, 0xaa24f37e, 0xfce08544, 0x73ea342d, 0xd37044ce, 0x335be2b9, 0xa476a49a, 0x4e4f64bd, 0x208241fd, 0xca176417, 0xf21e376d, 0x5d3a2234, 0xe46b97c3, 0x536875d0, 0xa09a70e3, 0x44f1e720, 0x589621de, 0x845800aa, 0x53c4901d, 0xeb7917b4, +0x8aa6b283, 0x8e4a66fa, 0x997f11c7, 0xb9fd503a, 0x19cbc514, 0xb951b5f7, 0x179992f0, 0x05ac03ea, 0x2f3c2447, 0x246e9584, 0x96c1747d, 0xc44533f3, 0x9d3f2073, 0xcf178230, 0x8be66510, 0x2e7cf3d4, 0x1ccb2333, 0x80b4d4d3, 0xc0a9e78a, 0x0abe839d, +0xe4c7720e, 0x928145c9, 0x044031b4, 0x252e4217, 0x566893f7, 0x966d91b0, 0xb3ef366a, 0x6b6126aa, 0x13d9a344, 0x2ed01619, 0xbcfdb61d, 0x61dfa537, 0xd670a2e9, 0x1d8bf4a0, 0xf94c86ae, 0xebd5f279, 0x196720d9, 0xa036952e, 0x64df4310, 0x21c2966e, +0xa17642bd, 0x5228a243, 0x415de4ca, 0xbdbd618e, 0x0a126650, 0xf7b23487, 0x5cd6106a, 0x6a21f139, 0x6bcdc367, 0x3da55090, 0x9cd3122d, 0x13754689, 0x6f8df2d3, 0xdcce2174, 0x01ec325e, 0x33f70774, 0x78146023, 0x972d4623, 0xdd22132a, 0xf35ee0fe, +0x9781a3ee, 0x451dd57e, 0xe16b71e4, 0x1735773d, 0x6ecd2540, 0xcfbb67fd, 0xfda052d7, 0x8fa654a4, 0x8018311e, 0xeed5145e, 0xe587a59d, 0xa4da4157, 0xd6dc4724, 0xa5367309, 0x7346d1e0, 0x8f0ab169, 0x202ea430, 0x41f10107, 0x0fbe65ba, 0x1675a0ae, +0x79f8527d, 0xc4e9d63e, 0xb8116264, 0x0e5257e4, 0xcabb81da, 0x583ac413, 0x4a0f5509, 0x216e73a3, 0x7cf8b45a, 0x00000000, 0x7d148604, 0xcefbb06e, 0x8158e68d, 0x445d02ed, 0x188b1287, 0xae64c2ca, 0x85b432f4, 0xb2030434, 0xabc8c120, 0x4b4f829a, +0xef392600, 0x7c545197, 0x9c7ff7e0, 0xe52b4050, 0x72060673, 0x78b885ee, 0x371bd30d, 0xb703e213, 0x38a5b6b7, 0xea9525ea, 0x7954b7b0, 0x1827f74a, 0x04ecd479, 0x2b7c15f3, 0x40b1d694, 0x24c27049, 0x129974d7, 0xf3f20533, 0xaec82707, 0xea39c027, +0xf2b2d2a0, 0xb343d3a7, 0x56c4763a, 0x0efeb229, 0xaf241559, 0xa1daa770, 0x39e56124, 0x45b130b3, 0xc505e460, 0x57284464, 0x4aa3b0c4, 0x321b352a, 0x4fa356e3, 0x16d94563, 0xef95c3cd, 0xbd118443, 0xbc5153d0, 0x59d6f64d, 0x0b52b1c3, 0xd29c7690, +0x1d27116d, 0xd3dca103, 0x936d7797, 0xc5a901ad, 0xc145d5d4, 0xab6424ed, 0x99d3f40a, 0x5d96c7f9, 0x609f72a4, 0x2bd0f03e, 0xf80c513d, 0x7db863c9, 0xb6efd04d, 0x617340fa, 0x4ee38170, 0x394984e9, 0xc1e93019, 0x2a9027ad, 0xdc62c4b9, 0x93c1925a, +0xe02ba677, 0xcb57b384, 0x81f40340, 0xee79f193, 0x0f128077, 0xb2afe1f9, 0x0500e627, 0x8b4a80dd, 0x6473a6dd, 0x6533714e, 0x5c7af5a7, 0x77aa0599, 0x6e61c08d, 0xb8bd87a9, 0x32b7d0e7, 0xb6433580, 0x3809537a, 0x37b736c0, 0x922da004, 0x983fc654, +0x4be36757, 0xe1c79429, 0xb7af07de, 0x2f90c18a, 0xcbfb5649, 0x0140d793, 0xe08743ba, 0x8518d739, 0x76ead20a, 0xaa8816b3, 0xce5755a3, 0x72aae3be, 0xf65e06d9, 0x659f9483, 0xa59a96c4, 0x5784a1a9, 0xdd8ef6e7, 0x365b049e, 0x7706e054, 0x84f4e567, +0x98932399, 0x2a3cc260, 0xd230935d, 0xf6f2e314, 0x60339769, 0xc0050247, 0x597a1380, 0xaf88f094, 0x5284478e, 0xd962229e, 0x764637c7, 0xf8a0b4f0, 0xfc4c6089, 0x3ce58703, 0x4f0fb32e, 0x2582a7da, 0x401d3359, 0x00ace5cd, 0x3c4962ce, 0x9d93c5be, +0x36f7e153, 0x6a8d14f4, 0xfd0cb71a, 0xd88e10c0, 0x0bfe540e, 0x8a0a574e, 0x8ee68337, 0xf9e06363, 0x1c67c6fe, 0x6f21171e, 0xd9cec753, 0xf71ed14a, 0x4ae848ed, 0xdbb46d75, 0x73ef4b8d, 0x8cfffec2, 0x964228d9, 0xce8ff9d3, 0x319f4c9c, 0x1a8fada1, +0x8627710a, 0x50559ef6, 0x66d4df2b, 0xe5ad6354, 0x08984ffc, 0xfa7c0380, 0x916e5e22, 0x2e4e2c48, 0x34c181e9, 0x18fd162f, 0x1abdd61b, 0xf7ba8109, 0x8e8d454c, 0xf788fab3, 0x99f611de, 0x99c46a64, 0xdc981b8e, 0x18cf6d95, 0x26d663b4, 0x52155ec2, +0xbf1209d0, 0x153b94a6, 0xaf452bb9, 0x34f3fa53, 0xf80eb80e, 0x6e7eeb6d, 0xf83cc3b4, 0x7c690930, 0x71af8bb9, 0xc37b00e0, 0xb2d48b59, 0x6c0c50e3, 0xaf775003, 0xc991f492, 0xf2d637c6, 0x8379bc7f, 0xc625cd95, 0x177b5492, 0xb5ca8618, 0xfd50757b, +0xc109bb6e, 0xbd52c9e4, 0x66e6a491, 0x64941f1f, 0xcccf39e7, 0xff10b54f, 0x106559d3, 0x8467b13e, 0x08aa3446, 0x31ad3726, 0xd15e9907, 0xaa299d76, 0x393578da, 0xd6409446, 0xccfd425d, 0xa2b1d28a, 0x73dd3037, 0xb80c0491, 0x21fa154f, 0x5779e80d, +0x74f146cc, 0xe2b36e15, 0x61f8a9d0, 0x00000000, 0x9bb6d1ea, 0x33df8ca8, 0xb2e6f0e3, 0xf5fa413d, 0x719df003, 0x8bd38839, 0x6960e62c, 0x834bc7c5, 0x48a888d9, 0xba7ebf1f, 0x455c71ea, 0x9ee81c9f, 0x29502109, 0x7c5b728a, 0x056cb6cf, 0xb83e7f2b, +0x0ad88fc8, 0xc457761b, 0x3e2b759b, 0x6c3e2b59, 0x0272bb8e, 0x5da167c5, 0x3c6bb5af, 0x638a125e, 0xef479726, 0x3b75b8ee, 0x0f8642bd, 0xd672effc, 0x915c2598, 0x89a133b7, 0x29625ab3, 0x9b84aa50, 0xa7dd6445, 0xad379037, 0xa0f112be, 0xa7ef1fff, +0x4002bc9f, 0xe8599a67, 0x071e0d41, 0x63b869e4, 0x24a4d83a, 0x4f84fe22, 0x81397c4b, 0xc13bc0d4, 0x0aeaf472, 0xcbe34f1c, 0x64a664a5, 0xed075712, 0x1509ef1c, 0x36b33a67, 0x86150ab0, 0x8455ca84, 0x0fb43907, 0xe7eda360, 0x5a8d113e, 0x6b125da2, +0x10572269, 0xd31e5933, 0x3e190e21, 0x5067e54c, 0x42427cab, 0x2388aec1, 0xcbd134a6, 0x4fb68598, 0x5d931c7f, 0xa0c36904, 0xdcaa6034, 0x17492f28, 0xb5f8fda2, 0x33edf712, 0x6e4c90d7, 0x2b229a87, 0x471cb1de, 0xe28115af, 0xba4cc4a5, 0x58ffaab0, +0x00327bba, 0xd9f4ad41, 0xdeeaa000, 0x7937c445, 0x8993480d, 0xe0f3ae21, 0x5abf6a84, 0xd16ce2bd, 0x52272578, 0xa5afdfcb, 0xaa1be6cc, 0xe59f18ee, 0xb78a462c, 0x42700711, 0x39070360, 0xf0a48c48, 0xa59da471, 0xc9a38f28, 0x9ca8dcab, 0x0240c034, +0x26e4180e, 0x5fe1a7f1, 0xc3497b5a, 0x2e7c57f2, 0x9eda6725, 0x23bad57b, 0x7683fd42, 0xb0944b6d, 0xa8695d42, 0xe7dfd8da, 0x368141dd, 0x7b770471, 0x7e29c904, 0xded8dbba, 0xa85b26f8, 0xbd60b25e, 0x2c0eec7c, 0xef75ec9c, 0xf2e44c7c, 0x1da3db5a, +0x1fe31b6e, 0x0dc68289, 0x489af363, 0x456e0a50, 0xd4005472, 0x58cdd10a, 0x6b202618, 0xdb8616cf, 0x7e1bb2be, 0x8ebf3ef6, 0x8be1f383, 0x9402e8ed, 0xd9c6d6fb, 0x55392839, 0x3b47c354, 0x1217e25d, 0x69529d96, 0x9c9aa711, 0x94309357, 0x21c86ef5, +0xed352ca8, 0xad05eb8d, 0xcebd8269, 0x2b10e13d, 0x4df645ac, 0x4030c725, 0xd32c2289, 0xc4650da1, 0x574b93b7, 0x8ccd8578, 0x550b5383, 0xea195a53, 0x74c33d76, 0x1d91a0e0, 0x7905bfff, 0x4dc43e16, 0x76b186f8, 0x3c59ce15, 0xe0c1d59b, 0xf096f7f2, +0xfa4e783a, 0xfd620ec1, 0xbf20726a, 0x810b07f1, 0xf5c83a87, 0xe86be1dd, 0x055ecd75, 0xff22cef5, 0x2c3c97c6, 0x2496a380, 0xd4322fc8, 0x072c76fb, 0xb7b83d96, 0x5fd3dc4b, 0x931ce5ac, 0x96705363, 0xb0a630d7, 0x61cad26a, 0x122599e7, 0x932e9e16, +0x4ada3357, 0x0df4f933, 0x1fd160d4, 0x7b457fcb, 0xc617b62f, 0x472eca64, 0xa283a930, 0xea2b21e9, 0xea78d83f, 0x1e8b8c99, 0x906e5be4, 0x089dbf06, 0x01030c04, 0xa4cb5491, 0x2b2d8fe8, 0x32d1e0c0, 0x8946b771, 0x7bc10c62, 0xb5aa84bf, 0x16c2b022, +0xf427d71b, 0x98f3e4e2, 0xeaac5b82, 0x6cd433f9, 0xfcba681d, 0x10b65f97, 0x4e670f13, 0xa5c85895, 0xfbcd8bac, 0x810f8bca, 0x33d2ecc4, 0xd797e7f5, 0x4f640317, 0x97cd3be8, 0x9719b855, 0xf4f354a6, 0x25c4df5b, 0xba945bb5, 0xce6b88dd, 0x5f06df3d, +0x564cef82, 0xc082d86e, 0x099eb302, 0x99f0e8e6, 0x182be091, 0x7db5e3d7, 0x800c87ce, 0xac82682a, 0xbb9757b1, 0x7a1683db, 0xb3de6b0a, 0x961ab451, 0xb47d0b06, 0x9f840753, 0x4159d019, 0x91b9d45d, 0x4fb080aa, 0x889138c8, 0x58a5bf31, 0xfdb96419, +0x0fea5cb7, 0x418d53a4, 0xac56eb97, 0x738830d9, 0x22b33cea, 0xc15557d7, 0x357280cc, 0x2c5a6c59, 0x58713c8c, 0xd03487f9, 0xbc3437bd, 0xd1378bfd, 0x1062dc2a, 0x0e3dd30e, 0x633e6f4e, 0x3d3bbc77, 0x49c46f1f, 0x64498cff, 0xa41fd72c, 0x5e05d339, +0x8fe6db79, 0x17c1bc26, 0x96ce37ec, 0x23b030ee, 0xe332e880, 0xc181d46a, 0xb2dd670e, 0xb30ae8b7, 0xa2bfbb24, 0x62e9e0f7, 0xa368349d, 0xad81642e, 0x0777e3b1, 0x4eb38cae, 0xb4a988bb, 0x25105ce6, 0x47f9bc11, 0x9e5388ea, 0xface87a8, 0x9e870b57, +0x899234cc, 0x1e5f0f24, 0x1928ec95, 0xfa1a0415, 0x9f5084ee, 0xdfdedb4e, 0x3b9bd07f, 0x01d78fb9, 0x80d80473, 0xf5f058a2, 0xfd6de7a4, 0xd7436448, 0x1f88809d, 0xfb190811, 0x654a80fb, 0xcebf0b60, 0x579b603b, 0xc81f6768, 0x00000000, 0xaaf6879f, +0xc721b862, 0x735cb364, 0x87afe7c2, 0xdf0a58f3, 0x1616339f, 0x63eaecf3, 0xc91c6b6c, 0xd1e30840, 0x7c626c6e, 0x74ffd368, 0x8f3258c4, 0x34a50f75, 0xd8a938ff, 0xde0954f7, 0x728b3cdd, 0x3def3fca, 0x18ff632c, 0x90bad859, 0xed0f3b8e, 0x99246b5b, +0xc0565bd3, 0xe231e484, 0x623d634a, 0xabf58b9b, 0x07a3600c, 0x3c38b073, 0x6b7753f5, 0xec0c378a, 0x877b647f, 0x00d483bd, 0x0ee950b3, 0x81db0877, 0x7ac20066, 0x8ee5d77d, 0x725fbf60, 0x659e0346, 0x2d59605d, 0x7cb6efd3, 0x59a6b335, 0x19fc6f28, +0x6a745ff1, 0x408e5fa0, 0xebaf5786, 0xcfbc0764, 0x8678687b, 0xbb43d40c, 0x2267bf57, 0x2d8de3e0, 0x50380037, 0x7b158fdf, 0x6c00b044, 0xe5928488, 0xf25338ae, 0x5fd25c80, 0xbde3b804, 0xe4450b31, 0xab210826, 0x3205637d, 0x3b4f53c2, 0xb209e4b3, +0xad55e793, 0x6aa0dc4c, 0x2afa0051, 0xe491888c, 0x59723088, 0x8e3154c0, 0xc8cbe4d5, 0x4813e0a6, 0x6dd73ffd, 0x35a60371, 0x649d0f42, 0x2364b353, 0x3a98dc7b, 0x3a4c5fc6, 0x46fab015, 0x1161d02e, 0xb57e0702, 0x6d03bc40, 0xe5460735, 0xeb7bd43b, +0x24c7d35f, 0x56986c3f, 0x48c7631b, 0x50ec838a, 0xf35034aa, 0xe3e66b3d, 0x33066f79, 0x9827675f, 0xbce0b400, 0xc6f637db, 0x0674efb5, 0x34718cc8, 0x462e33a8, 0x75285cd1, 0xf384b717, 0x2c8eefe4, 0x405adc1d, 0x17153f9b, 0x86acebc6, 0x11b55393, +0x574fe386, 0xc9c8e8d1, 0x2a2e83ec, 0x5ed15084, 0x75fcdf6c, 0x513b0c33, 0xf287bb13, 0xcf6884d9, 0xc7f53bdf, 0x0f3edf0a, 0xa26b3899, 0x51ef8f8e, 0x6ba3d048, 0xd87dbb42, 0x3cec33ce, 0xe2e56739, 0xecd8b437, 0xba40d808, 0xa3bcb720, 0xfc6eeba0, +0x2bf90c55, 0xf524db1f, 0xd694ebf1, 0xd9aa34fb, 0xbd373bb9, 0xd640684c, 0x916d57e0, 0xeddbb833, 0xdeddd74a, 0x08493cbb, 0x472d3fac, 0x06a06c08, 0x1f5c0320, 0xa51cdb28, 0x4910eca2, 0x8845bb75, 0x7d61606a, 0x742b50d5, 0xd0e00444, 0xd97eb746, +0x094a30bf, 0x241350e2, 0xaa220422, 0xc622b466, 0x3f69c4be, 0x1cd01d76, 0x51405db2, 0x6e29990c, 0xa12ec2bd, 0x06e494e1, 0xd0afb49b, 0xc8a6cd54, 0x15b180e5, 0x5f8056c4, 0xe1067b53, 0x30eccdcc, 0xadd33993, 0xfc936421, 0x72f9847a, 0x62d46222, +0x1a348997, 0xd64b207a, 0xedfb807d, 0xfa77f0c0, 0x102de658, 0xc45b367a, 0xba5f492e, 0xcd3aabe9, 0x9c7af65b, 0x255d4d29, 0x1b718b93, 0xfb32f2c4, 0xd1eab69f, 0xfdd66625, 0xa90a5d2a, 0xc3faa09f, 0xb27bd6b9, 0x16c972b9, 0x69880fe9, 0x480c2679, +0xf4b7fbb6, 0x0ec00b76, 0x9e470603, 0xdd174db1, 0x32d13d94, 0x2b9d465f, 0xd88b2b0c, 0x04d964b9, 0x61ac907e, 0x9d3ff45f, 0x73bc867e, 0xf90f029c, 0xea5a1698, 0x9bdb60be, 0xdab6db54, 0x22fcdbcc, 0x6748049f, 0x537dadea, 0x3d5434e6, 0xc2bfa29b, +0x0378f25c, 0x4cd542c0, 0x68cd0ded, 0x951b6bc8, 0xf3166d53, 0x5cf8a498, 0x864e7fcc, 0xb33ed4bd, 0x70c47422, 0x3e2cc6ba, 0x43504bb2, 0x81efe929, 0xf2536f57, 0x8ab384e2, 0x91c20f71, 0xbe862d97, 0x2ad8445b, 0x9f020407, 0x92bafd2d, 0xbb1a4b2a, +0x80aaeb2d, 0xaa72af76, 0xdbf3d950, 0xd70e227e, 0xb5da405c, 0x3435a975, 0x0cfdfb2e, 0xb6a2b200, 0x5964c225, 0xcbde3f08, 0x2760bd71, 0x60e9927a, 0x84738f94, 0x3608592d, 0x83d21971, 0x38c8525b, 0x023df058, 0xa7ca565c, 0xe49a1dee, 0xe922e4c4, +0x3af5a203, 0x00000000, 0xde6fbfed, 0xb7e7b004, 0xa84f5f2e, 0xa25630e1, 0x85368d90, 0x421549b6, 0xe27e890f, 0x8d121207, 0x20c12b94, 0x5599390b, 0x4ee8b298, 0xf68a0bee, 0x4fadb09c, 0x178c70bd, 0xfeae9479, 0x33943f90, 0x01450204, 0x7765e2c7, +0x1d951f72, 0xc08252c3, 0x3bb0a007, 0x96639994, 0x945e69cc, 0xee837221, 0xd476d022, 0xdf2abde9, 0x31a9cfc8, 0x6d516b50, 0x7d7c8d08, 0x3570ab71, 0x6575f4c7, 0xa5f7a604, 0x7e047f54, 0x13551404, 0x6af0fdb5, 0x79a5e9b1, 0xb04626e1, 0x46cc2d0f, +0x0a196fcf, 0x9a9e62ba, 0xb10324e5, 0x0db8f92a, 0x1fa8ef2a, 0x5a1c3079, 0x82971b75, 0x7add1bed, 0x29a0b607, 0xbcbbddcf, 0xa31332e5, 0x23b9d9c8, 0x98a392e2, 0x2c3cd0ba, 0x5821c021, 0x4949247d, 0x4a31d621, 0x6c146954, 0xe867e6c0, 0x57a4c953, +0xdc524fb5, 0x4d9040c4, 0x8e6ae05b, 0xe0437957, 0xc723c426, 0x1168e45c, 0x374d5b29, 0x7c398f0c, 0x4028b9ee, 0x888e74ba, 0x6bb5ffb1, 0x741d109b, 0xb927bb72, 0xd533d226, 0x6430f6c3, 0x660d069b, 0xf7cf09ea, 0x416dbbea, 0xaeabcbcf, 0xf12b9d0b, +0x5238afee, 0x89cb76be, 0x71817626, 0x78e0ebb5, 0xe7e2efb2, 0x50055fb6, 0xb862b976, 0xc666c622, 0x8c571003, 0xecbe8279, 0x2d79d2be, 0x0f850972, 0xf5f2f9b2, 0xa06bc0b9, 0xf06e9f0f, 0x12101600, 0x194c7bcb, 0x28e5b403, 0x7558129f, 0x2e0120e2, +0x63916026, 0x08249f97, 0x7b9819e9, 0xe5df1fea, 0x2f4422e6, 0x5b59327d, 0xffeb967d, 0x56e1cb57, 0x8f2fe25f, 0x8bf686e6, 0x870b7dc8, 0xca9b3d0c, 0xbfc32f93, 0x97269b90, 0xeb1f149c, 0x4b74d425, 0xe6a7edb6, 0x180979cf, 0xc1c750c7, 0x0b5c6dcb, +0x54dc3b0f, 0x6f6c9b08, 0x90870d75, 0xc9e3cf50, 0x99e690e6, 0x5dbda69c, 0xefc67025, 0x2625bf75, 0x24184f2d, 0xcc7fa9ed, 0xd29244c3, 0xab37ad72, 0x47892f0b, 0xac963b97, 0x5ec554c0, 0x21842990, 0xbdfedfcb, 0xd9ce2908, 0x93ffff29, 0x14f482e1, +0xcf075bb1, 0xce4259b5, 0x09619d93, 0x07a196e5, 0x059c66bd, 0x44f1dd57, 0xb49f4258, 0xe33b8b0b, 0x398d505f, 0xa4b2a400, 0x45b4df53, 0xa68f5458, 0xf84a0098, 0xc51e347e, 0xafeec9cb, 0x3c1136e2, 0x7620e0c3, 0x1eeded2e, 0xd3d746c7, 0x7f417d50, +0x36268917, 0xc2ba23d2, 0x7b2f32ee, 0x63454230, 0x0067380c, 0x58ee2046, 0x279bfcdf, 0xc6e0cda5, 0xdab76b00, 0x2efd5a8c, 0x180d48d2, 0xe8cb0c60, 0x8b8e4e50, 0xe17b317a, 0x440825a6, 0x9ae5a0d1, 0x446f1daa, 0x4d09bbf9, 0x0d5b7028, 0xe5907c48, +0xcf50f0bf, 0x97bed0f9, 0x3ff18c01, 0x6ec8a951, 0xcb0a1ec8, 0x7f75dc99, 0xcbbbbd8d, 0x045aee77, 0xf0a17cbe, 0x00d69b49, 0x44debeef, 0xcfe153fa, 0x5838bb0f, 0x67c9370e, 0x585f8303, 0xd73a8061, 0x6e1e3218, 0x76c5e183, 0xa5c2b799, 0xb4a95918, +0x51efbe19, 0x1c813dec, 0x8fd4a027, 0xd3606e16, 0xa5142cd0, 0x4052cbd1, 0x63f4e175, 0x7bf9a9a7, 0x9a333b98, 0xa57314dc, 0x327c6760, 0xcf37c8b3, 0xb924b279, 0x7f12e495, 0x2ac08cf7, 0xfd4bafd3, 0x00b1a345, 0xd307561a, 0xe8ac346c, 0x8f650362, +0x97684bb0, 0xf91141a4, 0x40e36894, 0x231789e1, 0xb9f22930, 0x116bee81, 0xde8abd7b, 0x155638fa, 0xa82864f4, 0xe81d9729, 0xc20b8097, 0xa899c7b1, 0x9e69d5ef, 0xac15b28f, 0xa129faab, 0x3641b11b, 0xa8feffbd, 0xec204152, 0x93e43e8e, 0x7b9e91ab, +0x86649d3d, 0xaca411ca, 0xc6516ee0, 0x048c753e, 0x1580a3b3, 0xe87aaf25, 0x76137aca, 0xbd7e5c0e, 0xf97679a8, 0xf0c644b2, 0x97d9e8f5, 0xda61f049, 0x23a62aa4, 0x27fcc4d3, 0x18dbd39b, 0xd78b2324, 0x8b58d519, 0x09d70516, 0xf49caac5, 0x6af57f2a, +0x93559dcb, 0xc2dd1bde, 0xc687f5a9, 0xa84f5cf8, 0x86b20674, 0xc63656ec, 0x0d8deb61, 0x18bceb97, 0x515e1d5c, 0x76a2d98f, 0xe546e701, 0x8f023b6e, 0x09019e5f, 0x04eb4d32, 0x1c309ea9, 0xde3b1e3e, 0x6eaf915d, 0x44b986e3, 0xd3d1cd53, 0x5c056d74, +0xecf6da1b, 0x51392550, 0x55d26862, 0xe5f74444, 0xfd9d349a, 0xec91e217, 0xe1ca923f, 0x11da4dc4, 0x3f96b40d, 0x6393d979, 0x09b03d1a, 0x823e734a, 0x9ebf4ea6, 0x4953558e, 0xac728a83, 0x8603a531, 0xcb6d26c4, 0xf9c7daed, 0x2a1617be, 0x1ce605e0, +0x32aafc29, 0x5504f32b, 0x2e9a6280, 0x3b1ac133, 0x8b3fed15, 0xa5a58f95, 0x49346d82, 0x110cd68d, 0x67ae0f02, 0xe1adaa33, 0x36f0125e, 0x40845098, 0x6a44dc6f, 0x82594b46, 0x2e2bc1c5, 0x55b5506e, 0x3f271748, 0x8be9765c, 0xec47795e, 0xd75db86d, +0x93830682, 0x3b7df93f, 0x724994bd, 0xe11c0976, 0xbd196402, 0x00000000, 0x9332a5c7, 0x0dead36d, 0xd7ec1b28, 0xcbdc8581, 0x9a8298dd, 0x5cd3f63d, 0xb0252c26, 0xb0f3b76f, 0x9a540394, 0xbdcfff4b, 0xf42d0980, 0x4035f3dd, 0xf077e7f7, 0xdad0530c, +0x0966a653, 0x32cdc425, 0x4d6e83f5, 0x4ddf20b0, 0x5889184a, 0x6a924726, 0xe521df0d, 0xacc329c6, 0xb0948f63, 0x86d53e78, 0x3bcc5a7a, 0xde5c2632, 0x1c57a6a5, 0x9e0eede3, 0xcf866bf6, 0x828fd00f, 0x043dd67b, 0xb9438a75, 0x4985cec7, 0x4db818bc, +0x2aa7b4fb, 0x63227a3c, 0xf4fb92c9, 0x7b480ae2, 0x36972a52, 0x153100f6, 0x970f73bc, 0x15e79bbf, 0x8fb3982b, 0xb47fc251, 0x767442c6, 0x3bab6276, 0x274d6796, 0x51888615, 0xa1ff61e2, 0xfd2c97df, 0x82e8e803, 0x2e4cf9c9, 0xdeed8577, 0x671fac47, +0x722eacb1, 0x2370b1ed, 0x6a23e463, 0xb042142a, 0xa19859ee, 0x5cb4ce31, 0x186a70de, 0xb418fa5d, 0xb4ce6114, 0x11bd75c8, 0x9ed876aa, 0x49e2f6cb, 0x5c625578, 0x3f402f44, 0xb995113c, 0xda06c845, 0x7fa347d0, 0x7fc47fdc, 0x0d3c4824, 0xf44a318c, +0xc26cb89b, 0x23c112a8, 0x6e790a14, 0x2a712fb2, 0x729f0ff4, 0xa14ec2a7, 0x6778944b, 0xf010dffb, 0x72f837f8, 0x321b5f6c, 0x5563cb27, 0xf9a0e2e1, 0x272a5f9a, 0xbda8c747, 0xd3b6f55f, 0xfdfa0c96, 0x03de3728, 0xa9655454, 0x4747b87e, 0x6d7a19ba, +0x0478c5be, 0x5158308e, 0xd4a2ede0, 0x528607a6, 0x2cbe4735, 0x54242f58, 0xd325d179, 0x2e64aa75, 0xbf7adca4, 0x29c258e3, 0x56df0c17, 0x97bc5e2f, 0x6e85e09d, 0x459d553e, 0x385aec8a, 0xfc45a164, 0xc51b9786, 0x4662ac19, 0xbb23d715, 0x0683e6f1, +0xc53a5989, 0x15c1bfd8, 0xbc852583, 0xfac64795, 0x85fadd6e, 0x00000000, 0x04590bb1, 0xc3987177, 0x2a1c6fcb, 0x2dba9d5d, 0x81a3d6df, 0x433f7dc0, 0xea5a2994, 0x11b97a66, 0xf83d64da, 0xafe6b2a5, 0x92c041f9, 0xd200c51e, 0xa9449a5b, 0x6bf9ff4b, +0xe9841ebc, 0x3ba515ad, 0x9443a708, 0x95477d60, 0x84fe0706, 0xef263642, 0x3c222934, 0xa8618e3c, 0x6bd83144, 0x825c2ff8, 0x40c084e7, 0x57dbd67f, 0x2b397bac, 0x5405e157, 0x3c03e73b, 0x6fa0f4fa, 0x85db1361, 0xeb5ef3fc, 0xac194b82, 0xd2210b11, +0x7de677bb, 0xaabb637c, 0xc046465f, 0xad3c5fe5, 0x7cc363dc, 0x44998f56, 0x911e76d1, 0x52a7c9a9, 0x799eb205, 0x423ba7a8, 0x979d9020, 0x7e384093, 0x3ffc1e1c, 0xecf8016a, 0x6afd2523, 0x913fb8de, 0x3d26f35c, 0xa8404033, 0xf91870bd, 0xad1d91ea, +0x7f1d54f4, 0x3d073d53, 0x40e14ae8, 0x6ea42e92, 0x6f813af5, 0xbe5fc8c3, 0xd48323ef, 0x789a686d, 0xfbe353f2, 0xaa9aad73, 0xc7c17ac6, 0x2a3da1c4, 0xecd9cf65, 0xc3b9bf78, 0x93e5559e, 0x28e74c84, 0xfe9f4c24, 0x8358f590, 0x6806066c, 0x8701fe21, +0xee22ec2a, 0x3a8001ca, 0x0104da68, 0x96b88447, 0x3ed90a7b, 0xfebe822b, 0x2d9b5352, 0xd1def236, 0xfd417b0c, 0x9566b36f, 0xafc77caa, 0x41e59080, 0xd659ceaf, 0xd67800a0, 0xb9d8f45a, 0x55013b3f, 0x6902dc04, 0x44b84159, 0xba06c372, 0xaec3a6c2, +0xbd81ffeb, 0x7a614b22, 0x6827c863, 0xd5a63788, 0xc1635238, 0x507d24e9, 0xc6c5a0ae, 0x6d5bd7b5, 0xfbc29dfd, 0x6c5f0ddd, 0xd75d14c7, 0xc1429c37, 0xf939beb2, 0x5179fe81, 0xe8a10adb, 0x7b65914a, 0x387b2285, 0xbe7e06cc, 0xbf5b12ab, 0x93c49b91, +0xbca4eb8c, 0xea7be79b, 0xac38858d, 0x12674d4e, 0x13639726, 0x163e46ff, 0x161f88f0, 0x8086c2b8, 0xc2bd6510, 0xab9e771b, 0x80a70cb7, 0xedfcdb02, 0xd587f987, 0xc0678850, 0x901aacb9, 0xb9f93a55, 0xc6e46ea1, 0xfc646f6b, 0x07873c99, 0xff9b964c, +0x505ceae6, 0x83793b9f, 0x6adceb2c, 0xf81caad5, 0xabbfb914, 0x14c565b0, 0x02fb234f, 0x8624ea46, 0x397ff8ed, 0x78bba662, 0x6923120b, 0x56fec218, 0x6c7ec3d2, 0x02daed40, 0x96994a48, 0x84dfc909, 0x53a313c1, 0xb8dc2e32, 0xe9a5d0b3, 0x7a40852d, +0x173a9c97, 0xfae7899a, 0x03fff927, 0xd77cdac8, 0x421a69a7, 0x41c45e8f, 0xbda031e4, 0x057c1fd6, 0x395e36e2, 0x3fddd013, 0x01251467, 0xc43e83e1, 0x10bda00e, 0x7b445f45, 0x79bf7c0a, 0xe880c4d4, 0xfd60b503, 0x3ef8c474, 0x2b18b5a3, 0x109c6e01, +0x14e4abbf, 0x28c6828b, 0xd3041f76, 0x7f3c9afb, 0x13425929, 0x86052449, 0x818218d0, 0x57fa1870, 0x7dc7b9b4, 0x827de1f7, 0x055dd1d9, 0x2f41be12, 0xd0da285e, 0x7e198e9c, 0xeddd150d, 0xeb7f3df3, 0x46436216, 0xb8fde03d, 0x47667671, 0x1198b469, +0x2e45647a, 0x12468341, 0x3aa1cfc5, 0xef07f84d, 0x0021ce0f, 0xffba5843, 0x15e071d7, 0x2c9f893a, 0x903b62b6, 0x2f60701d, 0xc41f4dee, 0x7ce2add3, 0x171b5298, 0x45bc9b31, 0x431eb3cf, 0xc7e0b4c9, 0x06a228fe, 0xee032225, 0xaee268cd, 0x5520f530, +0xd0fbe651, 0xba270d7d, 0x8720302e, 0xc29cab1f, 0xbb02191a, 0x29e396ec, 0xd1ff3c39, 0x94626907, 0x5382ddce, 0x07a6f296, 0x3b84dba2, 0x92e18ff6, 0x354d80c9, 0xe7569c04, 0xad44c2f4, 0xdf1f5d0b, 0xdc864ea0, 0x1efd2d4e, 0x20e012f5, 0x75d84718, +0xf1621d93, 0x536cab59, 0x928edb1c, 0x78dc06de, 0x498b4d5b, 0x71c28c54, 0x7e88f86a, 0xb020fc11, 0x66212b90, 0x3c530a43, 0x84ba5a8b, 0xe29b711b, 0xb26ec9e9, 0x091e8a8a, 0xee48168e, 0xfe2869ad, 0x57766015, 0x4142e182, 0x4d918617, 0x041acb4c, +0x52bb8d0a, 0xd601d781, 0xdec87b58, 0x024e35f8, 0x039913ab, 0x5fbfcccc, 0x0783d8e7, 0xfdb17a06, 0x89be1b4d, 0xa197a561, 0x430cd47a, 0x17e3a7c4, 0x82eea43f, 0x1f2a0b1d, 0xeb85fb91, 0x9a4777c5, 0xb43a375d, 0xc3ac45bd, 0xc42f9d5a, 0x4bc578a3, +0xec062376, 0xd598c42a, 0x4c46a044, 0x33197e7d, 0x1ae7e602, 0xc5f8bb09, 0xd44fe279, 0xa95e09b8, 0x213734a6, 0x96941050, 0x22ae270d, 0x2c337560, 0x80a091c7, 0x56a14646, 0x790b208d, 0x5df1f934, 0x42dbf229, 0x2829be2c, 0xe0d544e3, 0xc0355616, +0x485c6b08, 0x7cc6cd92, 0x764154b3, 0x2763ca12, 0xe10262b0, 0x0d0441c6, 0x4fdfb3ef, 0xc8fcfacf, 0x252dffea, 0xbb704363, 0xc661a8a2, 0x8177b794, 0xfbe584b2, 0xc1e27045, 0x7d11ebc1, 0x6af24c05, 0x13f96c88, 0x24fad9b9, 0xb67402a5, 0x0cd36795, +0x31574b85, 0x738cb9ac, 0x349aa69a, 0x87234920, 0xcd3117d0, 0xfc665c55, 0xa0408332, 0x4095c7d1, 0xf32c286b, 0x86f46f73, 0xa7c35bd5, 0x553855ed, 0x9b905196, 0x32ce582e, 0x4a125ef0, 0x18a9d3fa, 0x3d842c10, 0x2faa66cb, 0xc27b63ee, 0x8c73f652, +0xa3d99099, 0x6075d524, 0xbcf39b84, 0x8feae5f9, 0xedd10525, 0x00000000, 0x2bb0ad87, 0x67f60dc3, 0xd94ba3bf, 0x30806dd6, 0x46c13965, 0xdad2b014, 0xcf7f2228, 0x8a2708e6, 0xd89c85ec, 0xa8892feb, 0x3a07f4f7, 0x3fca19e8, 0x9dc4af22, 0x725b9fff, +0xb3b9efba, 0x29fe987f, 0x97433603, 0x5a7221d3, 0xdd5168f3, 0x3849c10f, 0xef9f30dd, 0x94da25a8, 0x16348197, 0xc7b68ef1, 0x26b4ec41, 0x8da4d001, 0x0e9d526d, 0xb8e950c8, 0x08c9acd9, 0xea52ddc2, 0xac93e4a7, 0x9e5dbc89, 0x3e1d3fbb, 0x5e68ea9f, +0xcea8047b, 0x90c0eee4, 0xc92bdc9c, 0xf6e1c574, 0xe9cbce69, 0xf87c9719, 0x6ee88749, 0x47161f36, 0xbebdae7c, 0xcab2cf37, 0xe81ce83a, 0x122e4adb, 0x0654feb4, 0xa6147d86, 0x5c26df67, 0x3703b531, 0x448f0c9d, 0x2379015e, 0x05cded1f, 0x3bd0d2a4, +0x2de45333, 0x0a879921, 0x9f8a9ada, 0x623be0dc, 0xbd24bdd7, 0x15ad923c, 0x36d49362, 0xf9abb14a, 0x9c138971, 0x7b451575, 0xaac71a13, 0x1b30c051, 0xffff4ffe, 0x01d72653, 0x696b5fae, 0xd7d6f1d2, 0xa20eb6ca, 0x65b8383b, 0x0b50bf72, 0x2e7d4098, +0x9809423d, 0x583c142b, 0xd0552935, 0x9117c8b7, 0xab103c40, 0xbf6a882f, 0xa45a487e, 0xb1f7da42, 0xe34c5748, 0x10607f23, 0x950d03fb, 0x4e0895bc, 0x0f4a743e, 0x45582ace, 0x11b75970, 0x59eb3278, 0x7a923326, 0x646f1e68, 0x88693d1e, 0xd1820f66, +0xb7a324f6, 0x147ab46f, 0x7015aa07, 0x1d643ee5, 0xa58d6e2d, 0xcce63183, 0xb5ed110e, 0x61a2f377, 0xbaa76530, 0x6d7194e2, 0x54ef73be, 0x2a678bd4, 0xaf0af70c, 0x8339826c, 0x63ecc68f, 0xdb059647, 0x8bf02eb5, 0xd3cc3a9e, 0xe518a9fc, 0x68bc79fd, +0x6f3fa11a, 0x399ee75c, 0x740f614b, 0x1cb318b6, 0xfa32a2e1, 0xb93e769b, 0x779672e0, 0xe4cf8faf, 0xf2fb0e38, 0x197ef5a9, 0x6ca6b2b1, 0x99de646e, 0xf4aff08c, 0xd21b1ccd, 0xcb65e964, 0x5ba50780, 0x51229ea1, 0xf578d6df, 0xe681ba57, 0x7f5fde39, +0x8e3dc3aa, 0x856d7cd8, 0x9359fd4f, 0xf0b53bc0, 0x50f5b8f2, 0xf736e327, 0x6b256a56, 0xaeddd15f, 0xbac880f2, 0xdacad0d3, 0x42763c40, 0xd52f1852, 0x85ac6e07, 0xed63a3ff, 0xa0f0573e, 0xdab85afe, 0x83c22440, 0x4bfdbe86, 0x68cfcdf8, 0xeb0de9b8, +0xb419dd41, 0xa7d80266, 0x73b1052b, 0x1c2417a6, 0xb46b576c, 0x6fe798a0, 0x08cd9dd9, 0xae5380a0, 0x97592412, 0x098b82c6, 0xa1c4c20c, 0x6ea187bf, 0xec25bce0, 0xd469074d, 0x73c38f06, 0x4abba199, 0x7a480dc0, 0x2d91a4e0, 0xbcd44098, 0xdca49a94, +0x569fb63f, 0xdde2858b, 0x666c1a66, 0x2468ac0b, 0xbde0d5aa, 0x50837655, 0x44187607, 0x2de32ecd, 0xa9095fd5, 0xdd900fa6, 0xa83dcae7, 0xe3b2fe4c, 0xf8bebcb2, 0xb2051d2b, 0x37dbf901, 0xa6ec9754, 0x67588f54, 0xc7da5247, 0x4cd5ebde, 0x455e6918, +0xbb8e9fed, 0xbd925f87, 0x584eeb8c, 0x4de17eec, 0x30f3ac59, 0xf75b7433, 0xe5dcb40b, 0x2cd7bbff, 0x1a38d7cc, 0xeb7f6395, 0x00728a2d, 0x8a49a686, 0x390aa4b2, 0xd333d838, 0x066e4a47, 0x583c61a1, 0xff96e9ea, 0xc69c4d58, 0x01349532, 0x30812674, +0x2340f953, 0x672a0579, 0x91376e55, 0x1b7ec8d3, 0x5f66bed4, 0x69fb58ca, 0x6136c513, 0x98bcec93, 0xdbfe45e1, 0x72f71a34, 0x98ce66be, 0xc0f2071f, 0x83b0ae6d, 0x13c1df27, 0x82f6b172, 0x57ab230d, 0xea397c8a, 0xf147b459, 0x31b5b346, 0x8d61f3de, +0x7d12d2b5, 0x7b7c98f2, 0xec5736cd, 0x5908f493, 0x252eb314, 0x2acb7b95, 0xaf671592, 0x4ca761f3, 0x446afc2a, 0x7b0e12df, 0xa082dd13, 0x39782e9f, 0x4342a972, 0x00000000, 0xc1b41800, 0x6989d2e7, 0x452ce335, 0xd3415215, 0x3f1664d8, 0x75df4f6c, +0xa1b64821, 0x149b0052, 0x57d9a920, 0x255c3939, 0x31c7396b, 0x8c5566ec, 0xf61d6b2c, 0x15af9560, 0x6ed30d92, 0xb2779706, 0xe4e82139, 0x6070da0c, 0xaf159fbf, 0x09f908eb, 0xa7aa884b, 0x2206e64c, 0x966db120, 0x13b3550a, 0xce51d081, 0xd55d927f, +0x2ca531d2, 0x1a4a5de1, 0x7c264787, 0xb52d4873, 0x998879a1, 0x9071714a, 0x9145e478, 0x1d108294, 0xcf6545b3, 0xd275c727, 0x2ab9f1b8, 0x51b7e367, 0x60025021, 0x68bd47d5, 0xb3430234, 0xcf17cf9e, 0x4204b66d, 0x2332737e, 0x4d93f4c1, 0xa69e1d79, +0x5e522be6, 0x1b0c42fe, 0x37a9732c, 0xc83f9ac6, 0x9003fb67, 0x9ed2a6d4, 0x99faf38c, 0x075adf75, 0xdb8ccfcc, 0xb3318819, 0x7d605898, 0xfed0f6f5, 0x9fe633e6, 0x1287c038, 0xe2f4e153, 0x383e3180, 0x4ac92bb4, 0x9ea02cf9, 0x961f3b0d, 0x12f54a15, +0xf66fe101, 0xea4bf6a7, 0x2b8d648a, 0x07285558, 0xce235aac, 0x972bae3f, 0x7a3a87ed, 0x56ed3c12, 0x1c569d8b, 0x50f1fc78, 0xdcd610b9, 0xf9f8a3ad, 0x0f9742ac, 0x0ea3d79e, 0xc7a8d86a, 0x369de61e, 0xe5ae3e26, 0x8c27ecc1, 0x3f64eef5, 0xae210a8d, +0xf98a2980, 0xfea27cd8, 0x8a3b2cab, 0x2bffeea7, 0xa97bd5f8, 0x8d1379f3, 0xbca6cab5, 0x9f94b9cb, 0x8b7d33b4, 0xbaba0adf, 0xe3c07461, 0x1d6208b9, 0x3e507bc7, 0x15dd1f4d, 0x51c5694a, 0x661e904b, 0xa84f40ca, 0x0fe5c881, 0x85dee42a, 0xf8cc369f, +0x74ebda5e, 0x597a7ebe, 0xf073216b, 0x08bf17f4, 0x7c54cdaa, 0xc6eec775, 0xd41b8d60, 0x84ea7118, 0x01461f1f, 0x6f95128d, 0xed1129d2, 0x72859019, 0xffe463c7, 0x82843b5f, 0xe2866b7e, 0x5e20a1cb, 0x5f1434f9, 0xbbfc15c0, 0xf1353e74, 0x4330235f, +0x8b0fb999, 0x384cbbad, 0xf001ab46, 0x22746c61, 0xb55fc25e, 0x61444f3e, 0x3e22f1ea, 0x4b8f34ab, 0xc90b0ff4, 0xc97985d9, 0x061cc06a, 0xe49aab14, 0x8498fb35, 0xc84d10eb, 0x14e98a7f, 0x75adc541, 0xc0808d32, 0xd2074d0a, 0x0ed15db3, 0xc1c6922d, +0x241a2626, 0x74995073, 0x36ef6c33, 0xf729fe1e, 0xbeab60c8, 0x99e69f62, 0x333e3988, 0x47df529c, 0x26445cd6, 0x1dc42315, 0x8cd34ee3, 0x75e8c868, 0xa89c9db1, 0xc3fdeeeb, 0x1771eada, 0x75a77cb7, 0xdd7455d9, 0x59195d71, 0xc8418458, 0x62d6966d, +0x1c8234b6, 0x52ea831d, 0xf9743254, 0x6b2ec785, 0x3135b60c, 0x32782e2b, 0xf93b868b, 0x98a088c1, 0xa12b7886, 0x74e16b14, 0x53e32061, 0x143c72fd, 0xc9482724, 0xe4b01141, 0x7d568e23, 0x1fcfac91, 0xf87d9128, 0xabd10596, 0x46d6f1e0, 0x7f12b578, +0x52a537c2, 0x4c63382f, 0x0109a37c, 0x39c44498, 0xbfa2c3b4, 0xbca0ef4c, 0x8ed8c167, 0x4f2ea008, 0x876f2450, 0x6a2764f9, 0xd5ca1392, 0x852b1f0b, 0xd6878bb5, 0x459b69c7, 0x619b0e4a, 0xc1f6616f, 0x8666872c, 0x8e9775b8, 0x4d6a9b53, 0xe4ffa59e, +0x68635fa2, 0xb71c85ff, 0xd4c3b0ee, 0x4790e643, 0xf2c858e7, 0xed4840a9, 0x4699453f, 0xc80e3087, 0x4c2c8cf0, 0x50e10c99, 0x9158d929, 0xbde6f8ef, 0x2eb5ae42, 0xbee4d417, 0x303c1570, 0xdc32427a, 0xf1ca741f, 0xc1b9d5b0, 0xec41e3d5, 0xe5f606e2, +0x77e347ec, 0xf3c1fb9b, 0xd585a74d, 0x2cf19519, 0xfa761eac, 0x846d08a8, 0xc2bbf948, 0xdf306e82, 0xa229547e, 0x167849a6, 0x034d9827, 0xb5170a7b, 0xca05bf03, 0xbda94c30, 0xdf7fda5d, 0x08f1f294, 0xab9eb149, 0x45d4dd18, 0x3ac66860, 0xbfed776b, +0xef0c7bf2, 0xa06d6f25, 0x98ef3c1e, 0x9ae4b39a, 0xcb43a8a0, 0xb4511dd8, 0x2df83665, 0xaa971235, 0xb6152683, 0x7e54a2db, 0x76a5504f, 0x33718d57, 0xa320f702, 0x7f5d01a7, 0xa8d3296e, 0xa266e0a1, 0xd78e28c9, 0xc0ffc213, 0xbcef5b93, 0x9aab0745, +0x014617a3, 0x004fb4df, 0x1535d181, 0x6a68d026, 0x91176df6, 0x629922b2, 0x5b5d662a, 0xef43cf2d, 0x4d252f8c, 0x8d955940, 0x09b7e537, 0xf38e4f44, 0x1f80184e, 0xfa39aa73, 0xf185c0c0, 0x8c9cfa3c, 0x9215410e, 0x08be464b, 0x5810fe0d, 0x173e5e05, +0x61d4ba95, 0xc0b076cc, 0x1ec60fed, 0x244fd352, 0x03022cf8, 0xa9da8a12, 0x4e68b7ab, 0xf0c3d763, 0x585f4ad2, 0xb41ea907, 0x1637fd79, 0x6092ad36, 0x2cbe21c6, 0x60dd19e9, 0x5a54c556, 0x1ccd8069, 0xe7fd8966, 0xe6bb9ec5, 0xd7c19c16, 0x7c5f2d5f, +0x50aeb846, 0x00000000, 0x5956e9ae, 0x3073a1af, 0xb65a925c, 0x3bcfcb1c, 0x09f851e8, 0x639081ce, 0x99a92bbd, 0x74aedfcb, 0xf287ec38, 0xe6f42a1a, 0x38cde7e4, 0x8f9ed6c4, 0x317a02d3, 0x90517a55, 0x862933f3, 0xc2f44d97, 0x2400678d, 0x7e1b1604, +0x0ab5c9cf, 0x51a71b3a, 0x8422bc77, 0xa022dbfa, 0x5b12d2f5, 0xdd3be106, 0xb7533120, 0x1473c622, 0x27024b75, 0x0bf3de6c, 0x4f6114d7, 0xc90793fb, 0x9bed10e6, 0xc3b25a34, 0x32379af4, 0x44dd7e64, 0x696afcde, 0xe5b9b23d, 0x2ff3b9e1, 0xa36f43dd, +0xf83225f7, 0xee05d88e, 0x274dffaa, 0xdc7df6a5, 0xfb7fbdd0, 0x398bf047, 0x3b807fc3, 0x76eae490, 0x9ba2a439, 0x4e270374, 0xca4a0bdc, 0xec0e570a, 0xde39cdfe, 0x6b61735a, 0x63df3511, 0x682ceb7d, 0xe7b23db9, 0x157a655e, 0x7c109980, 0x931ce272, +0x02443b5b, 0x925af5d1, 0x935356ad, 0xa164cc59, 0xed07f476, 0x2efa1a9d, 0x69254801, 0x7d193afc, 0x8564abd4, 0xfb30090f, 0xa9953ecd, 0x3882533b, 0x2509c4f1, 0x8720908f, 0x4492cabb, 0xde767921, 0x0bbc6ab3, 0x53ac94be, 0x5a1b7189, 0xaad8a6ea, +0x0afa7d10, 0xee4a6c51, 0xf08c63bc, 0x901ece8a, 0x3a89dcbf, 0xb558bea4, 0x2db782ba, 0x260be809, 0xd6c83f6a, 0x1d8b97ca, 0xd48c0431, 0x51e8afe5, 0x1e89bb32, 0x2546702e, 0xcb0c1c7f, 0x77acf333, 0x8ddaed9f, 0x2fbc0d3e, 0x8fd1621b, 0x020b8f84, +0x1354f564, 0xdaba7e89, 0xc9ee8bed, 0x852ad8e4, 0xaab90f56, 0x374784ab, 0x8cf434ef, 0x45482910, 0xb8db05fe, 0x3623ed75, 0x3faf976c, 0xc8d87421, 0x5f90a66d, 0x5caa85c5, 0x0ae4cfa3, 0x19b03ac7, 0x3ecbfeb2, 0x5cf813d7, 0xc062f1f4, 0xeff12646, +0x68d722c6, 0x0bd2306f, 0x033a23a8, 0xb1577fe7, 0xe4231629, 0x78b9f40a, 0x1886c50b, 0x098c7a19, 0x12309cba, 0xd05eb12a, 0x8ef8e88b, 0x3df1dd1a, 0xbbb3b044, 0xaaeb9944, 0xf6138a93, 0x46720ab8, 0x451abf02, 0x08e813c7, 0x87749292, 0xdb8c8145, +0x347da703, 0x18d45319, 0x6bbf977c, 0xd200fb5c, 0x7bd141b0, 0x25258e03, 0x25771811, 0x3cc722d6, 0x69e1dd0a, 0x6885b4d4, 0x5fc2307f, 0x798f0bc6, 0x9472f1e4, 0xf41f56f7, 0x603f3101, 0x4ec88f6d, 0x9ff25799, 0xa2038a83, 0x79dd9dd4, 0xb23fca5d, +0xd8e434ff, 0xd2526d4e, 0xe67d5c5f, 0xb105e9f5, 0x4df2acc5, 0xb9edfa32, 0x020cdc64, 0xedaf6c30, 0xbad7d99a, 0x700371df, 0xc23cbb82, 0x5ef4cfb3, 0xc30a444e, 0x4c96c51b, 0xf6411c81, 0x615b58df, 0x4da03ad7, 0xcbb0c19b, 0x9dac1def, 0x6bed016e, +0x8610fb4c, 0xeec7d98a, 0x971a445e, 0x2ef7be6c, 0x54100010, 0x0136ffcc, 0x8d905d31, 0x4e9a197f, 0xe471803b, 0xa8e74520, 0x85784ef6, 0x736bc465, 0x844eb13a, 0x261fadab, 0x5d9c7a09, 0xc9bc1dff, 0x71358e13, 0xca863e57, 0xf57b3f29, 0x00000000, +0xa139a92b, 0x69b34b18, 0x36717b67, 0xf529a93b, 0x3519cedd, 0x0b80a67d, 0xc106982a, 0x3ffd017e, 0xcbe25789, 0x6233ed65, 0xefa3b054, 0xdae8e89b, 0x2441e7dd, 0x630512a9, 0x442c40ce, 0x4ffe70a1, 0xd13ad8f4, 0xdbde1757, 0xa16b3f39, 0xa9832cfe, +0xb26d5c4f, 0x557469ce, 0x86426d5e, 0x47166366, 0xa05dc0f5, 0x0ab659b1, 0x12620aa8, 0xa367e35d, 0xd9805d21, 0x7ae7be7c, 0x3da34b08, 0x942067f6, 0xab8ff09a, 0x71671801, 0xc26e2d90, 0xb88993ec, 0x8fce1747, 0xa2511c91, 0xc358d25c, 0x5dceec1b, +0xc03067e6, 0xc1540e38, 0xfcf74530, 0xf44dc0e5, 0xd1684ee6, 0x4cc45309, 0x8f9c8155, 0x2d9f0bd6, 0xa9d1baec, 0x8eaa7e99, 0x00529612, 0xb3093591, 0x025e4a76, 0x561cdc74, 0xf777e34d, 0x87260480, 0x46209caa, 0x9c9ae223, 0x2ca9f41a, 0x967e2d80, +0x572a23b8, 0x841c2728, 0xc88ae233, 0x277bc475, 0xe62fca4d, 0x1ad88f7d, 0x342f3111, 0x0368b5ba, 0x19e2acd5, 0x447ed6dc, 0x110abf12, 0x962cbb92, 0x73395277, 0xbbe12656, 0xfea90f46, 0x106ed6cc, 0x264d3bb9, 0x9cc87431, 0x6a8968b0, 0x27295267, +0x354b58cf, 0xeccb05ee, 0xfd932cee, 0x371512b9, 0x9748d24c, 0xffcd6698, 0x1bbce6a3, 0x1a8a196f, 0x9fa0c18b, 0x5ea659a1, 0xa335754f, 0xa8b5d332, 0x3e9968a0, 0xee954f98, 0xb9bf6c20, 0xabdd6688, 0xe515e9e5, 0xa00f56e7, 0x78eb6218, 0x9ec4a855, +0x606da713, 0x725d3ba9, 0xcad4a845, 0xd00c2738, 0xfca5d322, 0x6adbfea2, 0x62617b77, 0x7ab5286e, 0x7b83d7a2, 0xd3360490, 0x54429602, 0xff9ff08a, 0x8dc2cb23, 0xe7193581, 0xd9d2cb33, 0x9dfe8bfd, 0x9e963e47, 0x13066376, 0x2fc141a0, 0xfefb9954, +0x635784bb, 0x7051e7cd, 0x241371cf, 0x95440e28, 0xf725755f, 0x4face6b3, 0x2dcd9dc4, 0x2f93d7b2, 0xec9993fc, 0x11582900, 0x5526ffdc, 0x2ea5287e, 0xe74ba393, 0x1bee70b1, 0x09deec0b, 0x103c40de, 0xba854f88, 0x6109cecd, 0x564e4a66, 0x720fadbb, +0xb35ba383, 0xe5477ff7, 0x3c95b4c4, 0x2cfb6208, 0x08ba85d5, 0xedfdfa22, 0x8ca6a2fd, 0xb061802b, 0x5778b5aa, 0xb0331639, 0x016469de, 0x9516983a, 0xd3649282, 0xfdc1bafc, 0x4744f574, 0xd8b6a2ed, 0x193785aa, 0x2901c3f3, 0x99a47eeb, 0xb0a5bd18, +0xcc8ef0a6, 0xe2423b07, 0x1f1dbee3, 0xbdcc5255, 0xd1869d0a, 0x1cef5eb7, 0xe057e848, 0xf5eeb1b4, 0x44ac3fb7, 0xf40982af, 0x8fefc743, 0x8093fb41, 0x7142a2f3, 0xd5b9750c, 0x8822cf11, 0xe3a5081c, 0x0956074b, 0x0f7c3c02, 0x0c8edc56, 0x9f8e45a2, +0xfcb8b6ff, 0xbc2b614e, 0x2057c4b8, 0x7dcc7ea5, 0xecd9341e, 0x15b959fc, 0x6dadfc44, 0x4fefebb3, 0xc3f2cca4, 0x32239516, 0xba015a07, 0xfd5f85e4, 0x61232012, 0xe901ef03, 0x03f2e054, 0xcb43f8f4, 0x9d9b96ed, 0x973f71f2, 0xbbe6691c, 0x106182e1, +0x145e6ae7, 0x50f25550, 0x573f5d02, 0x28e6f0e8, 0xd8d09a41, 0x875ef313, 0x98434df0, 0x67091b5b, 0xc7cd24a2, 0x9c7ca5f6, 0xc5d8f7ed, 0x5e695a49, 0x01e7331b, 0xdf1d9213, 0xb9f3ba53, 0x552a8e4d, 0x0e9b0f19, 0x8dfa140c, 0x9a569ebf, 0x69921442, +0x8174c85a, 0xf7fb62fb, 0x0d69ef4d, 0xc8b118a0, 0x7fd9adea, 0x258f1fa5, 0x24682cbe, 0x0215d34f, 0x6336f35d, 0x35ee9d44, 0x37fb4e0b, 0xdd08415c, 0x90f279a0, 0xa51ce4e4, 0xd937a95a, 0xcf7c10f2, 0x5bb18154, 0x56d86e19, 0x89c5fc0a, 0x164bb9a8, +0xc0002cf0, 0x1d086dac, 0xf8875ef9, 0x8bd02f45, 0x2cd918ee, 0x1efa8df8, 0x4dfa38fc, 0x7a0176f7, 0x2ecccba1, 0x776899ba, 0x58436100, 0xe67dd301, 0x00000000, 0x3a92a146, 0x21b0f7a3, 0xdcef7247, 0x3d5fa914, 0xe79ae01a, 0x60c41309, 0xb68f8651, +0x1b2256e5, 0x2af323a7, 0x0b43d404, 0xef2bd44a, 0x9e6976b9, 0x768faaa1, 0x6b87c70d, 0xdefaa108, 0x3f4a7a5b, 0x33c4a60d, 0x930099f4, 0xa8750ba9, 0xb2b06e57, 0xb1428e03, 0x66ee2840, 0x92e7aaef, 0x3cb89a0f, 0x1186b1fa, 0x749a79ee, 0x062a3b49, +0x46b9ecf8, 0x4822e3e1, 0xf3c48afd, 0x49c5d0fa, 0x59a4521b, 0xeb143c4c, 0xd061ae11, 0x96d842e9, 0xf223b9e6, 0x224217f7, 0xdb227a15, 0x454b0cac, 0x70a591e8, 0xdac5490e, 0xbe3eb201, 0xed3e0705, 0xc215ffbf, 0xc62a17b9, 0x2d3e2bf5, 0xd2747d5e, +0x5300b504, 0xeaf30f57, 0x30364659, 0x952aa2bd, 0xf9606de2, 0x07cd0852, 0x127451ae, 0xb57d6605, 0xeecce751, 0xcd69c3bd, 0x7c2b4dbe, 0xf0366aa9, 0xa99238b2, 0xab87ebfd, 0x5d9bba1d, 0xc43fc4f6, 0xa70937ab, 0xd64b9558, 0xe1b0db53, 0x84ac1347, +0x08b13450, 0x17ac8ab3, 0x4c1d0be7, 0x8a371c5e, 0xae5f30e0, 0x4093d7b1, 0x3409ae5f, 0x436137e5, 0xbfd9811a, 0x361c7d10, 0xfa928db6, 0x2b1410bc, 0xa0c43ff9, 0x6fb82f0b, 0x5a56b24f, 0x5f8e6952, 0x18d0b6b1, 0x39604112, 0x7e3e9ef1, 0xe8e6dc18, +0x4bd003b5, 0xb3575d4c, 0xc9562bbb, 0x5115664b, 0x4a3730ae, 0x4174e4aa, 0x7814a5b8, 0x52e7861f, 0x428604fe, 0x0aa4e71f, 0x8e08f458, 0xe468004e, 0xadadd0b4, 0x279accea, 0x4e08d8a8, 0x854b205c, 0x6a60f416, 0x267dfff1, 0xd45e4617, 0x9bb1ada4, +0xd7aca643, 0x6c4acf5f, 0x68752759, 0xc1e71feb, 0xce9b23e9, 0x8c1d2717, 0x651cc814, 0x2f2bf8ba, 0xa2d1ecb6, 0x91154abb, 0x72b042a7, 0x1ac565fe, 0x31d17542, 0xa336dfad, 0xb768b54a, 0xaa60d8e6, 0xa6ee04b0, 0xafb803fb, 0x23a524ec, 0x94cd91a6, +0xa4fbd7ff, 0x54cdbd56, 0x38877209, 0xcaa4cbef, 0x5c7c8906, 0x735771bc, 0x475edfe3, 0x79f396a3, 0xb8148948, 0xfb75bead, 0xb49a551e, 0x757d4af5, 0xd3934e45, 0x7be645ec, 0x64fbfb0f, 0x05d8db1d, 0xac4ae3af, 0x139362b5, 0x8286280e, 0xfead65b0, +0xf1d159b2, 0xe58f3355, 0x86b9c008, 0x043fe806, 0xa1230ce2, 0xff4a56ab, 0xf61c51e0, 0x83611b15, 0x6e5f1c10, 0x3b75925d, 0x3ead4940, 0x62d1c046, 0x6518fb3d, 0xbbed2598, 0xa1cccea7, 0x793d7286, 0xe22c82a8, 0xa5cc7c27, 0x0878fa70, 0x81301b11, +0x631c99b9, 0xd01b64bd, 0x490e4497, 0x6d60014d, 0x5d53375c, 0x81a239fd, 0x105dc14b, 0xf4752167, 0x611849bd, 0xce3a3d02, 0x28160d2a, 0x6960b3cd, 0x266a95de, 0x10cfe3a7, 0xdc632c4d, 0xa15eec4b, 0xc6d0e59e, 0xb7074f84, 0x06046284, 0x34338491, +0x009222ec, 0x0cea6a1c, 0x678e09d5, 0xd68d24d5, 0x43726ee3, 0x12cb33a3, 0x0296f2e8, 0xbfed9718, 0x45760c67, 0x226a275e, 0xd8639ecd, 0xdef5dea5, 0x26f8b732, 0xb1032d00, 0xe0ba7040, 0xb7956d68, 0x1cb7ab57, 0xf4e7038b, 0xf80d6997, 0x4d9cd4fb, +0xf27143e3, 0x2a12dd2e, 0x95ff4a36, 0x20fcd5b6, 0x85a28b7d, 0x7dafe2ea, 0x8b4c3165, 0x7d3dc006, 0xf671f163, 0xa926163b, 0x5f57e758, 0x2c849d46, 0x7bab806e, 0x9915202a, 0x5fc5c5b4, 0xcc3eed06, 0xb591bd6c, 0x0eeeba18, 0x18253b3b, 0x87347995, +0xf0e7b10b, 0x47e0fe8f, 0x89dac38d, 0x08ead89c, 0xa3c81ea3, 0xe850a8dc, 0x7f391002, 0x8bde1389, 0x916dda5a, 0x1a21eb3f, 0x8f4c83e5, 0x83a6e9f9, 0xd21fb4b9, 0x384bcc61, 0x53bd8d44, 0x595385dc, 0xd8f1bc21, 0x97fb9a32, 0x7b39a282, 0x658ad9d1, +0xad26a4bb, 0x6bf64125, 0x32a5c4f9, 0x00000000, 0x43e04c0f, 0xafb05653, 0xe6be12c4, 0xfe090b13, 0x8fdea109, 0x30a114fd, 0xe02852ac, 0xe62c3028, 0x9f836042, 0xe8c28a30, 0x0204d004, 0x93fb28b2, 0xd489f4d1, 0xc83e5f86, 0x69f29121, 0xe428e02c, +0xbde9471c, 0x7fab32ee, 0xecc238b0, 0x38d9ee8d, 0xd41bd63d, 0xbf7fb5f4, 0xcaa8ad6e, 0xa35a3c4f, 0xc0d4871a, 0x145d73cb, 0x2e126fae, 0xe4bac2c0, 0x0c7848f0, 0x8dda710d, 0x87a65b79, 0xfc9ff9fb, 0x75d7189a, 0xd28d9655, 0xabb0e4d3, 0x36a57679, +0xa55e5ecb, 0x75453a76, 0xfa9b9b7f, 0x8530a991, 0xa9b434d7, 0xfa09b993, 0xc4461776, 0xfc0ddb17, 0x246e45da, 0x9d1592aa, 0x57bd3fc4, 0x9769b8de, 0x1eb37b53, 0x4f9804ff, 0x3e4faee5, 0x55b9efc0, 0xb1910fec, 0xb395dfe8, 0xbd7b65f0, 0x1659a3cf, +0x2a80ffc2, 0x0a7c2a74, 0xc642c772, 0x0e7c98f4, 0x45e42e8b, 0x532fafa8, 0xec501a5c, 0x5bc57734, 0xc4d4359a, 0x499c667b, 0xadb48657, 0x34a1a67d, 0x4b0a9493, 0x3a4f1c65, 0xb5039f80, 0xab22c63f, 0xf89f4b7b, 0x51b95d40, 0xaf2274bf, 0xdaf56c25, +0x5dc115b0, 0x73d37a1e, 0x6b6463c9, 0xd0894651, 0x4f0a2613, 0x14cf5127, 0xccaccfea, 0x06964068, 0xa7c8ac23, 0x7741ea72, 0x18b719d7, 0xcea81fee, 0x2c16bfaa, 0x9f1142ae, 0x8d4853e1, 0x4d0ef617, 0x512b7fac, 0x59c1a730, 0x1259114f, 0x91fff8b6, +0x0400b280, 0x618a6b51, 0x671c2b39, 0x3edd8c09, 0x8948e161, 0xfe9b29ff, 0xb307fd04, 0xee54ca58, 0xda674ec9, 0xf2e3610f, 0x4b98b67f, 0x2e804d42, 0xca3a8f82, 0xf07593e7, 0x6df223a1, 0x638ebb55, 0xc046a5f6, 0x30333611, 0x93690a5e, 0x3237e615, +0x77d3c89e, 0x36375495, 0x734158f2, 0xc2d0571e, 0xb97bd770, 0x6ff6f3a5, 0xf6e3d38f, 0x552bcd2c, 0x79af506a, 0x4772dc63, 0x1c2589bb, 0x572f1d28, 0x8334cb15, 0x71d7aa1a, 0xc24275f2, 0x28842fc6, 0xd61f0639, 0x3add3e89, 0x9b83d2c2, 0x0aee0898, +0x24fc6736, 0x1e2159bf, 0x6f64d149, 0x22f805b2, 0xeac65a34, 0x16cb8123, 0x714588f6, 0xb9e9f59c, 0x206ef75a, 0xbb7f0774, 0x9d87b046, 0xe2bea044, 0xdcf10ea1, 0x998702c6, 0xa75a8ecf, 0xeec6e8b4, 0x41e49c0b, 0x9b11f02e, 0x5b5755d8, 0x956d68da, +0xea5478d8, 0x0492906c, 0x4176bee7, 0xc8ac7d6a, 0x3cd95c0d, 0x3c4b7ee1, 0xde67fc49, 0x1ab3c9d3, 0xf1b90885, 0x3b07e7f2, 0x263046d0, 0x1d37a122, 0xb5b8ad1a, 0xfc4408ac, 0x0d640916, 0xb42be211, 0x529b1c28, 0x6905f2e5, 0x1603b088, 0xc080b8e9, +0x53915a1c, 0x4ea6fb3e, 0x94d2b542, 0xd7894e55, 0x01934f0b, 0x4401a59f, 0xe629f706, 0x72624b7b, 0xbf86fa84, 0x435bfb17, 0x273a00e4, 0xdaed4743, 0x7f06426d, 0x3a0da1c6, 0x84811d76, 0x26a94fef, 0x3139b06c, 0xd6830861, 0x6896bdee, 0x065018bc, +0xf6e3560d, 0x20f95753, 0xc6d0a055, 0xf12001ba, 0x4facbd0a, 0xa9854a0c, 0x6461fbf3, 0xc743ef5e, 0x30aaff67, 0xeb4dfe10, 0x48f6e382, 0x4e3ff201, 0x58a54bb6, 0x0b3411aa, 0x79cf53ee, 0xb521a425, 0xed1de6ac, 0xa5720c11, 0xa8160507, 0xb371bc99, +0xe079efba, 0xbe8cbcb0, 0x0a3e579e, 0xc649a96a, 0x8e2643d7, 0x9fe6a4e8, 0xa2b15ba6, 0x9388ebca, 0xcd7db8c0, 0x7e950d66, 0x4251bd23, 0x7e0c0459, 0x59af0d82, 0x2ac700cd, 0xa91c4333, 0xa32214ad, 0xcceef7cb, 0x1c3de716, 0x921ba4c1, 0xea47b824, +0xa5eb052e, 0x52021517, 0xb845ad33, 0x75a11ccc, 0x99b6bc54, 0xcbb4a943, 0x633ba57b, 0xd1d956e9, 0x5ef5530a, 0xf7e91039, 0x680fb4d1, 0xb2e2f392, 0x9282adfe, 0xe723b132, 0x699cfbda, 0x82480cf5, 0xa3bb1d92, 0x83424ac1, 0xec17a098, 0x54520dab, +0x49fca5b6, 0xfd4e4e98, 0x3a94a8f9, 0xeadeb11b, 0x00000000, 0x1159ee00, 0x0aa75ea1, 0xfb875f1b, 0x63a2ac44, 0x64f8f2cc, 0xc18afedd, 0xe1eaa0b1, 0x1bfeb0a1, 0x5f661c01, 0x55c142a0, 0x55584b9f, 0x54cb0494, 0x73680d4f, 0x944bbc7d, 0x11c0e73f, +0x89e51460, 0xaedf1484, 0xfdd747a7, 0x62a8ea70, 0xf7701906, 0x9311e2f5, 0x3d57ff4e, 0x73f10470, 0xed84ef93, 0xc019b1d6, 0x992fb56b, 0xfcdd0193, 0xb9d6e238, 0x74ab5af8, 0x3c5db97a, 0xfa8d192f, 0xb4b2eb2e, 0x43c2f228, 0xdcbd5fff, 0x656bbdc7, +0xb27bfaad, 0x6ec6a552, 0x897c1d5f, 0xddb719cb, 0x8fb50cdc, 0x075a5e88, 0xd04a19e2, 0xbf1ff3bb, 0x78c515da, 0x6e5fac6d, 0x2d9d5e45, 0x36fae7db, 0x6f55ea59, 0xcde4b1ff, 0xcabeef77, 0x010a4634, 0xe7bab80d, 0x72fb4244, 0xa4784a25, 0x858b5b42, +0xdb7e0848, 0x3b9eeecd, 0xa88f0c38, 0x583c4289, 0xec8ea9a7, 0x06c91183, 0xa2285299, 0x84181449, 0x21f31167, 0x20605e6c, 0x9825f35f, 0xc113f7e2, 0x31a0b953, 0x3cc4b045, 0x6231e34f, 0x0c6e4f22, 0x9e75ebe3, 0x450be3ab, 0xdc2456c0, 0x216a1858, +0x5e6c5a35, 0x3663eee4, 0x83db43fe, 0xd1405fd6, 0x53085323, 0x82d105ca, 0xd0d310dd, 0x486feabd, 0x7f9f4b52, 0x753815f3, 0x42c8b41c, 0x27a309db, 0x10caa10b, 0x79565ad1, 0x2d04577a, 0x8512527d, 0x9eece2dc, 0xcb2da07c, 0xbe15b58f, 0xe173a98e, +0xaf4c5b8f, 0xdbe70177, 0x1af4f695, 0x0099093f, 0xfa141010, 0xf67a5f32, 0x88765b6b, 0x4f35b435, 0x1a6dffaa, 0x785c1ce5, 0xca27e648, 0xcc77fef4, 0xae461dbb, 0xe6b0fe39, 0xf02a478e, 0x1ca4ee29, 0x5fff153e, 0xf0b34eb1, 0x593604bd, 0xc7dae661, +0xb94feb07, 0x1790ff83, 0x65f2b4f8, 0x95d8f376, 0x4498aca0, 0x3769a8d0, 0x6fcce366, 0x88ef5254, 0xafd552b0, 0x1053a834, 0xe0e0e685, 0x8f2c05e3, 0x4592ea94, 0x1daea81d, 0xfb1e5624, 0x4965ac89, 0x2c0e114e, 0xebd4f72f, 0x37f0a1ef, 0x3033f658, +0x2c971871, 0x0dfd0029, 0x0bad1895, 0x1709f6bc, 0xb8dca40c, 0xda744e7c, 0xd710476a, 0x98bcfa60, 0x743253c7, 0x2a5e09f2, 0x3dcef671, 0x9541fa49, 0xd61a015e, 0x8ebf4ae8, 0x2b544fc6, 0x169ab9b7, 0xdd2e10f4, 0x1b67b99e, 0xa4e1431a, 0xb3e8b5a6, +0x0cf7461d, 0x9f7fadd7, 0x07c357b7, 0x2bcd46f9, 0x9d7d0537, 0x31bff1db, 0xa5a6b3ad, 0x08620708, 0x85455f32, 0x115c1d44, 0xd42dfd6a, 0x00033895, 0xe4a2d9f2, 0xc47498f2, 0xcc233265, 0x20e0d40a, 0x193e1a4c, 0x60d75383, 0x8d2460af, 0x318964d1, +0xf4ce11f5, 0xe4944cf8, 0xb4f9967c, 0x0133edd6, 0xa4a3cb71, 0x8d27583a, 0x190bb7d3, 0x79dfdcc5, 0x698581c8, 0x193d22d9, 0x718b4ec7, 0x308c1c0d, 0x19088f46, 0xc4420df8, 0x0951eade, 0x183b6290, 0xd41b6860, 0x580ce519, 0xdd7c17b4, 0x8570f2ad, +0xedf00bb9, 0x580fdd8c, 0x506dda84, 0x48558081, 0x0035ad9f, 0x844027ee, 0xe5a7a12e, 0x951c3aaa, 0x79e949cf, 0xfc99bb62, 0x79ea715a, 0x09677fd4, 0xa5a58b38, 0x39eb63d9, 0x94194276, 0x318a5c44, 0xf4fbbc6a, 0x708d0e8e, 0xa4a0f3e4, 0x590aa550, +0x61e786c0, 0x21d00149, 0xacf75973, 0x010578dc, 0x410752ca, 0x70bb9b84, 0x21e5acd6, 0x30ba8907, 0x00000000, 0xacc1cc79, 0xc572d8bb, 0xcd10dfb3, 0x4132ff55, 0x08549202, 0xecc0defa, 0x01064049, 0x69b314c2, 0x8c211873, 0x4953c0c8, 0x952aafa0, +0x308f2498, 0x4856b814, 0xa5931e32, 0x70b8a311, 0xfc9a83f7, 0x583a7013, 0xfdaa56b4, 0x38ee1b05, 0x38d88e0f, 0xecf57365, 0x68b66c1e, 0x942fd77c, 0x28b77e9d, 0x496555c2, 0xf5fec4b6, 0x8476b2e4, 0xc441356d, 0xdd49ba2b, 0x116a884e, 0xb4cc3be3, +0x60e2fe1c, 0x28b44608, 0xcd25722c, 0xd42ec5ff, 0xbcad047e, 0xfcac16fd, 0x95299735, 0xbda87ca2, 0x38ed2390, 0xdc4cc2f7, 0x61e4be55, 0xa4955e7b, 0x2987abde, 0xf5cb6929, 0x9d4b903d, 0x39ddf6d3, 0x2984934b, 0xe4a1e167, 0xfd9cc3be, 0xa49666ee, +0x4950f85d, 0xedc5a626, 0x58394886, 0x4034bf1c, 0x0857aa97, 0x39e85b4c, 0x8d12f5a5, 0xecf64bf0, 0xb5ffd635, 0x21d339dc, 0xfda96e21, 0x61d113ca, 0x4863158b, 0xedc69eb3, 0x8c2220e6, 0x30b9b192, 0x9d7e3da2, 0xcd13e726, 0xe497746d, 0x29b13ed4, +0xbc98a9e1, 0x40378789, 0xb5c9433f, 0x941a7ae3, 0xf5fdfc23, 0x08613f9d, 0xe5913424, 0xe5a499bb, 0xa59026a7, 0x9c4dd074, 0x40011283, 0x105a5d0d, 0xbd9ee9a8, 0x78ec3113, 0xd52885b6, 0x78d99c8c, 0x09644741, 0x515d0fc7, 0xbdab4437, 0x0952d24b, +0x60e1c689, 0x29b20641, 0x515e3752, 0xdd7f2f21, 0x942cefe9, 0xacf461e6, 0x69b02c57, 0xadf1193a, 0x78ef0986, 0x115f25d1, 0x20e3ec9f, 0x106cc807, 0xcc200af0, 0x49666d57, 0x9c787deb, 0x2882d302, 0xf4f884ff, 0xcd264ab9, 0x61d22b5f, 0xd41850f5, +0xb4faaee9, 0xc571e02e, 0x8c178d79, 0x79dce450, 0x31bcc94e, 0xedf3332c, 0x9d48a8a8, 0xd52bbd23, 0xfcaf2e68, 0x84758a71, 0x6880f914, 0xc5477524, 0x516b9acd, 0xecc3e66f, 0xadf221af, 0x708e361b, 0x9c4ee8e1, 0x59099dc5, 0x1169b0db, 0x6986b95d, +0xc477a067, 0x180df79a, 0xadc4b4a5, 0x38dbb69a, 0x180ecf0f, 0x8c14b5ec, 0xbcae3ceb, 0x9c7b457e, 0xbd9dd13d, 0x8573ca38, 0xd51e10bc, 0x505b4f8e, 0x0130d543, 0xf4cd2960, 0xb4cf0376, 0xdc4ffa62, 0xacc2f4ec, 0xb5fceea0, 0x8d11cd30, 0x39dece46, +0xcc15a76f, 0xb5ca7baa, 0x4131c7c0, 0xdd4a82be, 0xf5c851bc, 0xc5444db1, 0x951f023f, 0x5168a258, 0xfd9ffb2b, 0x20d64100, 0x106ff092, 0xdc796f68, 0x68b5548b, 0x41046a5f, 0x593f08cf, 0x593c305a, 0xcc169ffa, 0x2881eb97, 0x506ee211, 0x60d46b16, +0x84431f7b, 0x48602d1e, 0x71bee358, 0x20d57995, 0x5058771b, 0xadc78c30, 0xbc9b9174, 0xdc7a57fd, 0x18385a05, 0x40022a16, 0x71887652, 0x0036950a, 0xe5920cb1, 0x71bddbcd, 0x6883c181, 0x854667a7, 0x21e69443, 0xd51d2829, 0x78daa419, 0x10596598, +0xb446fdc9, 0x8d35124b, 0x202bbcfe, 0x285531c5, 0xfd94e000, 0x073a7a0f, 0xcba3f8b6, 0xc5fb6bce, 0x836d8133, 0x5293fcb1, 0xea942004, 0x0523c80b, 0xa665f5c6, 0x40b0f4be, 0xcc9982b9, 0x386f8bce, 0x6dc60d70, 0xa47c47c2, 0x3532cefe, 0x2e732f86, +0x69f9a137, 0x1126de47, 0x9674f333, 0x0c41217c, 0x2f6f4bca, 0xcf9c54f1, 0x5aed718a, 0xc8a62efe, 0x9052ed70, 0x103aba0b, 0x8457fb3c, 0xf8b7280b, 0xc7e2d9ca, 0x8c297607, 0x1b41e178, 0x8e30c403, 0x3314d0bd, 0xe1ef7b77, 0x854b9f70, 0xe4ccb37c, +0x57b034ba, 0x6cda693c, 0xecb23e47, 0x2137d8b2, 0x29495589, 0x73a42403, 0xe3f6c973, 0xb079518e, 0x7dfcb77b, 0x914e893c, 0x79c31b3c, 0x7687ec08, 0x4ad7cb81, 0xf2d01734, 0xba1e6eb1, 0x8068577b, 0x93573b38, 0xe6d50178, 0x0962e977, 0xcabf9cfa, +0x9d0fa840, 0xff8d5204, 0xedae5a0b, 0x7ef96133, 0xd7d863c1, 0x7fe5057f, 0x011c644c, 0xb807dcb5, 0x8816da40, 0x508a4eb5, 0xeeab8c43, 0x59e8a7c2, 0x946d4137, 0x538f98fd, 0x54b5e2f2, 0xc2c111c1, 0xae1b78fd, 0x3a7639ca, 0x67a1324f, 0x15197200, +0x982c604b, 0xa83d66be, 0x260da2bd, 0x8271e57f, 0x0b7b5b73, 0xd1fe7d82, 0x1958537c, 0x779b8844, 0xd3e7cf86, 0x3e49958d, 0xd0e219ce, 0x5ccb6fc9, 0x9e0a7e08, 0x161ca448, 0xd89c94f5, 0xf3cc7378, 0x1223080f, 0x0f44f734, 0xbc3870f2, 0x609b4840, +0x9571257b, 0x87522d74, 0xb16535c2, 0xdeba8ab6, 0xe0f31f3b, 0x2b50e78d, 0x043fac47, 0x4bcbafcd, 0x18443730, 0xad1eaeb5, 0x8b130c08, 0x56ac50f6, 0xa92102f2, 0xb37c87c6, 0xd4ddb589, 0x448f58f9, 0xb55a9985, 0x301106f5, 0x232e6ab6, 0x8f2ca04f, +0x2a4c83c1, 0xfe913648, 0x4ff4038a, 0xe5d0d730, 0xf1d5c17c, 0x241410b9, 0xbf3da6ba, 0xaf071cb1, 0xcd85e6f5, 0xb7432b81, 0xeb884448, 0xa779918a, 0x58f4c38e, 0x5ed2ddcd, 0xdfa6eefa, 0xa043eb85, 0x3973ef82, 0x81743337, 0x1700c004, 0x45933cb5, +0x0a673f3f, 0xb91bb8f9, 0x6be01333, 0x0305d648, 0xac02caf9, 0x48ce7985, 0xe88d9200, 0x0d5d4530, 0xd6c4078d, 0x9b29b603, 0x72b8404f, 0x66bd5603, 0x478a8eb1, 0xd980f0b9, 0x51962af9, 0x363718b6, 0x8a0f6844, 0xd5c1d1c5, 0xda8526f1, 0xab38b0f6, +0x1f7e4d3f, 0x2c6a9d82, 0x3208b4f1, 0x1c7b9b77, 0x64a4e407, 0x1a5d8534, 0x7ac6cd74, 0x99300407, 0x71bd9607, 0x4ee867c6, 0x924b5f74, 0x42a946ba, 0xbe21c2f6, 0x890abe0c, 0x6fdfbf74, 0x342eaab2, 0xc4e70f82, 0x5dd70b85, 0x78df7f70, 0xf6efbb73, +0xc1c4c789, 0xf5ea6d3b, 0x1405164c, 0xb65f4fcd, 0xd2fbabca, 0xa25a5981, 0x2711c6f1, 0x70a1f24b, 0x7ce0d337, 0xf7f3df3f, 0x65b8804b, 0xa560238e, 0x43b522f6, 0x5bf115c6, 0xe991f64c, 0xa3463dcd, 0x06261e43, 0x41ac90f2, 0x75823a40, 0xaa24d4ba, +0x372b7cfa, 0x6ec3db38, 0x639e9e08, 0xddbf5cfe, 0x6afc777f, 0xdca338b2, 0xc3dd758d, 0x49d21dc9, 0x0e589378, 0xf0c9a530, 0x4696eafd, 0xfaae9a0f, 0x3f55f1c1, 0x4cf1d5c2, 0x6282fa44, 0x22320efa, 0xf4f60977, 0x2d76f9ce, 0x00000000, 0xb260e38a, +0x310d62b9, 0xf9ab4c47, 0x0219b204, 0x749e5e0c, 0x7bdaa938, 0x9c13cc0c, 0xa15f8fc9, 0x9768977f, 0xe2eaad3f, 0x9f161a44, 0xc0d8a3c5, 0xc9ba4ab2, 0x9a35d24f, 0x133f6c43, 0x68e5c57b, 0x3d4c43c5, 0x087e8d3b, 0xfbb2fe43, 0xdb9942bd, 0x1d67ff3b, +0xe7c96534, 0xc6febd86, 0xbb020afd, 0x864e4938, 0xfc88844c, 0xefb7e80f, 0xbd2414be, 0x3b6a5d86, 0x55a986be, 0x5fceb981, 0x1e622973, 0x3c502789, 0x250874f5, 0x61872c0c, 0x4dedb18e, 0xce8030bd ] + +d0x6a073a70=[ 0x00000000, 0xe49aab07, 0x02ce6d83, 0xe654c684, 0x2b68c239, 0xcff2693e, 0x29a6afba, 0xcd3c04bd, 0x2ae93b3f, 0xce739038, 0x282756bc, 0xccbdfdbb, 0x0181f906, 0xe51b5201, 0x034f9485, 0xe7d53f82, 0xf0bde14e, 0x14274a49, 0xf2738ccd, 0x16e927ca, +0xdbd52377, 0x3f4f8870, 0xd91b4ef4, 0x3d81e5f3, 0xda54da71, 0x3ece7176, 0xd89ab7f2, 0x3c001cf5, 0xf13c1848, 0x15a6b34f, 0xf3f275cb, 0x1768decc, 0xb85cb7b2, 0x5cc61cb5, 0xba92da31, 0x5e087136, 0x9334758b, 0x77aede8c, 0x91fa1808, 0x7560b30f, +0x92b58c8d, 0x762f278a, 0x907be10e, 0x74e14a09, 0xb9dd4eb4, 0x5d47e5b3, 0xbb132337, 0x5f898830, 0x48e156fc, 0xac7bfdfb, 0x4a2f3b7f, 0xaeb59078, 0x638994c5, 0x87133fc2, 0x6147f946, 0x85dd5241, 0x62086dc3, 0x8692c6c4, 0x60c60040, 0x845cab47, +0x4960affa, 0xadfa04fd, 0x4baec279, 0xaf34697e, 0xc14a188c, 0x25d0b38b, 0xc384750f, 0x271ede08, 0xea22dab5, 0x0eb871b2, 0xe8ecb736, 0x0c761c31, 0xeba323b3, 0x0f3988b4, 0xe96d4e30, 0x0df7e537, 0xc0cbe18a, 0x24514a8d, 0xc2058c09, 0x269f270e, +0x31f7f9c2, 0xd56d52c5, 0x33399441, 0xd7a33f46, 0x1a9f3bfb, 0xfe0590fc, 0x18515678, 0xfccbfd7f, 0x1b1ec2fd, 0xff8469fa, 0x19d0af7e, 0xfd4a0479, 0x307600c4, 0xd4ecabc3, 0x32b86d47, 0xd622c640, 0x7916af3e, 0x9d8c0439, 0x7bd8c2bd, 0x9f4269ba, +0x527e6d07, 0xb6e4c600, 0x50b00084, 0xb42aab83, 0x53ff9401, 0xb7653f06, 0x5131f982, 0xb5ab5285, 0x78975638, 0x9c0dfd3f, 0x7a593bbb, 0x9ec390bc, 0x89ab4e70, 0x6d31e577, 0x8b6523f3, 0x6fff88f4, 0xa2c38c49, 0x4659274e, 0xa00de1ca, 0x44974acd, +0xa342754f, 0x47d8de48, 0xa18c18cc, 0x4516b3cb, 0x882ab776, 0x6cb01c71, 0x8ae4daf5, 0x6e7e71f2, 0x96e739cd, 0x727d92ca, 0x9429544e, 0x70b3ff49, 0xbd8ffbf4, 0x591550f3, 0xbf419677, 0x5bdb3d70, 0xbc0e02f2, 0x5894a9f5, 0xbec06f71, 0x5a5ac476, +0x9766c0cb, 0x73fc6bcc, 0x95a8ad48, 0x7132064f, 0x665ad883, 0x82c07384, 0x6494b500, 0x800e1e07, 0x4d321aba, 0xa9a8b1bd, 0x4ffc7739, 0xab66dc3e, 0x4cb3e3bc, 0xa82948bb, 0x4e7d8e3f, 0xaae72538, 0x67db2185, 0x83418a82, 0x65154c06, 0x818fe701, +0x2ebb8e7f, 0xca212578, 0x2c75e3fc, 0xc8ef48fb, 0x05d34c46, 0xe149e741, 0x071d21c5, 0xe3878ac2, 0x0452b540, 0xe0c81e47, 0x069cd8c3, 0xe20673c4, 0x2f3a7779, 0xcba0dc7e, 0x2df41afa, 0xc96eb1fd, 0xde066f31, 0x3a9cc436, 0xdcc802b2, 0x3852a9b5, +0xf56ead08, 0x11f4060f, 0xf7a0c08b, 0x133a6b8c, 0xf4ef540e, 0x1075ff09, 0xf621398d, 0x12bb928a, 0xdf879637, 0x3b1d3d30, 0xdd49fbb4, 0x39d350b3, 0x57ad2141, 0xb3378a46, 0x55634cc2, 0xb1f9e7c5, 0x7cc5e378, 0x985f487f, 0x7e0b8efb, 0x9a9125fc, +0x7d441a7e, 0x99deb179, 0x7f8a77fd, 0x9b10dcfa, 0x562cd847, 0xb2b67340, 0x54e2b5c4, 0xb0781ec3, 0xa710c00f, 0x438a6b08, 0xa5dead8c, 0x4144068b, 0x8c780236, 0x68e2a931, 0x8eb66fb5, 0x6a2cc4b2, 0x8df9fb30, 0x69635037, 0x8f3796b3, 0x6bad3db4, +0xa6913909, 0x420b920e, 0xa45f548a, 0x40c5ff8d, 0xeff196f3, 0x0b6b3df4, 0xed3ffb70, 0x09a55077, 0xc49954ca, 0x2003ffcd, 0xc6573949, 0x22cd924e, 0xc518adcc, 0x218206cb, 0xc7d6c04f, 0x234c6b48, 0xee706ff5, 0x0aeac4f2, 0xecbe0276, 0x0824a971, +0x1f4c77bd, 0xfbd6dcba, 0x1d821a3e, 0xf918b139, 0x3424b584, 0xd0be1e83, 0x36ead807, 0xd2707300, 0x35a54c82, 0xd13fe785, 0x376b2101, 0xd3f18a06, 0x1ecd8ebb, 0xfa5725bc, 0x1c03e338, 0xf899483f, 0x00000000, 0xabe681b2, 0xdbc6a83c, 0x7020298e, +0x801e394d, 0x2bf8b8ff, 0x5bd89171, 0xf03e10c3, 0x86342ecd, 0x2dd2af7f, 0x5df286f1, 0xf6140743, 0x062a1780, 0xadcc9632, 0xddecbfbc, 0x760a3e0e, 0x57706bd2, 0xfc96ea60, 0x8cb6c3ee, 0x2750425c, 0xd76e529f, 0x7c88d32d, 0x0ca8faa3, 0xa74e7b11, +0xd144451f, 0x7aa2c4ad, 0x0a82ed23, 0xa1646c91, 0x515a7c52, 0xfabcfde0, 0x8a9cd46e, 0x217a55dc, 0x3214e29b, 0x99f26329, 0xe9d24aa7, 0x4234cb15, 0xb20adbd6, 0x19ec5a64, 0x69cc73ea, 0xc22af258, 0xb420cc56, 0x1fc64de4, 0x6fe6646a, 0xc400e5d8, +0x343ef51b, 0x9fd874a9, 0xeff85d27, 0x441edc95, 0x65648949, 0xce8208fb, 0xbea22175, 0x1544a0c7, 0xe57ab004, 0x4e9c31b6, 0x3ebc1838, 0x955a998a, 0xe350a784, 0x48b62636, 0x38960fb8, 0x93708e0a, 0x634e9ec9, 0xc8a81f7b, 0xb88836f5, 0x136eb747, +0x88c81f4c, 0x232e9efe, 0x530eb770, 0xf8e836c2, 0x08d62601, 0xa330a7b3, 0xd3108e3d, 0x78f60f8f, 0x0efc3181, 0xa51ab033, 0xd53a99bd, 0x7edc180f, 0x8ee208cc, 0x2504897e, 0x5524a0f0, 0xfec22142, 0xdfb8749e, 0x745ef52c, 0x047edca2, 0xaf985d10, +0x5fa64dd3, 0xf440cc61, 0x8460e5ef, 0x2f86645d, 0x598c5a53, 0xf26adbe1, 0x824af26f, 0x29ac73dd, 0xd992631e, 0x7274e2ac, 0x0254cb22, 0xa9b24a90, 0xbadcfdd7, 0x113a7c65, 0x611a55eb, 0xcafcd459, 0x3ac2c49a, 0x91244528, 0xe1046ca6, 0x4ae2ed14, +0x3ce8d31a, 0x970e52a8, 0xe72e7b26, 0x4cc8fa94, 0xbcf6ea57, 0x17106be5, 0x6730426b, 0xccd6c3d9, 0xedac9605, 0x464a17b7, 0x366a3e39, 0x9d8cbf8b, 0x6db2af48, 0xc6542efa, 0xb6740774, 0x1d9286c6, 0x6b98b8c8, 0xc07e397a, 0xb05e10f4, 0x1bb89146, +0xeb868185, 0x40600037, 0x304029b9, 0x9ba6a80b, 0x33b3f69c, 0x9855772e, 0xe8755ea0, 0x4393df12, 0xb3adcfd1, 0x184b4e63, 0x686b67ed, 0xc38de65f, 0xb587d851, 0x1e6159e3, 0x6e41706d, 0xc5a7f1df, 0x3599e11c, 0x9e7f60ae, 0xee5f4920, 0x45b9c892, +0x64c39d4e, 0xcf251cfc, 0xbf053572, 0x14e3b4c0, 0xe4dda403, 0x4f3b25b1, 0x3f1b0c3f, 0x94fd8d8d, 0xe2f7b383, 0x49113231, 0x39311bbf, 0x92d79a0d, 0x62e98ace, 0xc90f0b7c, 0xb92f22f2, 0x12c9a340, 0x01a71407, 0xaa4195b5, 0xda61bc3b, 0x71873d89, +0x81b92d4a, 0x2a5facf8, 0x5a7f8576, 0xf19904c4, 0x87933aca, 0x2c75bb78, 0x5c5592f6, 0xf7b31344, 0x078d0387, 0xac6b8235, 0xdc4babbb, 0x77ad2a09, 0x56d77fd5, 0xfd31fe67, 0x8d11d7e9, 0x26f7565b, 0xd6c94698, 0x7d2fc72a, 0x0d0feea4, 0xa6e96f16, +0xd0e35118, 0x7b05d0aa, 0x0b25f924, 0xa0c37896, 0x50fd6855, 0xfb1be9e7, 0x8b3bc069, 0x20dd41db, 0xbb7be9d0, 0x109d6862, 0x60bd41ec, 0xcb5bc05e, 0x3b65d09d, 0x9083512f, 0xe0a378a1, 0x4b45f913, 0x3d4fc71d, 0x96a946af, 0xe6896f21, 0x4d6fee93, +0xbd51fe50, 0x16b77fe2, 0x6697566c, 0xcd71d7de, 0xec0b8202, 0x47ed03b0, 0x37cd2a3e, 0x9c2bab8c, 0x6c15bb4f, 0xc7f33afd, 0xb7d31373, 0x1c3592c1, 0x6a3faccf, 0xc1d92d7d, 0xb1f904f3, 0x1a1f8541, 0xea219582, 0x41c71430, 0x31e73dbe, 0x9a01bc0c, +0x896f0b4b, 0x22898af9, 0x52a9a377, 0xf94f22c5, 0x09713206, 0xa297b3b4, 0xd2b79a3a, 0x79511b88, 0x0f5b2586, 0xa4bda434, 0xd49d8dba, 0x7f7b0c08, 0x8f451ccb, 0x24a39d79, 0x5483b4f7, 0xff653545, 0xde1f6099, 0x75f9e12b, 0x05d9c8a5, 0xae3f4917, +0x5e0159d4, 0xf5e7d866, 0x85c7f1e8, 0x2e21705a, 0x582b4e54, 0xf3cdcfe6, 0x83ede668, 0x280b67da, 0xd8357719, 0x73d3f6ab, 0x03f3df25, 0xa8155e97, 0x00000000, 0x0d48b1a3, 0x345a4e84, 0x3912ff27, 0xb3a38249, 0xbeeb33ea, 0x87f9cccd, 0x8ab17d6e, +0x25d028da, 0x28989979, 0x118a665e, 0x1cc2d7fd, 0x9673aa93, 0x9b3b1b30, 0xa229e417, 0xaf6155b4, 0x96743130, 0x9b3c8093, 0xa22e7fb4, 0xaf66ce17, 0x25d7b379, 0x289f02da, 0x118dfdfd, 0x1cc54c5e, 0xb3a419ea, 0xbeeca849, 0x87fe576e, 0x8ab6e6cd, +0x00079ba3, 0x0d4f2a00, 0x345dd527, 0x39156484, 0x41f6542f, 0x4cbee58c, 0x75ac1aab, 0x78e4ab08, 0xf255d666, 0xff1d67c5, 0xc60f98e2, 0xcb472941, 0x64267cf5, 0x696ecd56, 0x507c3271, 0x5d3483d2, 0xd785febc, 0xdacd4f1f, 0xe3dfb038, 0xee97019b, +0xd782651f, 0xdacad4bc, 0xe3d82b9b, 0xee909a38, 0x6421e756, 0x696956f5, 0x507ba9d2, 0x5d331871, 0xf2524dc5, 0xff1afc66, 0xc6080341, 0xcb40b2e2, 0x41f1cf8c, 0x4cb97e2f, 0x75ab8108, 0x78e330ab, 0xc378db0a, 0xce306aa9, 0xf722958e, 0xfa6a242d, +0x70db5943, 0x7d93e8e0, 0x448117c7, 0x49c9a664, 0xe6a8f3d0, 0xebe04273, 0xd2f2bd54, 0xdfba0cf7, 0x550b7199, 0x5843c03a, 0x61513f1d, 0x6c198ebe, 0x550cea3a, 0x58445b99, 0x6156a4be, 0x6c1e151d, 0xe6af6873, 0xebe7d9d0, 0xd2f526f7, 0xdfbd9754, +0x70dcc2e0, 0x7d947343, 0x44868c64, 0x49ce3dc7, 0xc37f40a9, 0xce37f10a, 0xf7250e2d, 0xfa6dbf8e, 0x828e8f25, 0x8fc63e86, 0xb6d4c1a1, 0xbb9c7002, 0x312d0d6c, 0x3c65bccf, 0x057743e8, 0x083ff24b, 0xa75ea7ff, 0xaa16165c, 0x9304e97b, 0x9e4c58d8, +0x14fd25b6, 0x19b59415, 0x20a76b32, 0x2defda91, 0x14fabe15, 0x19b20fb6, 0x20a0f091, 0x2de84132, 0xa7593c5c, 0xaa118dff, 0x930372d8, 0x9e4bc37b, 0x312a96cf, 0x3c62276c, 0x0570d84b, 0x083869e8, 0x82891486, 0x8fc1a525, 0xb6d35a02, 0xbb9beba1, +0xc4ebd185, 0xc9a36026, 0xf0b19f01, 0xfdf92ea2, 0x774853cc, 0x7a00e26f, 0x43121d48, 0x4e5aaceb, 0xe13bf95f, 0xec7348fc, 0xd561b7db, 0xd8290678, 0x52987b16, 0x5fd0cab5, 0x66c23592, 0x6b8a8431, 0x529fe0b5, 0x5fd75116, 0x66c5ae31, 0x6b8d1f92, +0xe13c62fc, 0xec74d35f, 0xd5662c78, 0xd82e9ddb, 0x774fc86f, 0x7a0779cc, 0x431586eb, 0x4e5d3748, 0xc4ec4a26, 0xc9a4fb85, 0xf0b604a2, 0xfdfeb501, 0x851d85aa, 0x88553409, 0xb147cb2e, 0xbc0f7a8d, 0x36be07e3, 0x3bf6b640, 0x02e44967, 0x0facf8c4, +0xa0cdad70, 0xad851cd3, 0x9497e3f4, 0x99df5257, 0x136e2f39, 0x1e269e9a, 0x273461bd, 0x2a7cd01e, 0x1369b49a, 0x1e210539, 0x2733fa1e, 0x2a7b4bbd, 0xa0ca36d3, 0xad828770, 0x94907857, 0x99d8c9f4, 0x36b99c40, 0x3bf12de3, 0x02e3d2c4, 0x0fab6367, +0x851a1e09, 0x8852afaa, 0xb140508d, 0xbc08e12e, 0x07930a8f, 0x0adbbb2c, 0x33c9440b, 0x3e81f5a8, 0xb43088c6, 0xb9783965, 0x806ac642, 0x8d2277e1, 0x22432255, 0x2f0b93f6, 0x16196cd1, 0x1b51dd72, 0x91e0a01c, 0x9ca811bf, 0xa5baee98, 0xa8f25f3b, +0x91e73bbf, 0x9caf8a1c, 0xa5bd753b, 0xa8f5c498, 0x2244b9f6, 0x2f0c0855, 0x161ef772, 0x1b5646d1, 0xb4371365, 0xb97fa2c6, 0x806d5de1, 0x8d25ec42, 0x0794912c, 0x0adc208f, 0x33cedfa8, 0x3e866e0b, 0x46655ea0, 0x4b2def03, 0x723f1024, 0x7f77a187, +0xf5c6dce9, 0xf88e6d4a, 0xc19c926d, 0xccd423ce, 0x63b5767a, 0x6efdc7d9, 0x57ef38fe, 0x5aa7895d, 0xd016f433, 0xdd5e4590, 0xe44cbab7, 0xe9040b14, 0xd0116f90, 0xdd59de33, 0xe44b2114, 0xe90390b7, 0x63b2edd9, 0x6efa5c7a, 0x57e8a35d, 0x5aa012fe, +0xf5c1474a, 0xf889f6e9, 0xc19b09ce, 0xccd3b86d, 0x4662c503, 0x4b2a74a0, 0x72388b87, 0x7f703a24, 0x00000000, 0x98925f7f, 0x02521520, 0x9ac04a5f, 0x55e0bc79, 0xcd72e306, 0x57b2a959, 0xcf20f626, 0x7263ffd0, 0xeaf1a0af, 0x7031eaf0, 0xe8a3b58f, +0x278343a9, 0xbf111cd6, 0x25d15689, 0xbd4309f6, 0x259aff4f, 0xbd08a030, 0x27c8ea6f, 0xbf5ab510, 0x707a4336, 0xe8e81c49, 0x72285616, 0xeaba0969, 0x57f9009f, 0xcf6b5fe0, 0x55ab15bf, 0xcd394ac0, 0x0219bce6, 0x9a8be399, 0x004ba9c6, 0x98d9f6b9, +0x2224f931, 0xbab6a64e, 0x2076ec11, 0xb8e4b36e, 0x77c44548, 0xef561a37, 0x75965068, 0xed040f17, 0x504706e1, 0xc8d5599e, 0x521513c1, 0xca874cbe, 0x05a7ba98, 0x9d35e5e7, 0x07f5afb8, 0x9f67f0c7, 0x07be067e, 0x9f2c5901, 0x05ec135e, 0x9d7e4c21, +0x525eba07, 0xcacce578, 0x500caf27, 0xc89ef058, 0x75ddf9ae, 0xed4fa6d1, 0x778fec8e, 0xef1db3f1, 0x203d45d7, 0xb8af1aa8, 0x226f50f7, 0xbafd0f88, 0x187d486c, 0x80ef1713, 0x1a2f5d4c, 0x82bd0233, 0x4d9df415, 0xd50fab6a, 0x4fcfe135, 0xd75dbe4a, +0x6a1eb7bc, 0xf28ce8c3, 0x684ca29c, 0xf0defde3, 0x3ffe0bc5, 0xa76c54ba, 0x3dac1ee5, 0xa53e419a, 0x3de7b723, 0xa575e85c, 0x3fb5a203, 0xa727fd7c, 0x68070b5a, 0xf0955425, 0x6a551e7a, 0xf2c74105, 0x4f8448f3, 0xd716178c, 0x4dd65dd3, 0xd54402ac, +0x1a64f48a, 0x82f6abf5, 0x1836e1aa, 0x80a4bed5, 0x3a59b15d, 0xa2cbee22, 0x380ba47d, 0xa099fb02, 0x6fb90d24, 0xf72b525b, 0x6deb1804, 0xf579477b, 0x483a4e8d, 0xd0a811f2, 0x4a685bad, 0xd2fa04d2, 0x1ddaf2f4, 0x8548ad8b, 0x1f88e7d4, 0x871ab8ab, +0x1fc34e12, 0x8751116d, 0x1d915b32, 0x8503044d, 0x4a23f26b, 0xd2b1ad14, 0x4871e74b, 0xd0e3b834, 0x6da0b1c2, 0xf532eebd, 0x6ff2a4e2, 0xf760fb9d, 0x38400dbb, 0xa0d252c4, 0x3a12189b, 0xa28047e4, 0xb0526dbf, 0x28c032c0, 0xb200789f, 0x2a9227e0, +0xe5b2d1c6, 0x7d208eb9, 0xe7e0c4e6, 0x7f729b99, 0xc231926f, 0x5aa3cd10, 0xc063874f, 0x58f1d830, 0x97d12e16, 0x0f437169, 0x95833b36, 0x0d116449, 0x95c892f0, 0x0d5acd8f, 0x979a87d0, 0x0f08d8af, 0xc0282e89, 0x58ba71f6, 0xc27a3ba9, 0x5ae864d6, +0xe7ab6d20, 0x7f39325f, 0xe5f97800, 0x7d6b277f, 0xb24bd159, 0x2ad98e26, 0xb019c479, 0x288b9b06, 0x9276948e, 0x0ae4cbf1, 0x902481ae, 0x08b6ded1, 0xc79628f7, 0x5f047788, 0xc5c43dd7, 0x5d5662a8, 0xe0156b5e, 0x78873421, 0xe2477e7e, 0x7ad52101, +0xb5f5d727, 0x2d678858, 0xb7a7c207, 0x2f359d78, 0xb7ec6bc1, 0x2f7e34be, 0xb5be7ee1, 0x2d2c219e, 0xe20cd7b8, 0x7a9e88c7, 0xe05ec298, 0x78cc9de7, 0xc58f9411, 0x5d1dcb6e, 0xc7dd8131, 0x5f4fde4e, 0x906f2868, 0x08fd7717, 0x923d3d48, 0x0aaf6237, +0xa82f25d3, 0x30bd7aac, 0xaa7d30f3, 0x32ef6f8c, 0xfdcf99aa, 0x655dc6d5, 0xff9d8c8a, 0x670fd3f5, 0xda4cda03, 0x42de857c, 0xd81ecf23, 0x408c905c, 0x8fac667a, 0x173e3905, 0x8dfe735a, 0x156c2c25, 0x8db5da9c, 0x152785e3, 0x8fe7cfbc, 0x177590c3, +0xd85566e5, 0x40c7399a, 0xda0773c5, 0x42952cba, 0xffd6254c, 0x67447a33, 0xfd84306c, 0x65166f13, 0xaa369935, 0x32a4c64a, 0xa8648c15, 0x30f6d36a, 0x8a0bdce2, 0x1299839d, 0x8859c9c2, 0x10cb96bd, 0xdfeb609b, 0x47793fe4, 0xddb975bb, 0x452b2ac4, +0xf8682332, 0x60fa7c4d, 0xfa3a3612, 0x62a8696d, 0xad889f4b, 0x351ac034, 0xafda8a6b, 0x3748d514, 0xaf9123ad, 0x37037cd2, 0xadc3368d, 0x355169f2, 0xfa719fd4, 0x62e3c0ab, 0xf8238af4, 0x60b1d58b, 0xddf2dc7d, 0x45608302, 0xdfa0c95d, 0x47329622, +0x88126004, 0x10803f7b, 0x8a407524, 0x12d22a5b, 0x00000000, 0xfb44fc19, 0xcc14ab7c, 0x37505765, 0xa97982dc, 0x523d7ec5, 0x656d29a0, 0x9e29d5b9, 0x52d99fa8, 0xa99d63b1, 0x9ecd34d4, 0x6589c8cd, 0xfba01d74, 0x00e4e16d, 0x37b4b608, 0xccf04a11, +0x74e8536c, 0x8facaf75, 0xb8fcf810, 0x43b80409, 0xdd91d1b0, 0x26d52da9, 0x11857acc, 0xeac186d5, 0x2631ccc4, 0xdd7530dd, 0xea2567b8, 0x11619ba1, 0x8f484e18, 0x740cb201, 0x435ce564, 0xb818197d, 0x763a74cf, 0x8d7e88d6, 0xba2edfb3, 0x416a23aa, +0xdf43f613, 0x24070a0a, 0x13575d6f, 0xe813a176, 0x24e3eb67, 0xdfa7177e, 0xe8f7401b, 0x13b3bc02, 0x8d9a69bb, 0x76de95a2, 0x418ec2c7, 0xbaca3ede, 0x02d227a3, 0xf996dbba, 0xcec68cdf, 0x358270c6, 0xababa57f, 0x50ef5966, 0x67bf0e03, 0x9cfbf21a, +0x500bb80b, 0xab4f4412, 0x9c1f1377, 0x675bef6e, 0xf9723ad7, 0x0236c6ce, 0x356691ab, 0xce226db2, 0xfa6a3c37, 0x012ec02e, 0x367e974b, 0xcd3a6b52, 0x5313beeb, 0xa85742f2, 0x9f071597, 0x6443e98e, 0xa8b3a39f, 0x53f75f86, 0x64a708e3, 0x9fe3f4fa, +0x01ca2143, 0xfa8edd5a, 0xcdde8a3f, 0x369a7626, 0x8e826f5b, 0x75c69342, 0x4296c427, 0xb9d2383e, 0x27fbed87, 0xdcbf119e, 0xebef46fb, 0x10abbae2, 0xdc5bf0f3, 0x271f0cea, 0x104f5b8f, 0xeb0ba796, 0x7522722f, 0x8e668e36, 0xb936d953, 0x4272254a, +0x8c5048f8, 0x7714b4e1, 0x4044e384, 0xbb001f9d, 0x2529ca24, 0xde6d363d, 0xe93d6158, 0x12799d41, 0xde89d750, 0x25cd2b49, 0x129d7c2c, 0xe9d98035, 0x77f0558c, 0x8cb4a995, 0xbbe4fef0, 0x40a002e9, 0xf8b81b94, 0x03fce78d, 0x34acb0e8, 0xcfe84cf1, +0x51c19948, 0xaa856551, 0x9dd53234, 0x6691ce2d, 0xaa61843c, 0x51257825, 0x66752f40, 0x9d31d359, 0x031806e0, 0xf85cfaf9, 0xcf0cad9c, 0x34485185, 0xb292dfb0, 0x49d623a9, 0x7e8674cc, 0x85c288d5, 0x1beb5d6c, 0xe0afa175, 0xd7fff610, 0x2cbb0a09, +0xe04b4018, 0x1b0fbc01, 0x2c5feb64, 0xd71b177d, 0x4932c2c4, 0xb2763edd, 0x852669b8, 0x7e6295a1, 0xc67a8cdc, 0x3d3e70c5, 0x0a6e27a0, 0xf12adbb9, 0x6f030e00, 0x9447f219, 0xa317a57c, 0x58535965, 0x94a31374, 0x6fe7ef6d, 0x58b7b808, 0xa3f34411, +0x3dda91a8, 0xc69e6db1, 0xf1ce3ad4, 0x0a8ac6cd, 0xc4a8ab7f, 0x3fec5766, 0x08bc0003, 0xf3f8fc1a, 0x6dd129a3, 0x9695d5ba, 0xa1c582df, 0x5a817ec6, 0x967134d7, 0x6d35c8ce, 0x5a659fab, 0xa12163b2, 0x3f08b60b, 0xc44c4a12, 0xf31c1d77, 0x0858e16e, +0xb040f813, 0x4b04040a, 0x7c54536f, 0x8710af76, 0x19397acf, 0xe27d86d6, 0xd52dd1b3, 0x2e692daa, 0xe29967bb, 0x19dd9ba2, 0x2e8dccc7, 0xd5c930de, 0x4be0e567, 0xb0a4197e, 0x87f44e1b, 0x7cb0b202, 0x48f8e387, 0xb3bc1f9e, 0x84ec48fb, 0x7fa8b4e2, +0xe181615b, 0x1ac59d42, 0x2d95ca27, 0xd6d1363e, 0x1a217c2f, 0xe1658036, 0xd635d753, 0x2d712b4a, 0xb358fef3, 0x481c02ea, 0x7f4c558f, 0x8408a996, 0x3c10b0eb, 0xc7544cf2, 0xf0041b97, 0x0b40e78e, 0x95693237, 0x6e2dce2e, 0x597d994b, 0xa2396552, +0x6ec92f43, 0x958dd35a, 0xa2dd843f, 0x59997826, 0xc7b0ad9f, 0x3cf45186, 0x0ba406e3, 0xf0e0fafa, 0x3ec29748, 0xc5866b51, 0xf2d63c34, 0x0992c02d, 0x97bb1594, 0x6cffe98d, 0x5bafbee8, 0xa0eb42f1, 0x6c1b08e0, 0x975ff4f9, 0xa00fa39c, 0x5b4b5f85, +0xc5628a3c, 0x3e267625, 0x09762140, 0xf232dd59, 0x4a2ac424, 0xb16e383d, 0x863e6f58, 0x7d7a9341, 0xe35346f8, 0x1817bae1, 0x2f47ed84, 0xd403119d, 0x18f35b8c, 0xe3b7a795, 0xd4e7f0f0, 0x2fa30ce9, 0xb18ad950, 0x4ace2549, 0x7d9e722c, 0x86da8e35, +0x00000000, 0x650c00de, 0xa0b7a22f, 0xc5bba2f1, 0xa2dc11f4, 0xc7d0112a, 0x026bb3db, 0x6767b305, 0x9d16eee5, 0xf81aee3b, 0x3da14cca, 0x58ad4c14, 0x3fcaff11, 0x5ac6ffcf, 0x9f7d5d3e, 0xfa715de0, 0x73154f14, 0x16194fca, 0xd3a2ed3b, 0xb6aeede5, +0xd1c95ee0, 0xb4c55e3e, 0x717efccf, 0x1472fc11, 0xee03a1f1, 0x8b0fa12f, 0x4eb403de, 0x2bb80300, 0x4cdfb005, 0x29d3b0db, 0xec68122a, 0x896412f4, 0xa09e5eaa, 0xc5925e74, 0x0029fc85, 0x6525fc5b, 0x02424f5e, 0x674e4f80, 0xa2f5ed71, 0xc7f9edaf, +0x3d88b04f, 0x5884b091, 0x9d3f1260, 0xf83312be, 0x9f54a1bb, 0xfa58a165, 0x3fe30394, 0x5aef034a, 0xd38b11be, 0xb6871160, 0x733cb391, 0x1630b34f, 0x7157004a, 0x145b0094, 0xd1e0a265, 0xb4eca2bb, 0x4e9dff5b, 0x2b91ff85, 0xee2a5d74, 0x8b265daa, +0xec41eeaf, 0x894dee71, 0x4cf64c80, 0x29fa4c5e, 0x28b59a1c, 0x4db99ac2, 0x88023833, 0xed0e38ed, 0x8a698be8, 0xef658b36, 0x2ade29c7, 0x4fd22919, 0xb5a374f9, 0xd0af7427, 0x1514d6d6, 0x7018d608, 0x177f650d, 0x727365d3, 0xb7c8c722, 0xd2c4c7fc, +0x5ba0d508, 0x3eacd5d6, 0xfb177727, 0x9e1b77f9, 0xf97cc4fc, 0x9c70c422, 0x59cb66d3, 0x3cc7660d, 0xc6b63bed, 0xa3ba3b33, 0x660199c2, 0x030d991c, 0x646a2a19, 0x01662ac7, 0xc4dd8836, 0xa1d188e8, 0x882bc4b6, 0xed27c468, 0x289c6699, 0x4d906647, +0x2af7d542, 0x4ffbd59c, 0x8a40776d, 0xef4c77b3, 0x153d2a53, 0x70312a8d, 0xb58a887c, 0xd08688a2, 0xb7e13ba7, 0xd2ed3b79, 0x17569988, 0x725a9956, 0xfb3e8ba2, 0x9e328b7c, 0x5b89298d, 0x3e852953, 0x59e29a56, 0x3cee9a88, 0xf9553879, 0x9c5938a7, +0x66286547, 0x03246599, 0xc69fc768, 0xa393c7b6, 0xc4f474b3, 0xa1f8746d, 0x6443d69c, 0x014fd642, 0x557f5d9f, 0x30735d41, 0xf5c8ffb0, 0x90c4ff6e, 0xf7a34c6b, 0x92af4cb5, 0x5714ee44, 0x3218ee9a, 0xc869b37a, 0xad65b3a4, 0x68de1155, 0x0dd2118b, +0x6ab5a28e, 0x0fb9a250, 0xca0200a1, 0xaf0e007f, 0x266a128b, 0x43661255, 0x86ddb0a4, 0xe3d1b07a, 0x84b6037f, 0xe1ba03a1, 0x2401a150, 0x410da18e, 0xbb7cfc6e, 0xde70fcb0, 0x1bcb5e41, 0x7ec75e9f, 0x19a0ed9a, 0x7caced44, 0xb9174fb5, 0xdc1b4f6b, +0xf5e10335, 0x90ed03eb, 0x5556a11a, 0x305aa1c4, 0x573d12c1, 0x3231121f, 0xf78ab0ee, 0x9286b030, 0x68f7edd0, 0x0dfbed0e, 0xc8404fff, 0xad4c4f21, 0xca2bfc24, 0xaf27fcfa, 0x6a9c5e0b, 0x0f905ed5, 0x86f44c21, 0xe3f84cff, 0x2643ee0e, 0x434feed0, +0x24285dd5, 0x41245d0b, 0x849ffffa, 0xe193ff24, 0x1be2a2c4, 0x7eeea21a, 0xbb5500eb, 0xde590035, 0xb93eb330, 0xdc32b3ee, 0x1989111f, 0x7c8511c1, 0x7dcac783, 0x18c6c75d, 0xdd7d65ac, 0xb8716572, 0xdf16d677, 0xba1ad6a9, 0x7fa17458, 0x1aad7486, +0xe0dc2966, 0x85d029b8, 0x406b8b49, 0x25678b97, 0x42003892, 0x270c384c, 0xe2b79abd, 0x87bb9a63, 0x0edf8897, 0x6bd38849, 0xae682ab8, 0xcb642a66, 0xac039963, 0xc90f99bd, 0x0cb43b4c, 0x69b83b92, 0x93c96672, 0xf6c566ac, 0x337ec45d, 0x5672c483, +0x31157786, 0x54197758, 0x91a2d5a9, 0xf4aed577, 0xdd549929, 0xb85899f7, 0x7de33b06, 0x18ef3bd8, 0x7f8888dd, 0x1a848803, 0xdf3f2af2, 0xba332a2c, 0x404277cc, 0x254e7712, 0xe0f5d5e3, 0x85f9d53d, 0xe29e6638, 0x879266e6, 0x4229c417, 0x2725c4c9, +0xae41d63d, 0xcb4dd6e3, 0x0ef67412, 0x6bfa74cc, 0x0c9dc7c9, 0x6991c717, 0xac2a65e6, 0xc9266538, 0x335738d8, 0x565b3806, 0x93e09af7, 0xf6ec9a29, 0x918b292c, 0xf48729f2, 0x313c8b03, 0x54308bdd, 0x00000000, 0x8003b8bf, 0xed4c172e, 0x6d4faf91, +0x3c32f97d, 0xbc3141c2, 0xd17eee53, 0x517d56ec, 0x0ad430b2, 0x8ad7880d, 0xe798279c, 0x679b9f23, 0x36e6c9cf, 0xb6e57170, 0xdbaadee1, 0x5ba9665e, 0x0aeb4319, 0x8ae8fba6, 0xe7a75437, 0x67a4ec88, 0x36d9ba64, 0xb6da02db, 0xdb95ad4a, 0x5b9615f5, +0x003f73ab, 0x803ccb14, 0xed736485, 0x6d70dc3a, 0x3c0d8ad6, 0xbc0e3269, 0xd1419df8, 0x51422547, 0xc3a5ff88, 0x43a64737, 0x2ee9e8a6, 0xaeea5019, 0xff9706f5, 0x7f94be4a, 0x12db11db, 0x92d8a964, 0xc971cf3a, 0x49727785, 0x243dd814, 0xa43e60ab, +0xf5433647, 0x75408ef8, 0x180f2169, 0x980c99d6, 0xc94ebc91, 0x494d042e, 0x2402abbf, 0xa4011300, 0xf57c45ec, 0x757ffd53, 0x183052c2, 0x9833ea7d, 0xc39a8c23, 0x4399349c, 0x2ed69b0d, 0xaed523b2, 0xffa8755e, 0x7fabcde1, 0x12e46270, 0x92e7dacf, +0xb280f71e, 0x32834fa1, 0x5fcce030, 0xdfcf588f, 0x8eb20e63, 0x0eb1b6dc, 0x63fe194d, 0xe3fda1f2, 0xb854c7ac, 0x38577f13, 0x5518d082, 0xd51b683d, 0x84663ed1, 0x0465866e, 0x692a29ff, 0xe9299140, 0xb86bb407, 0x38680cb8, 0x5527a329, 0xd5241b96, +0x84594d7a, 0x045af5c5, 0x69155a54, 0xe916e2eb, 0xb2bf84b5, 0x32bc3c0a, 0x5ff3939b, 0xdff02b24, 0x8e8d7dc8, 0x0e8ec577, 0x63c16ae6, 0xe3c2d259, 0x71250896, 0xf126b029, 0x9c691fb8, 0x1c6aa707, 0x4d17f1eb, 0xcd144954, 0xa05be6c5, 0x20585e7a, +0x7bf13824, 0xfbf2809b, 0x96bd2f0a, 0x16be97b5, 0x47c3c159, 0xc7c079e6, 0xaa8fd677, 0x2a8c6ec8, 0x7bce4b8f, 0xfbcdf330, 0x96825ca1, 0x1681e41e, 0x47fcb2f2, 0xc7ff0a4d, 0xaab0a5dc, 0x2ab31d63, 0x711a7b3d, 0xf119c382, 0x9c566c13, 0x1c55d4ac, +0x4d288240, 0xcd2b3aff, 0xa064956e, 0x20672dd1, 0x32640545, 0xb267bdfa, 0xdf28126b, 0x5f2baad4, 0x0e56fc38, 0x8e554487, 0xe31aeb16, 0x631953a9, 0x38b035f7, 0xb8b38d48, 0xd5fc22d9, 0x55ff9a66, 0x0482cc8a, 0x84817435, 0xe9cedba4, 0x69cd631b, +0x388f465c, 0xb88cfee3, 0xd5c35172, 0x55c0e9cd, 0x04bdbf21, 0x84be079e, 0xe9f1a80f, 0x69f210b0, 0x325b76ee, 0xb258ce51, 0xdf1761c0, 0x5f14d97f, 0x0e698f93, 0x8e6a372c, 0xe32598bd, 0x63262002, 0xf1c1facd, 0x71c24272, 0x1c8dede3, 0x9c8e555c, +0xcdf303b0, 0x4df0bb0f, 0x20bf149e, 0xa0bcac21, 0xfb15ca7f, 0x7b1672c0, 0x1659dd51, 0x965a65ee, 0xc7273302, 0x47248bbd, 0x2a6b242c, 0xaa689c93, 0xfb2ab9d4, 0x7b29016b, 0x1666aefa, 0x96651645, 0xc71840a9, 0x471bf816, 0x2a545787, 0xaa57ef38, +0xf1fe8966, 0x71fd31d9, 0x1cb29e48, 0x9cb126f7, 0xcdcc701b, 0x4dcfc8a4, 0x20806735, 0xa083df8a, 0x80e4f25b, 0x00e74ae4, 0x6da8e575, 0xedab5dca, 0xbcd60b26, 0x3cd5b399, 0x519a1c08, 0xd199a4b7, 0x8a30c2e9, 0x0a337a56, 0x677cd5c7, 0xe77f6d78, +0xb6023b94, 0x3601832b, 0x5b4e2cba, 0xdb4d9405, 0x8a0fb142, 0x0a0c09fd, 0x6743a66c, 0xe7401ed3, 0xb63d483f, 0x363ef080, 0x5b715f11, 0xdb72e7ae, 0x80db81f0, 0x00d8394f, 0x6d9796de, 0xed942e61, 0xbce9788d, 0x3ceac032, 0x51a56fa3, 0xd1a6d71c, +0x43410dd3, 0xc342b56c, 0xae0d1afd, 0x2e0ea242, 0x7f73f4ae, 0xff704c11, 0x923fe380, 0x123c5b3f, 0x49953d61, 0xc99685de, 0xa4d92a4f, 0x24da92f0, 0x75a7c41c, 0xf5a47ca3, 0x98ebd332, 0x18e86b8d, 0x49aa4eca, 0xc9a9f675, 0xa4e659e4, 0x24e5e15b, +0x7598b7b7, 0xf59b0f08, 0x98d4a099, 0x18d71826, 0x437e7e78, 0xc37dc6c7, 0xae326956, 0x2e31d1e9, 0x7f4c8705, 0xff4f3fba, 0x9200902b, 0x12032894, 0x00000000, 0xa74f7046, 0x903c05a1, 0x377375e7, 0x934beab9, 0x34049aff, 0x0377ef18, 0xa4389f5e, +0x0d930f5f, 0xaadc7f19, 0x9daf0afe, 0x3ae07ab8, 0x9ed8e5e6, 0x399795a0, 0x0ee4e047, 0xa9ab9001, 0x59dc821f, 0xfe93f259, 0xc9e087be, 0x6eaff7f8, 0xca9768a6, 0x6dd818e0, 0x5aab6d07, 0xfde41d41, 0x544f8d40, 0xf300fd06, 0xc47388e1, 0x633cf8a7, +0xc70467f9, 0x604b17bf, 0x57386258, 0xf077121e, 0xe5b0992e, 0x42ffe968, 0x758c9c8f, 0xd2c3ecc9, 0x76fb7397, 0xd1b403d1, 0xe6c77636, 0x41880670, 0xe8239671, 0x4f6ce637, 0x781f93d0, 0xdf50e396, 0x7b687cc8, 0xdc270c8e, 0xeb547969, 0x4c1b092f, +0xbc6c1b31, 0x1b236b77, 0x2c501e90, 0x8b1f6ed6, 0x2f27f188, 0x886881ce, 0xbf1bf429, 0x1854846f, 0xb1ff146e, 0x16b06428, 0x21c311cf, 0x868c6189, 0x22b4fed7, 0x85fb8e91, 0xb288fb76, 0x15c78b30, 0x9c0172c2, 0x3b4e0284, 0x0c3d7763, 0xab720725, +0x0f4a987b, 0xa805e83d, 0x9f769dda, 0x3839ed9c, 0x91927d9d, 0x36dd0ddb, 0x01ae783c, 0xa6e1087a, 0x02d99724, 0xa596e762, 0x92e59285, 0x35aae2c3, 0xc5ddf0dd, 0x6292809b, 0x55e1f57c, 0xf2ae853a, 0x56961a64, 0xf1d96a22, 0xc6aa1fc5, 0x61e56f83, +0xc84eff82, 0x6f018fc4, 0x5872fa23, 0xff3d8a65, 0x5b05153b, 0xfc4a657d, 0xcb39109a, 0x6c7660dc, 0x79b1ebec, 0xdefe9baa, 0xe98dee4d, 0x4ec29e0b, 0xeafa0155, 0x4db57113, 0x7ac604f4, 0xdd8974b2, 0x7422e4b3, 0xd36d94f5, 0xe41ee112, 0x43519154, +0xe7690e0a, 0x40267e4c, 0x77550bab, 0xd01a7bed, 0x206d69f3, 0x872219b5, 0xb0516c52, 0x171e1c14, 0xb326834a, 0x1469f30c, 0x231a86eb, 0x8455f6ad, 0x2dfe66ac, 0x8ab116ea, 0xbdc2630d, 0x1a8d134b, 0xbeb58c15, 0x19fafc53, 0x2e8989b4, 0x89c6f9f2, +0x18ff9708, 0xbfb0e74e, 0x88c392a9, 0x2f8ce2ef, 0x8bb47db1, 0x2cfb0df7, 0x1b887810, 0xbcc70856, 0x156c9857, 0xb223e811, 0x85509df6, 0x221fedb0, 0x862772ee, 0x216802a8, 0x161b774f, 0xb1540709, 0x41231517, 0xe66c6551, 0xd11f10b6, 0x765060f0, +0xd268ffae, 0x75278fe8, 0x4254fa0f, 0xe51b8a49, 0x4cb01a48, 0xebff6a0e, 0xdc8c1fe9, 0x7bc36faf, 0xdffbf0f1, 0x78b480b7, 0x4fc7f550, 0xe8888516, 0xfd4f0e26, 0x5a007e60, 0x6d730b87, 0xca3c7bc1, 0x6e04e49f, 0xc94b94d9, 0xfe38e13e, 0x59779178, +0xf0dc0179, 0x5793713f, 0x60e004d8, 0xc7af749e, 0x6397ebc0, 0xc4d89b86, 0xf3abee61, 0x54e49e27, 0xa4938c39, 0x03dcfc7f, 0x34af8998, 0x93e0f9de, 0x37d86680, 0x909716c6, 0xa7e46321, 0x00ab1367, 0xa9008366, 0x0e4ff320, 0x393c86c7, 0x9e73f681, +0x3a4b69df, 0x9d041999, 0xaa776c7e, 0x0d381c38, 0x84fee5ca, 0x23b1958c, 0x14c2e06b, 0xb38d902d, 0x17b50f73, 0xb0fa7f35, 0x87890ad2, 0x20c67a94, 0x896dea95, 0x2e229ad3, 0x1951ef34, 0xbe1e9f72, 0x1a26002c, 0xbd69706a, 0x8a1a058d, 0x2d5575cb, +0xdd2267d5, 0x7a6d1793, 0x4d1e6274, 0xea511232, 0x4e698d6c, 0xe926fd2a, 0xde5588cd, 0x791af88b, 0xd0b1688a, 0x77fe18cc, 0x408d6d2b, 0xe7c21d6d, 0x43fa8233, 0xe4b5f275, 0xd3c68792, 0x7489f7d4, 0x614e7ce4, 0xc6010ca2, 0xf1727945, 0x563d0903, +0xf205965d, 0x554ae61b, 0x623993fc, 0xc576e3ba, 0x6cdd73bb, 0xcb9203fd, 0xfce1761a, 0x5bae065c, 0xff969902, 0x58d9e944, 0x6faa9ca3, 0xc8e5ece5, 0x3892fefb, 0x9fdd8ebd, 0xa8aefb5a, 0x0fe18b1c, 0xabd91442, 0x0c966404, 0x3be511e3, 0x9caa61a5, +0x3501f1a4, 0x924e81e2, 0xa53df405, 0x02728443, 0xa64a1b1d, 0x01056b5b, 0x36761ebc, 0x91396efa, 0x00000000, 0xd3c1608f, 0xbf687e72, 0x6ca91efd, 0x8cb01eca, 0x5f717e45, 0x33d860b8, 0xe0190037, 0x123b7183, 0xc1fa110c, 0xad530ff1, 0x7e926f7e, +0x9e8b6f49, 0x4d4a0fc6, 0x21e3113b, 0xf22271b4, 0xe73a7ab1, 0x34fb1a3e, 0x585204c3, 0x8b93644c, 0x6b8a647b, 0xb84b04f4, 0xd4e21a09, 0x07237a86, 0xf5010b32, 0x26c06bbd, 0x4a697540, 0x99a815cf, 0x79b115f8, 0xaa707577, 0xc6d96b8a, 0x15180b05, +0xb493a61d, 0x6752c692, 0x0bfbd86f, 0xd83ab8e0, 0x3823b8d7, 0xebe2d858, 0x874bc6a5, 0x548aa62a, 0xa6a8d79e, 0x7569b711, 0x19c0a9ec, 0xca01c963, 0x2a18c954, 0xf9d9a9db, 0x9570b726, 0x46b1d7a9, 0x53a9dcac, 0x8068bc23, 0xecc1a2de, 0x3f00c251, +0xdf19c266, 0x0cd8a2e9, 0x6071bc14, 0xb3b0dc9b, 0x4192ad2f, 0x9253cda0, 0xfefad35d, 0x2d3bb3d2, 0xcd22b3e5, 0x1ee3d36a, 0x724acd97, 0xa18bad18, 0x48b390c2, 0x9b72f04d, 0xf7dbeeb0, 0x241a8e3f, 0xc4038e08, 0x17c2ee87, 0x7b6bf07a, 0xa8aa90f5, +0x5a88e141, 0x894981ce, 0xe5e09f33, 0x3621ffbc, 0xd638ff8b, 0x05f99f04, 0x695081f9, 0xba91e176, 0xaf89ea73, 0x7c488afc, 0x10e19401, 0xc320f48e, 0x2339f4b9, 0xf0f89436, 0x9c518acb, 0x4f90ea44, 0xbdb29bf0, 0x6e73fb7f, 0x02dae582, 0xd11b850d, +0x3102853a, 0xe2c3e5b5, 0x8e6afb48, 0x5dab9bc7, 0xfc2036df, 0x2fe15650, 0x434848ad, 0x90892822, 0x70902815, 0xa351489a, 0xcff85667, 0x1c3936e8, 0xee1b475c, 0x3dda27d3, 0x5173392e, 0x82b259a1, 0x62ab5996, 0xb16a3919, 0xddc327e4, 0x0e02476b, +0x1b1a4c6e, 0xc8db2ce1, 0xa472321c, 0x77b35293, 0x97aa52a4, 0x446b322b, 0x28c22cd6, 0xfb034c59, 0x09213ded, 0xdae05d62, 0xb649439f, 0x65882310, 0x85912327, 0x565043a8, 0x3af95d55, 0xe9383dda, 0x16b4abba, 0xc575cb35, 0xa9dcd5c8, 0x7a1db547, +0x9a04b570, 0x49c5d5ff, 0x256ccb02, 0xf6adab8d, 0x048fda39, 0xd74ebab6, 0xbbe7a44b, 0x6826c4c4, 0x883fc4f3, 0x5bfea47c, 0x3757ba81, 0xe496da0e, 0xf18ed10b, 0x224fb184, 0x4ee6af79, 0x9d27cff6, 0x7d3ecfc1, 0xaeffaf4e, 0xc256b1b3, 0x1197d13c, +0xe3b5a088, 0x3074c007, 0x5cdddefa, 0x8f1cbe75, 0x6f05be42, 0xbcc4decd, 0xd06dc030, 0x03aca0bf, 0xa2270da7, 0x71e66d28, 0x1d4f73d5, 0xce8e135a, 0x2e97136d, 0xfd5673e2, 0x91ff6d1f, 0x423e0d90, 0xb01c7c24, 0x63dd1cab, 0x0f740256, 0xdcb562d9, +0x3cac62ee, 0xef6d0261, 0x83c41c9c, 0x50057c13, 0x451d7716, 0x96dc1799, 0xfa750964, 0x29b469eb, 0xc9ad69dc, 0x1a6c0953, 0x76c517ae, 0xa5047721, 0x57260695, 0x84e7661a, 0xe84e78e7, 0x3b8f1868, 0xdb96185f, 0x085778d0, 0x64fe662d, 0xb73f06a2, +0x5e073b78, 0x8dc65bf7, 0xe16f450a, 0x32ae2585, 0xd2b725b2, 0x0176453d, 0x6ddf5bc0, 0xbe1e3b4f, 0x4c3c4afb, 0x9ffd2a74, 0xf3543489, 0x20955406, 0xc08c5431, 0x134d34be, 0x7fe42a43, 0xac254acc, 0xb93d41c9, 0x6afc2146, 0x06553fbb, 0xd5945f34, +0x358d5f03, 0xe64c3f8c, 0x8ae52171, 0x592441fe, 0xab06304a, 0x78c750c5, 0x146e4e38, 0xc7af2eb7, 0x27b62e80, 0xf4774e0f, 0x98de50f2, 0x4b1f307d, 0xea949d65, 0x3955fdea, 0x55fce317, 0x863d8398, 0x662483af, 0xb5e5e320, 0xd94cfddd, 0x0a8d9d52, +0xf8afece6, 0x2b6e8c69, 0x47c79294, 0x9406f21b, 0x741ff22c, 0xa7de92a3, 0xcb778c5e, 0x18b6ecd1, 0x0daee7d4, 0xde6f875b, 0xb2c699a6, 0x6107f929, 0x811ef91e, 0x52df9991, 0x3e76876c, 0xedb7e7e3, 0x1f959657, 0xcc54f6d8, 0xa0fde825, 0x733c88aa, +0x9325889d, 0x40e4e812, 0x2c4df6ef, 0xff8c9660, 0x00000000, 0x17ff452e, 0x9ce9d335, 0x8b16961b, 0x61be9cd8, 0x7641d9f6, 0xfd574fed, 0xeaa80ac3, 0xb7834189, 0xa07c04a7, 0x2b6a92bc, 0x3c95d792, 0xd63ddd51, 0xc1c2987f, 0x4ad40e64, 0x5d2b4b4a, +0x9bcfd61d, 0x8c309333, 0x07260528, 0x10d94006, 0xfa714ac5, 0xed8e0feb, 0x669899f0, 0x7167dcde, 0x2c4c9794, 0x3bb3d2ba, 0xb0a544a1, 0xa75a018f, 0x4df20b4c, 0x5a0d4e62, 0xd11bd879, 0xc6e49d57, 0x1616107c, 0x01e95552, 0x8affc349, 0x9d008667, +0x77a88ca4, 0x6057c98a, 0xeb415f91, 0xfcbe1abf, 0xa19551f5, 0xb66a14db, 0x3d7c82c0, 0x2a83c7ee, 0xc02bcd2d, 0xd7d48803, 0x5cc21e18, 0x4b3d5b36, 0x8dd9c661, 0x9a26834f, 0x11301554, 0x06cf507a, 0xec675ab9, 0xfb981f97, 0x708e898c, 0x6771cca2, +0x3a5a87e8, 0x2da5c2c6, 0xa6b354dd, 0xb14c11f3, 0x5be41b30, 0x4c1b5e1e, 0xc70dc805, 0xd0f28d2b, 0x72c5fc0d, 0x653ab923, 0xee2c2f38, 0xf9d36a16, 0x137b60d5, 0x048425fb, 0x8f92b3e0, 0x986df6ce, 0xc546bd84, 0xd2b9f8aa, 0x59af6eb1, 0x4e502b9f, +0xa4f8215c, 0xb3076472, 0x3811f269, 0x2feeb747, 0xe90a2a10, 0xfef56f3e, 0x75e3f925, 0x621cbc0b, 0x88b4b6c8, 0x9f4bf3e6, 0x145d65fd, 0x03a220d3, 0x5e896b99, 0x49762eb7, 0xc260b8ac, 0xd59ffd82, 0x3f37f741, 0x28c8b26f, 0xa3de2474, 0xb421615a, +0x64d3ec71, 0x732ca95f, 0xf83a3f44, 0xefc57a6a, 0x056d70a9, 0x12923587, 0x9984a39c, 0x8e7be6b2, 0xd350adf8, 0xc4afe8d6, 0x4fb97ecd, 0x58463be3, 0xb2ee3120, 0xa511740e, 0x2e07e215, 0x39f8a73b, 0xff1c3a6c, 0xe8e37f42, 0x63f5e959, 0x740aac77, +0x9ea2a6b4, 0x895de39a, 0x024b7581, 0x15b430af, 0x489f7be5, 0x5f603ecb, 0xd476a8d0, 0xc389edfe, 0x2921e73d, 0x3edea213, 0xb5c83408, 0xa2377126, 0xe87fce25, 0xff808b0b, 0x74961d10, 0x6369583e, 0x89c152fd, 0x9e3e17d3, 0x152881c8, 0x02d7c4e6, +0x5ffc8fac, 0x4803ca82, 0xc3155c99, 0xd4ea19b7, 0x3e421374, 0x29bd565a, 0xa2abc041, 0xb554856f, 0x73b01838, 0x644f5d16, 0xef59cb0d, 0xf8a68e23, 0x120e84e0, 0x05f1c1ce, 0x8ee757d5, 0x991812fb, 0xc43359b1, 0xd3cc1c9f, 0x58da8a84, 0x4f25cfaa, +0xa58dc569, 0xb2728047, 0x3964165c, 0x2e9b5372, 0xfe69de59, 0xe9969b77, 0x62800d6c, 0x757f4842, 0x9fd74281, 0x882807af, 0x033e91b4, 0x14c1d49a, 0x49ea9fd0, 0x5e15dafe, 0xd5034ce5, 0xc2fc09cb, 0x28540308, 0x3fab4626, 0xb4bdd03d, 0xa3429513, +0x65a60844, 0x72594d6a, 0xf94fdb71, 0xeeb09e5f, 0x0418949c, 0x13e7d1b2, 0x98f147a9, 0x8f0e0287, 0xd22549cd, 0xc5da0ce3, 0x4ecc9af8, 0x5933dfd6, 0xb39bd515, 0xa464903b, 0x2f720620, 0x388d430e, 0x9aba3228, 0x8d457706, 0x0653e11d, 0x11aca433, +0xfb04aef0, 0xecfbebde, 0x67ed7dc5, 0x701238eb, 0x2d3973a1, 0x3ac6368f, 0xb1d0a094, 0xa62fe5ba, 0x4c87ef79, 0x5b78aa57, 0xd06e3c4c, 0xc7917962, 0x0175e435, 0x168aa11b, 0x9d9c3700, 0x8a63722e, 0x60cb78ed, 0x77343dc3, 0xfc22abd8, 0xebddeef6, +0xb6f6a5bc, 0xa109e092, 0x2a1f7689, 0x3de033a7, 0xd7483964, 0xc0b77c4a, 0x4ba1ea51, 0x5c5eaf7f, 0x8cac2254, 0x9b53677a, 0x1045f161, 0x07bab44f, 0xed12be8c, 0xfaedfba2, 0x71fb6db9, 0x66042897, 0x3b2f63dd, 0x2cd026f3, 0xa7c6b0e8, 0xb039f5c6, +0x5a91ff05, 0x4d6eba2b, 0xc6782c30, 0xd187691e, 0x1763f449, 0x009cb167, 0x8b8a277c, 0x9c756252, 0x76dd6891, 0x61222dbf, 0xea34bba4, 0xfdcbfe8a, 0xa0e0b5c0, 0xb71ff0ee, 0x3c0966f5, 0x2bf623db, 0xc15e2918, 0xd6a16c36, 0x5db7fa2d, 0x4a48bf03, +0x00000000, 0xcd4f5e33, 0x54f35ed9, 0x99bc00ea, 0x11ab07dc, 0xdce459ef, 0x45585905, 0x88170736, 0xfb246a46, 0x366b3475, 0xafd7349f, 0x62986aac, 0xea8f6d9a, 0x27c033a9, 0xbe7c3343, 0x73336d70, 0xa1a9acba, 0x6ce6f289, 0xf55af263, 0x3815ac50, +0xb002ab66, 0x7d4df555, 0xe4f1f5bf, 0x29beab8c, 0x5a8dc6fc, 0x97c298cf, 0x0e7e9825, 0xc331c616, 0x4b26c120, 0x86699f13, 0x1fd59ff9, 0xd29ac1ca, 0x36581681, 0xfb1748b2, 0x62ab4858, 0xafe4166b, 0x27f3115d, 0xeabc4f6e, 0x73004f84, 0xbe4f11b7, +0xcd7c7cc7, 0x003322f4, 0x998f221e, 0x54c07c2d, 0xdcd77b1b, 0x11982528, 0x882425c2, 0x456b7bf1, 0x97f1ba3b, 0x5abee408, 0xc302e4e2, 0x0e4dbad1, 0x865abde7, 0x4b15e3d4, 0xd2a9e33e, 0x1fe6bd0d, 0x6cd5d07d, 0xa19a8e4e, 0x38268ea4, 0xf569d097, +0x7d7ed7a1, 0xb0318992, 0x298d8978, 0xe4c2d74b, 0x86ab626c, 0x4be43c5f, 0xd2583cb5, 0x1f176286, 0x970065b0, 0x5a4f3b83, 0xc3f33b69, 0x0ebc655a, 0x7d8f082a, 0xb0c05619, 0x297c56f3, 0xe43308c0, 0x6c240ff6, 0xa16b51c5, 0x38d7512f, 0xf5980f1c, +0x2702ced6, 0xea4d90e5, 0x73f1900f, 0xbebece3c, 0x36a9c90a, 0xfbe69739, 0x625a97d3, 0xaf15c9e0, 0xdc26a490, 0x1169faa3, 0x88d5fa49, 0x459aa47a, 0xcd8da34c, 0x00c2fd7f, 0x997efd95, 0x5431a3a6, 0xb0f374ed, 0x7dbc2ade, 0xe4002a34, 0x294f7407, +0xa1587331, 0x6c172d02, 0xf5ab2de8, 0x38e473db, 0x4bd71eab, 0x86984098, 0x1f244072, 0xd26b1e41, 0x5a7c1977, 0x97334744, 0x0e8f47ae, 0xc3c0199d, 0x115ad857, 0xdc158664, 0x45a9868e, 0x88e6d8bd, 0x00f1df8b, 0xcdbe81b8, 0x54028152, 0x994ddf61, +0xea7eb211, 0x2731ec22, 0xbe8decc8, 0x73c2b2fb, 0xfbd5b5cd, 0x369aebfe, 0xaf26eb14, 0x6269b527, 0xf9e9c67b, 0x34a69848, 0xad1a98a2, 0x6055c691, 0xe842c1a7, 0x250d9f94, 0xbcb19f7e, 0x71fec14d, 0x02cdac3d, 0xcf82f20e, 0x563ef2e4, 0x9b71acd7, +0x1366abe1, 0xde29f5d2, 0x4795f538, 0x8adaab0b, 0x58406ac1, 0x950f34f2, 0x0cb33418, 0xc1fc6a2b, 0x49eb6d1d, 0x84a4332e, 0x1d1833c4, 0xd0576df7, 0xa3640087, 0x6e2b5eb4, 0xf7975e5e, 0x3ad8006d, 0xb2cf075b, 0x7f805968, 0xe63c5982, 0x2b7307b1, +0xcfb1d0fa, 0x02fe8ec9, 0x9b428e23, 0x560dd010, 0xde1ad726, 0x13558915, 0x8ae989ff, 0x47a6d7cc, 0x3495babc, 0xf9dae48f, 0x6066e465, 0xad29ba56, 0x253ebd60, 0xe871e353, 0x71cde3b9, 0xbc82bd8a, 0x6e187c40, 0xa3572273, 0x3aeb2299, 0xf7a47caa, +0x7fb37b9c, 0xb2fc25af, 0x2b402545, 0xe60f7b76, 0x953c1606, 0x58734835, 0xc1cf48df, 0x0c8016ec, 0x849711da, 0x49d84fe9, 0xd0644f03, 0x1d2b1130, 0x7f42a417, 0xb20dfa24, 0x2bb1face, 0xe6fea4fd, 0x6ee9a3cb, 0xa3a6fdf8, 0x3a1afd12, 0xf755a321, +0x8466ce51, 0x49299062, 0xd0959088, 0x1ddacebb, 0x95cdc98d, 0x588297be, 0xc13e9754, 0x0c71c967, 0xdeeb08ad, 0x13a4569e, 0x8a185674, 0x47570847, 0xcf400f71, 0x020f5142, 0x9bb351a8, 0x56fc0f9b, 0x25cf62eb, 0xe8803cd8, 0x713c3c32, 0xbc736201, +0x34646537, 0xf92b3b04, 0x60973bee, 0xadd865dd, 0x491ab296, 0x8455eca5, 0x1de9ec4f, 0xd0a6b27c, 0x58b1b54a, 0x95feeb79, 0x0c42eb93, 0xc10db5a0, 0xb23ed8d0, 0x7f7186e3, 0xe6cd8609, 0x2b82d83a, 0xa395df0c, 0x6eda813f, 0xf76681d5, 0x3a29dfe6, +0xe8b31e2c, 0x25fc401f, 0xbc4040f5, 0x710f1ec6, 0xf91819f0, 0x345747c3, 0xadeb4729, 0x60a4191a, 0x1397746a, 0xded82a59, 0x47642ab3, 0x8a2b7480, 0x023c73b6, 0xcf732d85, 0x56cf2d6f, 0x9b80735c, 0x00000000, 0x53473bc7, 0xdd1d301d, 0x8e5a0bda, +0xb4de977a, 0xe799acbd, 0x69c3a767, 0x3a849ca0, 0x74cc8782, 0x278bbc45, 0xa9d1b79f, 0xfa968c58, 0xc01210f8, 0x93552b3f, 0x1d0f20e5, 0x4e481b22, 0x5b255b0a, 0x086260cd, 0x86386b17, 0xd57f50d0, 0xeffbcc70, 0xbcbcf7b7, 0x32e6fc6d, 0x61a1c7aa, +0x2fe9dc88, 0x7caee74f, 0xf2f4ec95, 0xa1b3d752, 0x9b374bf2, 0xc8707035, 0x462a7bef, 0x156d4028, 0x004aa5f7, 0x530d9e30, 0xdd5795ea, 0x8e10ae2d, 0xb494328d, 0xe7d3094a, 0x69890290, 0x3ace3957, 0x74862275, 0x27c119b2, 0xa99b1268, 0xfadc29af, +0xc058b50f, 0x931f8ec8, 0x1d458512, 0x4e02bed5, 0x5b6ffefd, 0x0828c53a, 0x8672cee0, 0xd535f527, 0xefb16987, 0xbcf65240, 0x32ac599a, 0x61eb625d, 0x2fa3797f, 0x7ce442b8, 0xf2be4962, 0xa1f972a5, 0x9b7dee05, 0xc83ad5c2, 0x4660de18, 0x1527e5df, +0x284fc2b9, 0x7b08f97e, 0xf552f2a4, 0xa615c963, 0x9c9155c3, 0xcfd66e04, 0x418c65de, 0x12cb5e19, 0x5c83453b, 0x0fc47efc, 0x819e7526, 0xd2d94ee1, 0xe85dd241, 0xbb1ae986, 0x3540e25c, 0x6607d99b, 0x736a99b3, 0x202da274, 0xae77a9ae, 0xfd309269, +0xc7b40ec9, 0x94f3350e, 0x1aa93ed4, 0x49ee0513, 0x07a61e31, 0x54e125f6, 0xdabb2e2c, 0x89fc15eb, 0xb378894b, 0xe03fb28c, 0x6e65b956, 0x3d228291, 0x2805674e, 0x7b425c89, 0xf5185753, 0xa65f6c94, 0x9cdbf034, 0xcf9ccbf3, 0x41c6c029, 0x1281fbee, +0x5cc9e0cc, 0x0f8edb0b, 0x81d4d0d1, 0xd293eb16, 0xe81777b6, 0xbb504c71, 0x350a47ab, 0x664d7c6c, 0x73203c44, 0x20670783, 0xae3d0c59, 0xfd7a379e, 0xc7feab3e, 0x94b990f9, 0x1ae39b23, 0x49a4a0e4, 0x07ecbbc6, 0x54ab8001, 0xdaf18bdb, 0x89b6b01c, +0xb3322cbc, 0xe075177b, 0x6e2f1ca1, 0x3d682766, 0x6ae094ed, 0x39a7af2a, 0xb7fda4f0, 0xe4ba9f37, 0xde3e0397, 0x8d793850, 0x0323338a, 0x5064084d, 0x1e2c136f, 0x4d6b28a8, 0xc3312372, 0x907618b5, 0xaaf28415, 0xf9b5bfd2, 0x77efb408, 0x24a88fcf, +0x31c5cfe7, 0x6282f420, 0xecd8fffa, 0xbf9fc43d, 0x851b589d, 0xd65c635a, 0x58066880, 0x0b415347, 0x45094865, 0x164e73a2, 0x98147878, 0xcb5343bf, 0xf1d7df1f, 0xa290e4d8, 0x2ccaef02, 0x7f8dd4c5, 0x6aaa311a, 0x39ed0add, 0xb7b70107, 0xe4f03ac0, +0xde74a660, 0x8d339da7, 0x0369967d, 0x502eadba, 0x1e66b698, 0x4d218d5f, 0xc37b8685, 0x903cbd42, 0xaab821e2, 0xf9ff1a25, 0x77a511ff, 0x24e22a38, 0x318f6a10, 0x62c851d7, 0xec925a0d, 0xbfd561ca, 0x8551fd6a, 0xd616c6ad, 0x584ccd77, 0x0b0bf6b0, +0x4543ed92, 0x1604d655, 0x985edd8f, 0xcb19e648, 0xf19d7ae8, 0xa2da412f, 0x2c804af5, 0x7fc77132, 0x42af5654, 0x11e86d93, 0x9fb26649, 0xccf55d8e, 0xf671c12e, 0xa536fae9, 0x2b6cf133, 0x782bcaf4, 0x3663d1d6, 0x6524ea11, 0xeb7ee1cb, 0xb839da0c, +0x82bd46ac, 0xd1fa7d6b, 0x5fa076b1, 0x0ce74d76, 0x198a0d5e, 0x4acd3699, 0xc4973d43, 0x97d00684, 0xad549a24, 0xfe13a1e3, 0x7049aa39, 0x230e91fe, 0x6d468adc, 0x3e01b11b, 0xb05bbac1, 0xe31c8106, 0xd9981da6, 0x8adf2661, 0x04852dbb, 0x57c2167c, +0x42e5f3a3, 0x11a2c864, 0x9ff8c3be, 0xccbff879, 0xf63b64d9, 0xa57c5f1e, 0x2b2654c4, 0x78616f03, 0x36297421, 0x656e4fe6, 0xeb34443c, 0xb8737ffb, 0x82f7e35b, 0xd1b0d89c, 0x5fead346, 0x0cade881, 0x19c0a8a9, 0x4a87936e, 0xc4dd98b4, 0x979aa373, +0xad1e3fd3, 0xfe590414, 0x70030fce, 0x23443409, 0x6d0c2f2b, 0x3e4b14ec, 0xb0111f36, 0xe35624f1, 0xd9d2b851, 0x8a958396, 0x04cf884c, 0x5788b38b, 0x00000000, 0x72de2a10, 0xa1f51ba2, 0xd32b31b2, 0x36b029e9, 0x446e03f9, 0x9745324b, 0xe59b185b, +0x67aa4093, 0x15746a83, 0xc65f5b31, 0xb4817121, 0x511a697a, 0x23c4436a, 0xf0ef72d8, 0x823158c8, 0x423e3e7c, 0x30e0146c, 0xe3cb25de, 0x91150fce, 0x748e1795, 0x06503d85, 0xd57b0c37, 0xa7a52627, 0x25947eef, 0x574a54ff, 0x8461654d, 0xf6bf4f5d, +0x13245706, 0x61fa7d16, 0xb2d14ca4, 0xc00f66b4, 0x4b64cf29, 0x39bae539, 0xea91d48b, 0x984ffe9b, 0x7dd4e6c0, 0x0f0accd0, 0xdc21fd62, 0xaeffd772, 0x2cce8fba, 0x5e10a5aa, 0x8d3b9418, 0xffe5be08, 0x1a7ea653, 0x68a08c43, 0xbb8bbdf1, 0xc95597e1, +0x095af155, 0x7b84db45, 0xa8afeaf7, 0xda71c0e7, 0x3fead8bc, 0x4d34f2ac, 0x9e1fc31e, 0xecc1e90e, 0x6ef0b1c6, 0x1c2e9bd6, 0xcf05aa64, 0xbddb8074, 0x5840982f, 0x2a9eb23f, 0xf9b5838d, 0x8b6ba99d, 0x14145443, 0x66ca7e53, 0xb5e14fe1, 0xc73f65f1, +0x22a47daa, 0x507a57ba, 0x83516608, 0xf18f4c18, 0x73be14d0, 0x01603ec0, 0xd24b0f72, 0xa0952562, 0x450e3d39, 0x37d01729, 0xe4fb269b, 0x96250c8b, 0x562a6a3f, 0x24f4402f, 0xf7df719d, 0x85015b8d, 0x609a43d6, 0x124469c6, 0xc16f5874, 0xb3b17264, +0x31802aac, 0x435e00bc, 0x9075310e, 0xe2ab1b1e, 0x07300345, 0x75ee2955, 0xa6c518e7, 0xd41b32f7, 0x5f709b6a, 0x2daeb17a, 0xfe8580c8, 0x8c5baad8, 0x69c0b283, 0x1b1e9893, 0xc835a921, 0xbaeb8331, 0x38dadbf9, 0x4a04f1e9, 0x992fc05b, 0xebf1ea4b, +0x0e6af210, 0x7cb4d800, 0xaf9fe9b2, 0xdd41c3a2, 0x1d4ea516, 0x6f908f06, 0xbcbbbeb4, 0xce6594a4, 0x2bfe8cff, 0x5920a6ef, 0x8a0b975d, 0xf8d5bd4d, 0x7ae4e585, 0x083acf95, 0xdb11fe27, 0xa9cfd437, 0x4c54cc6c, 0x3e8ae67c, 0xeda1d7ce, 0x9f7ffdde, +0x4b57836f, 0x3989a97f, 0xeaa298cd, 0x987cb2dd, 0x7de7aa86, 0x0f398096, 0xdc12b124, 0xaecc9b34, 0x2cfdc3fc, 0x5e23e9ec, 0x8d08d85e, 0xffd6f24e, 0x1a4dea15, 0x6893c005, 0xbbb8f1b7, 0xc966dba7, 0x0969bd13, 0x7bb79703, 0xa89ca6b1, 0xda428ca1, +0x3fd994fa, 0x4d07beea, 0x9e2c8f58, 0xecf2a548, 0x6ec3fd80, 0x1c1dd790, 0xcf36e622, 0xbde8cc32, 0x5873d469, 0x2aadfe79, 0xf986cfcb, 0x8b58e5db, 0x00334c46, 0x72ed6656, 0xa1c657e4, 0xd3187df4, 0x368365af, 0x445d4fbf, 0x97767e0d, 0xe5a8541d, +0x67990cd5, 0x154726c5, 0xc66c1777, 0xb4b23d67, 0x5129253c, 0x23f70f2c, 0xf0dc3e9e, 0x8202148e, 0x420d723a, 0x30d3582a, 0xe3f86998, 0x91264388, 0x74bd5bd3, 0x066371c3, 0xd5484071, 0xa7966a61, 0x25a732a9, 0x577918b9, 0x8452290b, 0xf68c031b, +0x13171b40, 0x61c93150, 0xb2e200e2, 0xc03c2af2, 0x5f43d72c, 0x2d9dfd3c, 0xfeb6cc8e, 0x8c68e69e, 0x69f3fec5, 0x1b2dd4d5, 0xc806e567, 0xbad8cf77, 0x38e997bf, 0x4a37bdaf, 0x991c8c1d, 0xebc2a60d, 0x0e59be56, 0x7c879446, 0xafaca5f4, 0xdd728fe4, +0x1d7de950, 0x6fa3c340, 0xbc88f2f2, 0xce56d8e2, 0x2bcdc0b9, 0x5913eaa9, 0x8a38db1b, 0xf8e6f10b, 0x7ad7a9c3, 0x080983d3, 0xdb22b261, 0xa9fc9871, 0x4c67802a, 0x3eb9aa3a, 0xed929b88, 0x9f4cb198, 0x14271805, 0x66f93215, 0xb5d203a7, 0xc70c29b7, +0x229731ec, 0x50491bfc, 0x83622a4e, 0xf1bc005e, 0x738d5896, 0x01537286, 0xd2784334, 0xa0a66924, 0x453d717f, 0x37e35b6f, 0xe4c86add, 0x961640cd, 0x56192679, 0x24c70c69, 0xf7ec3ddb, 0x853217cb, 0x60a90f90, 0x12772580, 0xc15c1432, 0xb3823e22, +0x31b366ea, 0x436d4cfa, 0x90467d48, 0xe2985758, 0x07034f03, 0x75dd6513, 0xa6f654a1, 0xd4287eb1, 0x00000000, 0x80189a21, 0x00772f50, 0x806fb571, 0x869a6135, 0x0682fb14, 0x86ed4e65, 0x06f5d444, 0x66d15522, 0xe6c9cf03, 0x66a67a72, 0xe6bee053, +0xe04b3417, 0x6053ae36, 0xe03c1b47, 0x60248166, 0x7e26ae7e, 0xfe3e345f, 0x7e51812e, 0xfe491b0f, 0xf8bccf4b, 0x78a4556a, 0xf8cbe01b, 0x78d37a3a, 0x18f7fb5c, 0x98ef617d, 0x1880d40c, 0x98984e2d, 0x9e6d9a69, 0x1e750048, 0x9e1ab539, 0x1e022f18, +0xdce82854, 0x5cf0b275, 0xdc9f0704, 0x5c879d25, 0x5a724961, 0xda6ad340, 0x5a056631, 0xda1dfc10, 0xba397d76, 0x3a21e757, 0xba4e5226, 0x3a56c807, 0x3ca31c43, 0xbcbb8662, 0x3cd43313, 0xbccca932, 0xa2ce862a, 0x22d61c0b, 0xa2b9a97a, 0x22a1335b, +0x2454e71f, 0xa44c7d3e, 0x2423c84f, 0xa43b526e, 0xc41fd308, 0x44074929, 0xc468fc58, 0x44706679, 0x4285b23d, 0xc29d281c, 0x42f29d6d, 0xc2ea074c, 0xb37385f4, 0x336b1fd5, 0xb304aaa4, 0x331c3085, 0x35e9e4c1, 0xb5f17ee0, 0x359ecb91, 0xb58651b0, +0xd5a2d0d6, 0x55ba4af7, 0xd5d5ff86, 0x55cd65a7, 0x5338b1e3, 0xd3202bc2, 0x534f9eb3, 0xd3570492, 0xcd552b8a, 0x4d4db1ab, 0xcd2204da, 0x4d3a9efb, 0x4bcf4abf, 0xcbd7d09e, 0x4bb865ef, 0xcba0ffce, 0xab847ea8, 0x2b9ce489, 0xabf351f8, 0x2bebcbd9, +0x2d1e1f9d, 0xad0685bc, 0x2d6930cd, 0xad71aaec, 0x6f9bada0, 0xef833781, 0x6fec82f0, 0xeff418d1, 0xe901cc95, 0x691956b4, 0xe976e3c5, 0x696e79e4, 0x094af882, 0x895262a3, 0x093dd7d2, 0x89254df3, 0x8fd099b7, 0x0fc80396, 0x8fa7b6e7, 0x0fbf2cc6, +0x11bd03de, 0x91a599ff, 0x11ca2c8e, 0x91d2b6af, 0x972762eb, 0x173ff8ca, 0x97504dbb, 0x1748d79a, 0x776c56fc, 0xf774ccdd, 0x771b79ac, 0xf703e38d, 0xf1f637c9, 0x71eeade8, 0xf1811899, 0x719982b8, 0x72f5a299, 0xf2ed38b8, 0x72828dc9, 0xf29a17e8, +0xf46fc3ac, 0x7477598d, 0xf418ecfc, 0x740076dd, 0x1424f7bb, 0x943c6d9a, 0x1453d8eb, 0x944b42ca, 0x92be968e, 0x12a60caf, 0x92c9b9de, 0x12d123ff, 0x0cd30ce7, 0x8ccb96c6, 0x0ca423b7, 0x8cbcb996, 0x8a496dd2, 0x0a51f7f3, 0x8a3e4282, 0x0a26d8a3, +0x6a0259c5, 0xea1ac3e4, 0x6a757695, 0xea6decb4, 0xec9838f0, 0x6c80a2d1, 0xecef17a0, 0x6cf78d81, 0xae1d8acd, 0x2e0510ec, 0xae6aa59d, 0x2e723fbc, 0x2887ebf8, 0xa89f71d9, 0x28f0c4a8, 0xa8e85e89, 0xc8ccdfef, 0x48d445ce, 0xc8bbf0bf, 0x48a36a9e, +0x4e56beda, 0xce4e24fb, 0x4e21918a, 0xce390bab, 0xd03b24b3, 0x5023be92, 0xd04c0be3, 0x505491c2, 0x56a14586, 0xd6b9dfa7, 0x56d66ad6, 0xd6cef0f7, 0xb6ea7191, 0x36f2ebb0, 0xb69d5ec1, 0x3685c4e0, 0x307010a4, 0xb0688a85, 0x30073ff4, 0xb01fa5d5, +0xc186276d, 0x419ebd4c, 0xc1f1083d, 0x41e9921c, 0x471c4658, 0xc704dc79, 0x476b6908, 0xc773f329, 0xa757724f, 0x274fe86e, 0xa7205d1f, 0x2738c73e, 0x21cd137a, 0xa1d5895b, 0x21ba3c2a, 0xa1a2a60b, 0xbfa08913, 0x3fb81332, 0xbfd7a643, 0x3fcf3c62, +0x393ae826, 0xb9227207, 0x394dc776, 0xb9555d57, 0xd971dc31, 0x59694610, 0xd906f361, 0x591e6940, 0x5febbd04, 0xdff32725, 0x5f9c9254, 0xdf840875, 0x1d6e0f39, 0x9d769518, 0x1d192069, 0x9d01ba48, 0x9bf46e0c, 0x1becf42d, 0x9b83415c, 0x1b9bdb7d, +0x7bbf5a1b, 0xfba7c03a, 0x7bc8754b, 0xfbd0ef6a, 0xfd253b2e, 0x7d3da10f, 0xfd52147e, 0x7d4a8e5f, 0x6348a147, 0xe3503b66, 0x633f8e17, 0xe3271436, 0xe5d2c072, 0x65ca5a53, 0xe5a5ef22, 0x65bd7503, 0x0599f465, 0x85816e44, 0x05eedb35, 0x85f64114, +0x83039550, 0x031b0f71, 0x8374ba00, 0x036c2021, 0x00000000, 0x51d1fa04, 0x321b0a66, 0x63caf062, 0xce43f0df, 0x9f920adb, 0xfc58fab9, 0xad8900bd, 0x451547c7, 0x14c4bdc3, 0x770e4da1, 0x26dfb7a5, 0x8b56b718, 0xda874d1c, 0xb94dbd7e, 0xe89c477a, +0x8f4016bb, 0xde91ecbf, 0xbd5b1cdd, 0xec8ae6d9, 0x4103e664, 0x10d21c60, 0x7318ec02, 0x22c91606, 0xca55517c, 0x9b84ab78, 0xf84e5b1a, 0xa99fa11e, 0x0416a1a3, 0x55c75ba7, 0x360dabc5, 0x67dc51c1, 0xe2aacfa5, 0xb37b35a1, 0xd0b1c5c3, 0x81603fc7, +0x2ce93f7a, 0x7d38c57e, 0x1ef2351c, 0x4f23cf18, 0xa7bf8862, 0xf66e7266, 0x95a48204, 0xc4757800, 0x69fc78bd, 0x382d82b9, 0x5be772db, 0x0a3688df, 0x6dead91e, 0x3c3b231a, 0x5ff1d378, 0x0e20297c, 0xa3a929c1, 0xf278d3c5, 0x91b223a7, 0xc063d9a3, +0x28ff9ed9, 0x792e64dd, 0x1ae494bf, 0x4b356ebb, 0xe6bc6e06, 0xb76d9402, 0xd4a76460, 0x85769e64, 0xd64b7350, 0x879a8954, 0xe4507936, 0xb5818332, 0x1808838f, 0x49d9798b, 0x2a1389e9, 0x7bc273ed, 0x935e3497, 0xc28fce93, 0xa1453ef1, 0xf094c4f5, +0x5d1dc448, 0x0ccc3e4c, 0x6f06ce2e, 0x3ed7342a, 0x590b65eb, 0x08da9fef, 0x6b106f8d, 0x3ac19589, 0x97489534, 0xc6996f30, 0xa5539f52, 0xf4826556, 0x1c1e222c, 0x4dcfd828, 0x2e05284a, 0x7fd4d24e, 0xd25dd2f3, 0x838c28f7, 0xe046d895, 0xb1972291, +0x34e1bcf5, 0x653046f1, 0x06fab693, 0x572b4c97, 0xfaa24c2a, 0xab73b62e, 0xc8b9464c, 0x9968bc48, 0x71f4fb32, 0x20250136, 0x43eff154, 0x123e0b50, 0xbfb70bed, 0xee66f1e9, 0x8dac018b, 0xdc7dfb8f, 0xbba1aa4e, 0xea70504a, 0x89baa028, 0xd86b5a2c, +0x75e25a91, 0x2433a095, 0x47f950f7, 0x1628aaf3, 0xfeb4ed89, 0xaf65178d, 0xccafe7ef, 0x9d7e1deb, 0x30f71d56, 0x6126e752, 0x02ec1730, 0x533ded34, 0xc2b47664, 0x93658c60, 0xf0af7c02, 0xa17e8606, 0x0cf786bb, 0x5d267cbf, 0x3eec8cdd, 0x6f3d76d9, +0x87a131a3, 0xd670cba7, 0xb5ba3bc5, 0xe46bc1c1, 0x49e2c17c, 0x18333b78, 0x7bf9cb1a, 0x2a28311e, 0x4df460df, 0x1c259adb, 0x7fef6ab9, 0x2e3e90bd, 0x83b79000, 0xd2666a04, 0xb1ac9a66, 0xe07d6062, 0x08e12718, 0x5930dd1c, 0x3afa2d7e, 0x6b2bd77a, +0xc6a2d7c7, 0x97732dc3, 0xf4b9dda1, 0xa56827a5, 0x201eb9c1, 0x71cf43c5, 0x1205b3a7, 0x43d449a3, 0xee5d491e, 0xbf8cb31a, 0xdc464378, 0x8d97b97c, 0x650bfe06, 0x34da0402, 0x5710f460, 0x06c10e64, 0xab480ed9, 0xfa99f4dd, 0x995304bf, 0xc882febb, +0xaf5eaf7a, 0xfe8f557e, 0x9d45a51c, 0xcc945f18, 0x611d5fa5, 0x30cca5a1, 0x530655c3, 0x02d7afc7, 0xea4be8bd, 0xbb9a12b9, 0xd850e2db, 0x898118df, 0x24081862, 0x75d9e266, 0x16131204, 0x47c2e800, 0x14ff0534, 0x452eff30, 0x26e40f52, 0x7735f556, +0xdabcf5eb, 0x8b6d0fef, 0xe8a7ff8d, 0xb9760589, 0x51ea42f3, 0x003bb8f7, 0x63f14895, 0x3220b291, 0x9fa9b22c, 0xce784828, 0xadb2b84a, 0xfc63424e, 0x9bbf138f, 0xca6ee98b, 0xa9a419e9, 0xf875e3ed, 0x55fce350, 0x042d1954, 0x67e7e936, 0x36361332, +0xdeaa5448, 0x8f7bae4c, 0xecb15e2e, 0xbd60a42a, 0x10e9a497, 0x41385e93, 0x22f2aef1, 0x732354f5, 0xf655ca91, 0xa7843095, 0xc44ec0f7, 0x959f3af3, 0x38163a4e, 0x69c7c04a, 0x0a0d3028, 0x5bdcca2c, 0xb3408d56, 0xe2917752, 0x815b8730, 0xd08a7d34, +0x7d037d89, 0x2cd2878d, 0x4f1877ef, 0x1ec98deb, 0x7915dc2a, 0x28c4262e, 0x4b0ed64c, 0x1adf2c48, 0xb7562cf5, 0xe687d6f1, 0x854d2693, 0xd49cdc97, 0x3c009bed, 0x6dd161e9, 0x0e1b918b, 0x5fca6b8f, 0xf2436b32, 0xa3929136, 0xc0586154, 0x91899b50, +0x00000000, 0x8b3b5b89, 0xba6323b2, 0x3158783b, 0x0e9d5d07, 0x85a6068e, 0xb4fe7eb5, 0x3fc5253c, 0xc08099e0, 0x4bbbc269, 0x7ae3ba52, 0xf1d8e1db, 0xce1dc4e7, 0x45269f6e, 0x747ee755, 0xff45bcdc, 0xf07a946c, 0x7b41cfe5, 0x4a19b7de, 0xc122ec57, +0xfee7c96b, 0x75dc92e2, 0x4484ead9, 0xcfbfb150, 0x30fa0d8c, 0xbbc15605, 0x8a992e3e, 0x01a275b7, 0x3e67508b, 0xb55c0b02, 0x84047339, 0x0f3f28b0, 0xdc4d2f5c, 0x577674d5, 0x662e0cee, 0xed155767, 0xd2d0725b, 0x59eb29d2, 0x68b351e9, 0xe3880a60, +0x1ccdb6bc, 0x97f6ed35, 0xa6ae950e, 0x2d95ce87, 0x1250ebbb, 0x996bb032, 0xa833c809, 0x23089380, 0x2c37bb30, 0xa70ce0b9, 0x96549882, 0x1d6fc30b, 0x22aae637, 0xa991bdbe, 0x98c9c585, 0x13f29e0c, 0xecb722d0, 0x678c7959, 0x56d40162, 0xddef5aeb, +0xe22a7fd7, 0x6911245e, 0x58495c65, 0xd37207ec, 0x8a1f9c0f, 0x0124c786, 0x307cbfbd, 0xbb47e434, 0x8482c108, 0x0fb99a81, 0x3ee1e2ba, 0xb5dab933, 0x4a9f05ef, 0xc1a45e66, 0xf0fc265d, 0x7bc77dd4, 0x440258e8, 0xcf390361, 0xfe617b5a, 0x755a20d3, +0x7a650863, 0xf15e53ea, 0xc0062bd1, 0x4b3d7058, 0x74f85564, 0xffc30eed, 0xce9b76d6, 0x45a02d5f, 0xbae59183, 0x31deca0a, 0x0086b231, 0x8bbde9b8, 0xb478cc84, 0x3f43970d, 0x0e1bef36, 0x8520b4bf, 0x5652b353, 0xdd69e8da, 0xec3190e1, 0x670acb68, +0x58cfee54, 0xd3f4b5dd, 0xe2accde6, 0x6997966f, 0x96d22ab3, 0x1de9713a, 0x2cb10901, 0xa78a5288, 0x984f77b4, 0x13742c3d, 0x222c5406, 0xa9170f8f, 0xa628273f, 0x2d137cb6, 0x1c4b048d, 0x97705f04, 0xa8b57a38, 0x238e21b1, 0x12d6598a, 0x99ed0203, +0x66a8bedf, 0xed93e556, 0xdccb9d6d, 0x57f0c6e4, 0x6835e3d8, 0xe30eb851, 0xd256c06a, 0x596d9be3, 0x01f60c65, 0x8acd57ec, 0xbb952fd7, 0x30ae745e, 0x0f6b5162, 0x84500aeb, 0xb50872d0, 0x3e332959, 0xc1769585, 0x4a4dce0c, 0x7b15b637, 0xf02eedbe, +0xcfebc882, 0x44d0930b, 0x7588eb30, 0xfeb3b0b9, 0xf18c9809, 0x7ab7c380, 0x4befbbbb, 0xc0d4e032, 0xff11c50e, 0x742a9e87, 0x4572e6bc, 0xce49bd35, 0x310c01e9, 0xba375a60, 0x8b6f225b, 0x005479d2, 0x3f915cee, 0xb4aa0767, 0x85f27f5c, 0x0ec924d5, +0xddbb2339, 0x568078b0, 0x67d8008b, 0xece35b02, 0xd3267e3e, 0x581d25b7, 0x69455d8c, 0xe27e0605, 0x1d3bbad9, 0x9600e150, 0xa758996b, 0x2c63c2e2, 0x13a6e7de, 0x989dbc57, 0xa9c5c46c, 0x22fe9fe5, 0x2dc1b755, 0xa6faecdc, 0x97a294e7, 0x1c99cf6e, +0x235cea52, 0xa867b1db, 0x993fc9e0, 0x12049269, 0xed412eb5, 0x667a753c, 0x57220d07, 0xdc19568e, 0xe3dc73b2, 0x68e7283b, 0x59bf5000, 0xd2840b89, 0x8be9906a, 0x00d2cbe3, 0x318ab3d8, 0xbab1e851, 0x8574cd6d, 0x0e4f96e4, 0x3f17eedf, 0xb42cb556, +0x4b69098a, 0xc0525203, 0xf10a2a38, 0x7a3171b1, 0x45f4548d, 0xcecf0f04, 0xff97773f, 0x74ac2cb6, 0x7b930406, 0xf0a85f8f, 0xc1f027b4, 0x4acb7c3d, 0x750e5901, 0xfe350288, 0xcf6d7ab3, 0x4456213a, 0xbb139de6, 0x3028c66f, 0x0170be54, 0x8a4be5dd, +0xb58ec0e1, 0x3eb59b68, 0x0fede353, 0x84d6b8da, 0x57a4bf36, 0xdc9fe4bf, 0xedc79c84, 0x66fcc70d, 0x5939e231, 0xd202b9b8, 0xe35ac183, 0x68619a0a, 0x972426d6, 0x1c1f7d5f, 0x2d470564, 0xa67c5eed, 0x99b97bd1, 0x12822058, 0x23da5863, 0xa8e103ea, +0xa7de2b5a, 0x2ce570d3, 0x1dbd08e8, 0x96865361, 0xa943765d, 0x22782dd4, 0x132055ef, 0x981b0e66, 0x675eb2ba, 0xec65e933, 0xdd3d9108, 0x5606ca81, 0x69c3efbd, 0xe2f8b434, 0xd3a0cc0f, 0x589b9786 ] + +d0x6a0dab50=[ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, +0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, +0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0d, 0x0c, 0x0f, 0x0e, 0x09, 0x08, 0x0b, 0x0a, 0x05, 0x04, 0x07, 0x06, 0x01, 0x00, 0x03, 0x02, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, +0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 ] + +d0x6a072a70=[ 0xe0, 0xde, 0xcd, 0x7a, 0xe5, 0xa8, 0x9e, 0xa6, 0xc0, 0x57, 0x54, 0x06, 0x35, 0xe9, 0x1f, 0xac, 0x48, 0xe1, 0x2d, 0x11, 0x29, 0x12, 0x86, 0x91, 0x5b, 0xf4, 0xae, 0xa0, 0x5c, 0xc6, 0x96, 0xa1, 0x50, 0x4d, 0x94, 0x85, 0x09, 0x76, 0x41, 0x71, +0x95, 0x8c, 0x22, 0xe4, 0xed, 0x83, 0x9a, 0x7c, 0xd0, 0x43, 0x0b, 0x84, 0x1c, 0xb4, 0xd2, 0x0c, 0x10, 0xc4, 0x14, 0xfa, 0x27, 0xdb, 0x80, 0xce, 0xf7, 0x6e, 0x20, 0x8e, 0x45, 0x98, 0x3d, 0xd5, 0x92, 0xd7, 0x40, 0x8a, 0x58, 0x07, 0x73, 0x89, +0x4b, 0x8f, 0x2b, 0xec, 0xb3, 0x16, 0x8b, 0x05, 0xaa, 0x67, 0xa7, 0x21, 0x62, 0x8d, 0xc7, 0xe7, 0x32, 0x2c, 0xc8, 0xbc, 0xe6, 0xc9, 0xa4, 0x1a, 0xa3, 0xf6, 0x39, 0xbd, 0x74, 0x15, 0xfe, 0x26, 0x5e, 0x24, 0xba, 0x7b, 0xd3, 0x0a, 0xf5, 0xb6, +0xda, 0xef, 0x63, 0xd8, 0x6b, 0x60, 0x49, 0xd1, 0x88, 0x31, 0x36, 0x7d, 0xb8, 0xc3, 0x68, 0xeb, 0xdd, 0x5d, 0x75, 0x23, 0xf0, 0xe8, 0x2a, 0xc1, 0xcf, 0x38, 0xfb, 0x17, 0xb2, 0x02, 0xbb, 0xff, 0xcc, 0xdf, 0x79, 0x01, 0xd9, 0xb1, 0x52, 0x56, +0x6f, 0xf3, 0x4e, 0x33, 0xf1, 0x51, 0x00, 0x3f, 0x9b, 0x2e, 0xcb, 0xb5, 0x3e, 0xaf, 0x34, 0x37, 0x3b, 0xb9, 0x81, 0x70, 0x1e, 0x99, 0xf8, 0x1b, 0x9f, 0xf2, 0x61, 0x18, 0x0f, 0x82, 0x04, 0xb0, 0x7f, 0x0d, 0x4a, 0xdc, 0xa9, 0x5f, 0x28, 0x59, +0xc5, 0xee, 0x03, 0x69, 0xbe, 0x65, 0xbf, 0x77, 0xd6, 0x46, 0x19, 0xfd, 0xca, 0xad, 0x9d, 0xb7, 0x64, 0x3c, 0x87, 0x25, 0x5a, 0xfc, 0x55, 0xea, 0x3a, 0x30, 0x1d, 0x2f, 0x53, 0x9c, 0xc2, 0x13, 0x42, 0x47, 0x66, 0xa5, 0x4f, 0x72, 0x0e, 0x6c, +0xab, 0x7e, 0xe2, 0xd4, 0x6a, 0x93, 0xf9, 0x90, 0x44, 0x08, 0x4c, 0x78, 0x97, 0x6d, 0xe3, 0xa2, 0xd3, 0x90, 0x96, 0x0c, 0x12, 0x1a, 0x80, 0xe4, 0x2c, 0xe5, 0x0e, 0xa2, 0x65, 0xc5, 0x8a, 0x42, 0x83, 0xb2, 0xc8, 0x36, 0x03, 0xb4, 0xee, 0xbb, +0xa7, 0x37, 0x52, 0x2b, 0xe1, 0x97, 0xa5, 0x0f, 0x88, 0xb5, 0xf1, 0x72, 0x6e, 0x46, 0xbe, 0x7c, 0x07, 0x06, 0x22, 0xd1, 0xff, 0xb1, 0xfc, 0x59, 0x0b, 0x64, 0x71, 0x77, 0x6c, 0x7f, 0x4b, 0x7d, 0xcf, 0x05, 0x50, 0x4d, 0xa4, 0x49, 0x8b, 0x51, +0xe7, 0xbf, 0x23, 0xd2, 0xf0, 0x3e, 0x9f, 0xc3, 0x24, 0x95, 0x47, 0x08, 0x29, 0x7b, 0xf4, 0xea, 0x81, 0x1e, 0xf9, 0xdf, 0xbc, 0x2d, 0xf6, 0x87, 0x01, 0x99, 0xb9, 0x82, 0xab, 0xeb, 0x40, 0x55, 0xaa, 0x04, 0xd7, 0xce, 0x60, 0x3d, 0xfb, 0x56, +0xa8, 0x85, 0xe8, 0xb6, 0xcc, 0x3b, 0x2f, 0x1b, 0x45, 0xf8, 0x10, 0x41, 0xc7, 0x19, 0xd5, 0x3a, 0x93, 0x5c, 0xe6, 0x0d, 0x58, 0x34, 0x53, 0x84, 0xd9, 0xc6, 0x3f, 0xb7, 0xad, 0x9d, 0x66, 0x39, 0x6b, 0x92, 0x6d, 0x69, 0x38, 0x68, 0xd6, 0x8c, +0xe9, 0x2e, 0x26, 0xf2, 0xfa, 0xb0, 0xa3, 0x63, 0xb3, 0x21, 0x73, 0x57, 0x1f, 0xa6, 0xca, 0x09, 0xac, 0x27, 0x0a, 0x8f, 0xe2, 0x6f, 0xf7, 0xdd, 0x44, 0x9c, 0xa1, 0xec, 0xba, 0xa0, 0x91, 0xbd, 0x5f, 0x74, 0x48, 0x35, 0xa9, 0x5d, 0xef, 0xe0, +0x20, 0xdb, 0xc1, 0x3c, 0xd0, 0xde, 0x67, 0x1d, 0xcd, 0x32, 0x13, 0x8d, 0xf5, 0x75, 0x30, 0x02, 0xc9, 0x4f, 0xed, 0x7e, 0xcb, 0x89, 0xda, 0xe3, 0x9a, 0x5a, 0x25, 0x61, 0x2a, 0x98, 0x79, 0x4a, 0x4e, 0x28, 0x94, 0xdc, 0x5e, 0xb8, 0x5b, 0x86, +0x78, 0x18, 0x8e, 0x76, 0xfe, 0xc2, 0x9b, 0xae, 0x31, 0x43, 0x6a, 0x14, 0x54, 0x00, 0xc4, 0xd4, 0xaf, 0x11, 0x1c, 0xc0, 0x33, 0x16, 0x15, 0x70, 0x17, 0x62, 0x9e, 0xd8, 0xfd, 0x7a, 0xf3, 0x4c, 0x52, 0xa6, 0xb8, 0xe5, 0x25, 0x6c, 0xea, 0xf1, +0xa3, 0x6d, 0x8e, 0xc4, 0x02, 0x51, 0x49, 0x60, 0x99, 0xcf, 0x0e, 0x30, 0x56, 0xe8, 0xad, 0x90, 0xab, 0xd3, 0x73, 0xda, 0x26, 0x65, 0x61, 0xf0, 0xdb, 0xe3, 0xe4, 0xfc, 0xc2, 0x01, 0xb7, 0xa9, 0xef, 0xf8, 0x9d, 0xf5, 0x95, 0xa1, 0x1c, 0x66, +0x3f, 0x77, 0x83, 0x2f, 0x38, 0xf4, 0xf2, 0x15, 0x41, 0xb2, 0x40, 0x06, 0x2a, 0x0d, 0x44, 0x92, 0x6b, 0x4a, 0x09, 0x50, 0xfd, 0x10, 0x4f, 0x1b, 0x8b, 0x97, 0x0b, 0x1d, 0xf3, 0xb1, 0xc9, 0xbf, 0x48, 0x87, 0xa8, 0x70, 0x71, 0xe6, 0xc6, 0x8d, +0x45, 0xbc, 0x4d, 0xd5, 0xbb, 0x14, 0x94, 0x78, 0x08, 0x5d, 0x21, 0x13, 0xba, 0xc1, 0x2b, 0x98, 0xb4, 0x81, 0x7a, 0x4c, 0x7d, 0xcd, 0x17, 0x20, 0x03, 0xdc, 0x9a, 0x88, 0xb0, 0x96, 0xfa, 0x72, 0x89, 0x33, 0xb9, 0x12, 0x07, 0x82, 0x54, 0x05, +0xd6, 0xc3, 0x3d, 0x67, 0xd8, 0x7b, 0x31, 0xe1, 0xe9, 0xc5, 0xec, 0x3b, 0x47, 0x37, 0x19, 0x8c, 0xd4, 0x5a, 0x29, 0x8f, 0xa4, 0xdd, 0xd0, 0x43, 0xbd, 0x55, 0xca, 0x11, 0x16, 0x68, 0x5b, 0x46, 0x7c, 0xde, 0x3a, 0xfe, 0x35, 0xeb, 0xee, 0x63, +0x1e, 0x74, 0x39, 0xa0, 0x59, 0x69, 0x27, 0xb6, 0x53, 0x3c, 0x4e, 0x2e, 0x79, 0x9b, 0xaf, 0x6a, 0xe7, 0x18, 0x0f, 0x3e, 0x0c, 0x91, 0xff, 0xf6, 0xb3, 0xc0, 0x80, 0xd7, 0x1f, 0x2c, 0x64, 0x00, 0x9f, 0x04, 0xc8, 0x7e, 0xac, 0x6e, 0x9e, 0xfb, +0x76, 0xa2, 0x23, 0xd2, 0x8a, 0xed, 0xf9, 0xd9, 0x85, 0x9c, 0x36, 0x4b, 0xaa, 0x5c, 0xce, 0x34, 0xdf, 0x58, 0xae, 0xe0, 0x0a, 0xc7, 0x86, 0x62, 0x57, 0xf7, 0xcb, 0x2d, 0xe2, 0xa7, 0xbe, 0x28, 0xb5, 0x5f, 0x75, 0x32, 0x84, 0x7f, 0x42, 0x6f, +0xd1, 0x1a, 0x24, 0xa5, 0x93, 0x22, 0xcc, 0x5e, 0x2d, 0x7f, 0xd7, 0x06, 0xc7, 0xe5, 0x6f, 0x97, 0x40, 0x3e, 0x5f, 0xb7, 0xeb, 0xb8, 0xba, 0x74, 0xbf, 0xb6, 0x35, 0x04, 0xb2, 0xc8, 0x62, 0x0a, 0x3a, 0x9b, 0x24, 0x2b, 0x36, 0xa6, 0x38, 0xc4, +0x5b, 0xc2, 0x10, 0x81, 0xe8, 0xae, 0xa4, 0x72, 0xa8, 0xa2, 0x8c, 0x50, 0xed, 0xad, 0xc0, 0x30, 0x16, 0xdf, 0xc5, 0xe6, 0x7b, 0x95, 0x52, 0x78, 0xf8, 0xd4, 0x69, 0x19, 0xb9, 0xc1, 0x93, 0xd0, 0x3f, 0xcd, 0x08, 0x0e, 0x77, 0xce, 0x58, 0x39, +0x98, 0xb1, 0x90, 0xda, 0xa9, 0xb4, 0xcc, 0x17, 0x34, 0x00, 0x88, 0x9f, 0x32, 0xaf, 0xd5, 0x2a, 0xfb, 0x7d, 0x68, 0x8b, 0x8e, 0x5d, 0x44, 0xe9, 0x92, 0x61, 0x76, 0x51, 0x1f, 0x75, 0xaa, 0x9a, 0x2c, 0x7c, 0x86, 0xdd, 0x18, 0x9c, 0x4c, 0xcf, +0x31, 0xb3, 0x13, 0xfc, 0x63, 0x05, 0x6a, 0xfe, 0xbb, 0x12, 0x07, 0x85, 0xe4, 0x33, 0x67, 0xf2, 0x6b, 0xcb, 0x9e, 0xdb, 0x55, 0xef, 0x1c, 0x99, 0xfd, 0xb0, 0x23, 0x26, 0x15, 0x2f, 0x4a, 0x42, 0xde, 0xd3, 0x71, 0xee, 0x3d, 0x82, 0x49, 0xc6, +0x41, 0xf7, 0xbc, 0xd9, 0x94, 0x0c, 0x25, 0xc9, 0xbe, 0xdc, 0x4e, 0xf9, 0x1d, 0xe0, 0x6d, 0x84, 0xd8, 0x22, 0xec, 0x91, 0xf1, 0x87, 0x48, 0x5e, 0xe7, 0x56, 0x80, 0x4b, 0x46, 0xf6, 0x45, 0x70, 0x7e, 0x6e, 0xf5, 0x4d, 0xf4, 0x5c, 0xd2, 0x8a, +0x54, 0xff, 0xf0, 0xa1, 0xa5, 0x43, 0x47, 0xd1, 0x03, 0xe3, 0xbd, 0x0f, 0xfa, 0x11, 0x60, 0x14, 0xa7, 0x02, 0xe2, 0x8f, 0xea, 0x0b, 0x65, 0x7a, 0xa3, 0x5a, 0x79, 0xd6, 0x0d, 0x96, 0x4f, 0x8d, 0xc3, 0x9d, 0x57, 0x20, 0x2e, 0x01, 0x09, 0x89, +0x59, 0x1b, 0x27, 0x3b, 0x3c, 0xca, 0xac, 0xb5, 0x53, 0x64, 0x28, 0x1e, 0xe1, 0x73, 0xa0, 0x21, 0x83, 0x37, 0xab, 0x6c, 0x29, 0xf3, 0x1a, 0x66, 0x08, 0xc6, 0x31, 0x35, 0x97, 0x21, 0x4b, 0x74, 0x7b, 0x8c, 0x3f, 0xba, 0x82, 0x37, 0x92, 0x9b, +0x0e, 0x5f, 0xe9, 0xe7, 0x40, 0xdd, 0x77, 0x66, 0x68, 0x53, 0x13, 0x59, 0x4d, 0x23, 0x6a, 0xf1, 0xd0, 0xbb, 0x19, 0xef, 0xcb, 0x61, 0xd8, 0xc7, 0xd7, 0xbd, 0x60, 0x03, 0xbe, 0x88, 0xbf, 0xca, 0xd3, 0xdf, 0xcf, 0x56, 0x2f, 0x2e, 0x79, 0x4c, +0x04, 0xfe, 0xad, 0x27, 0x99, 0xda, 0xc0, 0xf9, 0x8e, 0x86, 0xeb, 0x78, 0x6f, 0xce, 0xfc, 0x6b, 0xd4, 0x9a, 0xaa, 0x52, 0x38, 0x00, 0x0b, 0x06, 0xe8, 0xee, 0x1a, 0x9d, 0x25, 0xc4, 0x34, 0x2c, 0x09, 0x70, 0x64, 0xd6, 0xec, 0xa7, 0xc2, 0x11, +0x42, 0x1b, 0x2d, 0xa9, 0xb6, 0xa3, 0x16, 0xd1, 0x43, 0x6c, 0x0d, 0xea, 0xb4, 0x5b, 0x85, 0x7e, 0x83, 0x4f, 0x24, 0x46, 0x05, 0x28, 0xe6, 0xcc, 0x18, 0x12, 0x76, 0x57, 0x29, 0x71, 0xc9, 0x93, 0x6d, 0xd9, 0xfd, 0x5e, 0xb9, 0x3a, 0x91, 0xc5, +0xff, 0x15, 0xf7, 0x75, 0xb0, 0x1c, 0x7a, 0xfa, 0xf3, 0x1d, 0x65, 0x22, 0xe3, 0x54, 0x26, 0x6e, 0x7f, 0xaf, 0xe2, 0x4a, 0x49, 0xa4, 0x84, 0x58, 0xe4, 0x2b, 0x39, 0x36, 0x0a, 0xac, 0xf2, 0xc8, 0x3e, 0xa1, 0xa0, 0x63, 0xab, 0x89, 0x14, 0xf0, +0x50, 0x4e, 0xde, 0xc1, 0x9c, 0x51, 0x07, 0xf5, 0xb2, 0x1f, 0xe5, 0x3d, 0x67, 0x87, 0xbc, 0x32, 0x7c, 0xd5, 0x41, 0x55, 0x5c, 0x45, 0x2a, 0x30, 0xe1, 0x5d, 0x0c, 0x3b, 0xed, 0xa2, 0xae, 0x9e, 0x7d, 0xcd, 0x3c, 0xb5, 0x01, 0x90, 0x95, 0xb1, +0x44, 0x96, 0xf8, 0x80, 0xf4, 0x98, 0xdb, 0xa6, 0x47, 0x8d, 0x72, 0x17, 0xa8, 0x69, 0xe0, 0xb3, 0x94, 0xa5, 0xd2, 0x0f, 0xb8, 0x02, 0x8a, 0x81, 0x33, 0xfb, 0xb7, 0x48, 0x9f, 0xf6, 0x8b, 0x20, 0x1e, 0xdc, 0x62, 0x10, 0x5a, 0x73, 0x8f, 0xc3, +0xc6, 0x4a, 0x06, 0xb8, 0x6a, 0x05, 0xb7, 0x71, 0xc1, 0xa7, 0xff, 0x97, 0xf2, 0x67, 0xb5, 0x25, 0xbd, 0xa6, 0x13, 0x89, 0xfc, 0x62, 0xfd, 0x39, 0x9d, 0x6e, 0xee, 0x3f, 0xa2, 0xf9, 0x9a, 0xe4, 0xf6, 0x54, 0xbb, 0x45, 0xe0, 0xa4, 0x18, 0x51, +0x8f, 0x92, 0x99, 0x69, 0x12, 0x73, 0x8b, 0xcd, 0x9e, 0x02, 0xde, 0xbe, 0x42, 0x7f, 0xf5, 0x00, 0x9f, 0x19, 0x77, 0x07, 0x3a, 0x2d, 0x80, 0x49, 0x63, 0x98, 0x14, 0xa1, 0x87, 0x93, 0x03, 0xcc, 0x60, 0xd6, 0x86, 0x41, 0x36, 0xa9, 0x7c, 0x4b, +0x84, 0xcb, 0xe5, 0x01, 0x1a, 0x43, 0xfa, 0xfe, 0x5b, 0x61, 0xa8, 0xb1, 0xf1, 0x74, 0xe8, 0xc7, 0x88, 0xb3, 0x4e, 0x6f, 0x95, 0x58, 0x81, 0xa5, 0x24, 0x46, 0x44, 0x15, 0x11, 0x6c, 0xc9, 0x29, 0x32, 0xea, 0x30, 0xe2, 0xd2, 0xc3, 0xbc, 0x91, +0xf8, 0x48, 0xad, 0xb2, 0xdb, 0x83, 0xce, 0x55, 0x2f, 0x53, 0x34, 0xac, 0x66, 0xf4, 0x82, 0x0d, 0x1e, 0xa3, 0x5a, 0x21, 0x59, 0x2a, 0x7d, 0x56, 0x37, 0x2b, 0x50, 0x1d, 0x0c, 0x52, 0xc0, 0x85, 0xb4, 0x3c, 0x9c, 0xdd, 0xeb, 0x0e, 0x1c, 0xed, +0xab, 0x3d, 0x47, 0xba, 0x2e, 0xc5, 0x27, 0x31, 0xdf, 0x0b, 0xcf, 0x68, 0x08, 0xd1, 0x22, 0x04, 0x1b, 0x76, 0x6b, 0xda, 0xca, 0x33, 0x7a, 0xc2, 0xd0, 0x7e, 0x40, 0x17, 0x64, 0xd7, 0xfb, 0x70, 0x38, 0x09, 0xaa, 0x28, 0xec, 0x4d, 0x0f, 0xef, +0x7b, 0xd8, 0x16, 0xdc, 0x65, 0x10, 0xb6, 0x8e, 0xe7, 0x1f, 0xd3, 0xb9, 0x6d, 0x3e, 0xaf, 0x2c, 0xe1, 0x8a, 0x75, 0xe6, 0xe3, 0x4f, 0x57, 0x5c, 0xae, 0x72, 0x23, 0x0a, 0xc4, 0x5d, 0x90, 0x96, 0xd9, 0xb0, 0xf7, 0xbf, 0x35, 0x4c, 0x79, 0xf3, +0x78, 0x3b, 0x5e, 0x8d, 0x26, 0xc8, 0x5f, 0xa0, 0x94, 0x8c, 0xd5, 0xd4, 0x9b, 0xe9, 0xf0, 0x20, 0x14, 0x17, 0x28, 0x52, 0xe7, 0xf2, 0x16, 0xf7, 0x0c, 0x02, 0x9d, 0x6b, 0x5f, 0x4d, 0x83, 0xc3, 0xd4, 0x3e, 0xc4, 0x69, 0xb5, 0xea, 0x04, 0xe8, +0xb9, 0xe4, 0xac, 0x45, 0x65, 0x29, 0x10, 0x20, 0x9c, 0xe0, 0x2a, 0x4a, 0xe2, 0xa1, 0xef, 0x5a, 0xed, 0x15, 0x18, 0x39, 0x87, 0x11, 0x42, 0xd8, 0x2b, 0x9b, 0xe6, 0x2c, 0xdb, 0xbd, 0x97, 0xc0, 0x1d, 0x00, 0xcc, 0x8d, 0x1b, 0x21, 0xf3, 0xbb, +0x19, 0x49, 0xb2, 0x6d, 0xc7, 0x3d, 0x27, 0xd0, 0xf5, 0xf8, 0x51, 0x0b, 0x7b, 0x4f, 0x60, 0x1f, 0xab, 0x3a, 0x3c, 0xfd, 0x0f, 0x78, 0xba, 0x4e, 0x94, 0x3b, 0x77, 0x06, 0x8e, 0x81, 0x99, 0xde, 0xa7, 0xe3, 0x09, 0x4c, 0x53, 0x0a, 0x61, 0x67, +0xff, 0xee, 0x38, 0xd1, 0x33, 0x5c, 0xdc, 0x64, 0xd6, 0x7a, 0x88, 0x68, 0x03, 0xda, 0x41, 0x3f, 0xeb, 0x98, 0xa3, 0x6a, 0x1c, 0x6e, 0x70, 0x47, 0xfb, 0x9f, 0xe5, 0x71, 0xce, 0xf1, 0xbc, 0x89, 0x2d, 0xe1, 0x92, 0x9a, 0x82, 0xbe, 0x1a, 0xc1, +0x7f, 0xa2, 0xb1, 0xc9, 0x72, 0xb7, 0x8a, 0x50, 0x73, 0xa6, 0x56, 0xb0, 0xa9, 0x44, 0x8f, 0xad, 0x32, 0xaa, 0xc2, 0x5e, 0xf0, 0x23, 0x26, 0xdd, 0xca, 0xa0, 0x93, 0xa8, 0x01, 0xfc, 0x62, 0x79, 0x30, 0x2f, 0xf6, 0x55, 0x84, 0xec, 0xd2, 0x7c, +0xb8, 0x48, 0x08, 0x80, 0x07, 0x1e, 0xaf, 0xc6, 0x7d, 0x95, 0xe9, 0xfa, 0x86, 0x34, 0x13, 0xf4, 0x24, 0x12, 0x63, 0x0d, 0x57, 0x74, 0x85, 0xb6, 0x7e, 0x8c, 0xc5, 0x91, 0x6f, 0xcf, 0xcd, 0x76, 0x25, 0x35, 0xd3, 0x31, 0x8b, 0x22, 0xa4, 0x6c, +0x96, 0xdf, 0x05, 0x5b, 0x59, 0x5d, 0xae, 0x37, 0xb3, 0x9e, 0x58, 0xf9, 0xc8, 0x0e, 0x2e, 0xd7, 0xb4, 0xbf, 0x4b, 0x36, 0x66, 0x40, 0xcb, 0x90, 0xfe, 0xd5, 0x43, 0x54, 0x75, 0xa5, 0x46, 0xd9, 0xe7, 0xf7, 0x40, 0xc7, 0xc4, 0xaf, 0x36, 0x5e, +0x67, 0x8c, 0xb0, 0x9d, 0x3e, 0x01, 0xc5, 0xe2, 0xd5, 0x3b, 0x7b, 0x32, 0x61, 0x5d, 0x4b, 0x2e, 0xa5, 0x57, 0x4d, 0x73, 0x07, 0xba, 0xe3, 0xfa, 0xd2, 0x50, 0xfe, 0xe5, 0xdb, 0xc8, 0xf6, 0x34, 0x39, 0x1b, 0xdc, 0x8a, 0x9e, 0x15, 0xbc, 0xc1, +0x33, 0xe9, 0xe8, 0xa6, 0x9c, 0x16, 0x51, 0x46, 0x3a, 0x77, 0x11, 0xea, 0x31, 0x5f, 0xde, 0x08, 0x4e, 0x0c, 0xb6, 0x6b, 0x64, 0xb4, 0x4c, 0x2d, 0x03, 0x9b, 0x44, 0x0b, 0xf2, 0x7c, 0x82, 0xa1, 0xd7, 0xbd, 0x55, 0xd9, 0x0d, 0x3f, 0x72, 0xc0, +0x4a, 0x43, 0xcd, 0x18, 0x02, 0x24, 0x1f, 0x47, 0x1a, 0x83, 0xf0, 0x05, 0x60, 0x35, 0xf5, 0xfd, 0xad, 0x30, 0xab, 0x10, 0x96, 0x1e, 0xb3, 0x74, 0xe4, 0x92, 0xaa, 0x62, 0x26, 0x85, 0x58, 0x89, 0x71, 0x88, 0x9f, 0xbb, 0xef, 0x49, 0xec, 0x78, +0xdd, 0x3c, 0x0e, 0x69, 0x8d, 0x13, 0x8f, 0x17, 0x84, 0xe6, 0xd0, 0x87, 0xa9, 0xd8, 0x5a, 0x94, 0x37, 0xb1, 0xeb, 0xa3, 0x80, 0x41, 0x93, 0x12, 0x68, 0x28, 0xff, 0xe1, 0xd6, 0xc2, 0xbe, 0xfb, 0x27, 0xb7, 0xca, 0x66, 0x6d, 0x21, 0x2b, 0xe0, +0xf8, 0xa8, 0x59, 0x9a, 0x45, 0x97, 0x42, 0xd4, 0x98, 0x95, 0xd3, 0xf3, 0x38, 0xc6, 0x2f, 0x6c, 0x52, 0x7d, 0xd1, 0xa2, 0x20, 0x7f, 0x1c, 0x56, 0xee, 0x54, 0x53, 0x2c, 0x6a, 0x0a, 0x65, 0xb9, 0xfc, 0xcb, 0x2a, 0xcf, 0x4f, 0x91, 0x6e, 0xc3, +0x1d, 0x63, 0x5c, 0x29, 0xf4, 0xbf, 0x70, 0x99, 0x6f, 0xb8, 0x5b, 0xac, 0xcc, 0xed, 0x14, 0x79, 0x04, 0x19, 0x23, 0x22, 0xdf, 0x48, 0x86, 0xf1, 0x25, 0x09, 0xae, 0xa0, 0x90, 0xc9, 0x3d, 0xb2, 0x0f, 0xa4, 0x75, 0x76, 0xb5, 0xda, 0x7a, 0xf9, +0x7e, 0xce, 0xa7, 0x00, 0x8b, 0x06, 0x81, 0x8e, 0xb4, 0x76, 0xc3, 0x13, 0x03, 0x0b, 0xce, 0xa5, 0x8f, 0xa3, 0x22, 0x75, 0xa8, 0xf8, 0x16, 0xf3, 0xd4, 0x6c, 0x69, 0x35, 0xc9, 0xd5, 0xfc, 0xa1, 0xfd, 0x2e, 0x77, 0x4e, 0xc7, 0x94, 0x2f, 0x7b, +0xcf, 0xcd, 0xd8, 0x11, 0x07, 0x15, 0xbb, 0x48, 0x5b, 0xd2, 0x42, 0x5d, 0xb9, 0x5e, 0x9c, 0x19, 0x78, 0x55, 0xa6, 0x3b, 0x45, 0x0a, 0xbd, 0x9f, 0x2d, 0x4d, 0xba, 0x71, 0x39, 0xa7, 0x81, 0xf6, 0xe3, 0x3d, 0xe2, 0x74, 0x23, 0x52, 0x59, 0xd6, +0x9a, 0x1d, 0x7f, 0xe6, 0xd1, 0x0c, 0x2b, 0xa9, 0xd7, 0xbe, 0x25, 0x92, 0x2c, 0x14, 0xe8, 0xde, 0x37, 0xee, 0xed, 0x54, 0xab, 0xd0, 0x73, 0x09, 0xbf, 0xb5, 0xf1, 0xca, 0xef, 0x46, 0x12, 0xdd, 0x3e, 0x4a, 0x00, 0x44, 0xc4, 0x28, 0x65, 0xdb, +0x9b, 0x86, 0xac, 0xcb, 0x1e, 0x8e, 0x1c, 0x63, 0xea, 0x97, 0xf7, 0x79, 0x8b, 0x4c, 0x91, 0xae, 0x31, 0x93, 0xc0, 0x26, 0xa2, 0x64, 0x10, 0xaf, 0xda, 0x17, 0xc2, 0x53, 0x7d, 0xc8, 0xe9, 0x06, 0xb6, 0xb8, 0x5a, 0x38, 0x8a, 0x49, 0x58, 0x6f, +0xff, 0xec, 0x6e, 0x0f, 0x33, 0x66, 0xad, 0xc5, 0xe0, 0x3c, 0xbc, 0xf0, 0x56, 0xd3, 0x95, 0x02, 0x5c, 0xb7, 0x3f, 0x84, 0xe4, 0x7c, 0x72, 0x24, 0x29, 0xf2, 0xd9, 0x0d, 0x96, 0x6a, 0x30, 0x1b, 0x1f, 0xe5, 0x80, 0xf9, 0x82, 0x36, 0xb0, 0x7a, +0xdc, 0x47, 0xa4, 0xfe, 0x6d, 0x57, 0xe1, 0xfb, 0xc1, 0xb1, 0x61, 0x05, 0x43, 0x18, 0x67, 0x4f, 0x8d, 0x9d, 0xf4, 0x01, 0x20, 0x62, 0x70, 0x6b, 0x2a, 0x87, 0x51, 0x83, 0xc6, 0x08, 0x27, 0x7e, 0xaa, 0x21, 0x90, 0xb3, 0x8c, 0x04, 0xeb, 0xcc, +0x40, 0x41, 0x89, 0x68, 0x4b, 0xe7, 0x88, 0x32, 0xf5, 0xb2, 0x5f, 0xa0, 0x99, 0xfa, 0x60, 0x98, 0x1a, 0xdf, 0x34, 0x85, 0x3a, 0x9e, 0x50, 0x0e, 0x9b, 0xed, 0x48, 0xb2, 0x33, 0x71, 0xa0, 0x56, 0xc6, 0xdf, 0x51, 0x4d, 0x86, 0xfb, 0x34, 0x22, +0xf0, 0xc0, 0x1c, 0x3b, 0xeb, 0x7a, 0xce, 0x18, 0xc4, 0x82, 0x31, 0xa8, 0x0b, 0xf8, 0x75, 0x1f, 0x09, 0x6f, 0xd9, 0x5b, 0x7c, 0xb5, 0xff, 0x11, 0x38, 0x12, 0x8c, 0xaf, 0x79, 0x96, 0x94, 0x00, 0xe0, 0xb8, 0x9f, 0x27, 0x06, 0xc1, 0x70, 0x0c, +0x99, 0x43, 0xe9, 0x5d, 0x04, 0x14, 0x9e, 0x36, 0x90, 0x7b, 0x89, 0x69, 0x97, 0xda, 0x45, 0x7f, 0x20, 0x28, 0x4c, 0x49, 0xd7, 0x65, 0x7e, 0x0a, 0xfd, 0x05, 0xbd, 0x6c, 0x64, 0x62, 0x32, 0x53, 0xa4, 0x1d, 0x55, 0xa7, 0x15, 0x47, 0xad, 0x8f, +0xd8, 0xa2, 0xdc, 0xd5, 0x5e, 0x6a, 0xc5, 0x58, 0xbf, 0x40, 0xf5, 0xe2, 0x5f, 0x6e, 0x60, 0x08, 0xe7, 0x25, 0x13, 0xbc, 0xb3, 0xd6, 0x4f, 0xa3, 0x66, 0xfe, 0x2b, 0x9d, 0x30, 0xc9, 0x67, 0xfc, 0x37, 0xe4, 0x91, 0x17, 0xf1, 0x50, 0x5c, 0xcc, +0xae, 0x52, 0x4e, 0x41, 0xe1, 0x02, 0x2e, 0x83, 0x23, 0xac, 0x84, 0x1b, 0x88, 0xe5, 0x10, 0x0f, 0x80, 0x61, 0x68, 0xcd, 0xb4, 0xb9, 0xe8, 0x57, 0x85, 0x3f, 0x01, 0xa1, 0x95, 0x3e, 0xcf, 0x29, 0xbb, 0x2d, 0x9a, 0xcb, 0xb1, 0xf4, 0x76, 0xf3, +0xa6, 0x7d, 0xb0, 0xfa, 0x35, 0xdd, 0x1e, 0xd0, 0x81, 0xd2, 0x54, 0x2a, 0xf2, 0xdb, 0xde, 0xc3, 0xab, 0xd3, 0x92, 0xbe, 0x78, 0xd1, 0x8e, 0x59, 0x98, 0x0d, 0x6d, 0xef, 0x73, 0x03, 0xf9, 0xba, 0xca, 0x4b, 0x74, 0x42, 0xea, 0x21, 0x1a, 0x2f, +0x2c, 0x9c, 0x3c, 0x8d, 0x39, 0x0e, 0x19, 0x8b, 0x6b, 0x44, 0xa9, 0xf7, 0xb6, 0xd4, 0x77, 0x8a, 0xee, 0x07, 0x24, 0x93, 0x4a, 0x3d, 0x63, 0xe3, 0xaa, 0x5a, 0x3a, 0xe6, 0xec, 0xb7, 0xa5, 0x26, 0x72, 0xf6, 0x16, 0x46, 0xc2, 0xc8, 0xc7, 0x87, +0xd1, 0xb6, 0x02, 0xd8, 0xe4, 0x30, 0x34, 0x48, 0x6f, 0x94, 0x75, 0x17, 0x3e, 0xd4, 0xf0, 0x47, 0xa0, 0x27, 0xc8, 0xc5, 0x86, 0x4b, 0x40, 0xdf, 0x4f, 0x3c, 0x91, 0x7a, 0x7d, 0x4e, 0xc4, 0xb0, 0xee, 0xb9, 0x2c, 0x61, 0xc2, 0xa6, 0xfb, 0xfe, +0x32, 0x7c, 0x6b, 0x8a, 0x2f, 0xcb, 0x15, 0x0a, 0x2d, 0x00, 0x92, 0xbd, 0x54, 0x13, 0x01, 0x81, 0xf3, 0xd3, 0x2a, 0x3a, 0xa9, 0x58, 0x3f, 0x87, 0x66, 0xc6, 0x10, 0x12, 0xb8, 0xfd, 0x9d, 0x16, 0x07, 0x9c, 0x74, 0x70, 0x67, 0xa5, 0x1b, 0xda, +0x4d, 0xbb, 0xcd, 0xf4, 0xb2, 0xab, 0xfc, 0x2e, 0xc3, 0x72, 0xd2, 0x93, 0x52, 0x99, 0xe2, 0xde, 0xdb, 0x49, 0x2b, 0xf2, 0x36, 0xb7, 0x7f, 0x6c, 0xe3, 0x19, 0x23, 0x89, 0x3b, 0x46, 0xec, 0xf8, 0x14, 0xa2, 0x7e, 0x45, 0xed, 0x88, 0xe6, 0xaa, +0xe8, 0x0e, 0xf6, 0xf1, 0x9e, 0x08, 0xb4, 0x09, 0xbf, 0x21, 0x0d, 0x1a, 0x63, 0xc7, 0x8e, 0xba, 0x84, 0xea, 0x90, 0x5e, 0x29, 0x5b, 0x9f, 0xcc, 0xbc, 0xd7, 0x1c, 0x5f, 0xe0, 0xfa, 0xdc, 0xa4, 0x5a, 0x05, 0xe9, 0xce, 0x1e, 0x82, 0x73, 0x80, +0xbe, 0xcf, 0x97, 0x41, 0x43, 0x85, 0xc9, 0x8f, 0x26, 0xac, 0x33, 0xe5, 0x83, 0xef, 0x8c, 0x25, 0xf5, 0xca, 0x24, 0x6e, 0x3d, 0xf7, 0xf9, 0xd0, 0x28, 0xd6, 0x77, 0x1f, 0x0c, 0x22, 0x38, 0x42, 0x7b, 0x8b, 0x0b, 0xb5, 0xd5, 0x95, 0x20, 0x76, +0x4c, 0xa3, 0x11, 0xdd, 0x69, 0xeb, 0x39, 0x71, 0xe7, 0xe1, 0x65, 0x5d, 0x55, 0xa7, 0x6d, 0xae, 0x98, 0x64, 0x96, 0x62, 0xc0, 0x50, 0x51, 0x18, 0x78, 0x9b, 0x68, 0x35, 0x79, 0xff, 0x1d, 0x06, 0xa1, 0x59, 0x44, 0x5c, 0xaf, 0x8d, 0xb3, 0xad, +0x60, 0x4a, 0x56, 0xb1, 0xd9, 0x37, 0x04, 0xa8, 0x9a, 0xc1, 0x57, 0x6a, 0x53, 0x03, 0x31, 0x0f, 0x26, 0x14, 0x30, 0x46, 0xba, 0xbe, 0x6c, 0xf3, 0x34, 0x6a, 0x08, 0x23, 0xb3, 0x71, 0x29, 0xae, 0xdb, 0xf6, 0x2b, 0x56, 0x43, 0x6b, 0xaa, 0x15, +0x9f, 0x1f, 0x12, 0xb8, 0x1b, 0xe2, 0xea, 0xcc, 0xdd, 0x72, 0x79, 0xa6, 0xfb, 0xd4, 0x1e, 0x0a, 0x91, 0x74, 0x8c, 0x03, 0x18, 0x5f, 0xfe, 0x04, 0x88, 0x13, 0x9a, 0x57, 0xd3, 0xa4, 0xc8, 0xb7, 0x24, 0xe5, 0xcf, 0xc2, 0x41, 0xf2, 0xf8, 0xee, +0x8e, 0x52, 0xd8, 0xd9, 0x9b, 0xe1, 0xe0, 0xbd, 0x7c, 0x69, 0xb5, 0x85, 0x99, 0x67, 0x89, 0x0f, 0xed, 0xad, 0x92, 0xcd, 0x0c, 0x3d, 0xca, 0x59, 0xf4, 0x4a, 0x45, 0xb6, 0xb2, 0xbc, 0x9e, 0x33, 0xc6, 0xaf, 0xab, 0x78, 0x07, 0x51, 0xe4, 0xc3, +0x2e, 0x27, 0x1d, 0xbb, 0x90, 0x60, 0xff, 0x63, 0x76, 0x58, 0x61, 0x82, 0xe7, 0x44, 0x48, 0x22, 0x8b, 0xe3, 0x4b, 0x50, 0xe6, 0xec, 0x5b, 0xd2, 0xf9, 0xf1, 0x7d, 0xa0, 0xa8, 0x19, 0x87, 0x53, 0x25, 0xfd, 0x6d, 0x3c, 0x06, 0x3a, 0xeb, 0x31, +0xb1, 0xfc, 0x47, 0xfa, 0xda, 0xef, 0xb0, 0x5d, 0x0b, 0x6f, 0x2f, 0xc9, 0x38, 0x77, 0x54, 0x93, 0x6e, 0x0d, 0xa3, 0x17, 0x80, 0xd7, 0x0e, 0x98, 0x9d, 0x2d, 0x95, 0xb4, 0x7b, 0x7e, 0x83, 0x84, 0x81, 0xc0, 0xe8, 0x94, 0x4e, 0x05, 0x02, 0xa9, +0xf5, 0x3e, 0x3b, 0x5c, 0x20, 0x1a, 0xa5, 0x10, 0xce, 0xa1, 0x1c, 0x62, 0xcb, 0xa7, 0x42, 0x68, 0x3f, 0x86, 0x09, 0x55, 0x8f, 0x4d, 0x00, 0xac, 0xe9, 0x2a, 0x39, 0xf7, 0x37, 0x73, 0x70, 0xb9, 0xc7, 0xc1, 0x28, 0x5a, 0xd6, 0x01, 0x11, 0x9c, +0x40, 0xd5, 0x49, 0x8d, 0x97, 0x65, 0x21, 0x4f, 0x64, 0xdf, 0x16, 0x35, 0x5e, 0x66, 0x96, 0xc5, 0xdc, 0x75, 0xd1, 0x36, 0xde, 0xbf, 0x7f, 0x8a, 0x7a, 0xf0, 0xa2, 0x4c, 0x32, 0xd0, 0x2c, 0xc4, 0xeb, 0xd4, 0xfd, 0x94, 0xb5, 0xd6, 0x17, 0xc5, +0xb2, 0x1d, 0xd8, 0x9d, 0x28, 0xfe, 0x71, 0xe4, 0x6a, 0xc2, 0x0b, 0x24, 0xf3, 0x01, 0x54, 0xf5, 0x07, 0x51, 0x3d, 0x9f, 0x26, 0x34, 0x2d, 0x7a, 0x6f, 0x76, 0xe7, 0xd2, 0x5f, 0x6e, 0x21, 0x6b, 0xa2, 0xe6, 0xdb, 0xaa, 0xf6, 0x7d, 0xa7, 0x8f, +0xd1, 0xa8, 0x4b, 0x88, 0x38, 0x15, 0x66, 0x32, 0xad, 0xe0, 0x89, 0x2c, 0x16, 0x70, 0xca, 0x8a, 0x65, 0xe9, 0xc3, 0xed, 0x09, 0x48, 0xb3, 0xb0, 0x35, 0xae, 0xea, 0x50, 0x82, 0x1b, 0x59, 0xf0, 0x00, 0xb8, 0x63, 0x14, 0x20, 0x41, 0xa4, 0x58, +0x1e, 0xbd, 0xa5, 0x69, 0x39, 0xdd, 0xd0, 0x9b, 0xa1, 0xe3, 0x30, 0x81, 0x75, 0x0f, 0x98, 0x85, 0x18, 0x74, 0x5a, 0x2f, 0x5e, 0x96, 0xd3, 0xd7, 0x99, 0x6d, 0x2b, 0x44, 0xf2, 0xc0, 0xfc, 0x0d, 0x8c, 0x84, 0xde, 0xc1, 0xa3, 0x4c, 0x8b, 0x57, +0x03, 0x0a, 0x7b, 0x52, 0x64, 0x92, 0x23, 0x93, 0xf8, 0xfa, 0x79, 0x9c, 0x2e, 0x95, 0x78, 0xbe, 0x5d, 0x1a, 0xbc, 0xe5, 0x47, 0xc9, 0x29, 0x11, 0xb6, 0x22, 0x4a, 0xba, 0x36, 0x33, 0x31, 0x5c, 0xb4, 0xfb, 0x77, 0x4e, 0x3e, 0xf4, 0x5b, 0x55, +0x6c, 0x2a, 0x08, 0xdf, 0x0e, 0xf7, 0x3a, 0x9a, 0x61, 0x67, 0xcb, 0xc4, 0x90, 0xc8, 0x7f, 0xff, 0x3f, 0xb7, 0x60, 0x04, 0xcc, 0x72, 0xdc, 0x02, 0x25, 0x4d, 0x56, 0x8d, 0x4f, 0x53, 0x27, 0xec, 0xb1, 0xa0, 0xa9, 0x68, 0xe8, 0x62, 0x73, 0xcf, +0x1f, 0xac, 0xd9, 0xf9, 0xe2, 0xab, 0x9e, 0x7c, 0x91, 0x13, 0x43, 0x49, 0xd5, 0xef, 0x3b, 0xda, 0xf1, 0xcd, 0x40, 0xee, 0x86, 0x46, 0xbb, 0x45, 0x12, 0x83, 0xce, 0x37, 0xc7, 0x05, 0x3c, 0xb9, 0x06, 0xbf, 0x80, 0x10, 0x97, 0x87, 0x1c, 0x42, +0xe1, 0xaf, 0x7e, 0xa6, 0x0c, 0x19, 0xc6, 0x8e, 0xed, 0xff, 0xf5, 0x61, 0x77, 0x93, 0xe4, 0x66, 0x69, 0xdf, 0x63, 0x08, 0xab, 0x47, 0x44, 0x91, 0x0b, 0x50, 0x73, 0x00, 0x19, 0x9d, 0x29, 0xbe, 0x7e, 0xc2, 0x17, 0xad, 0x90, 0x56, 0x5a, 0x1f, +0xcc, 0x53, 0xa2, 0x0e, 0x70, 0xcf, 0x87, 0x0a, 0x43, 0x6b, 0xda, 0x0d, 0xd5, 0xd1, 0xc0, 0x21, 0x3d, 0x28, 0xd3, 0xdb, 0xf2, 0x4c, 0x71, 0x3c, 0x15, 0xe6, 0x9b, 0x26, 0x55, 0x65, 0x96, 0x4b, 0xde, 0xd4, 0x3f, 0x74, 0xc6, 0x36, 0xce, 0x99, +0x76, 0xea, 0x57, 0xc1, 0x01, 0x88, 0xfa, 0x51, 0xd7, 0x1a, 0x05, 0xeb, 0xee, 0x31, 0xa1, 0x82, 0xf3, 0x5c, 0x58, 0xe3, 0x8d, 0x16, 0xe8, 0x62, 0xa9, 0x94, 0x32, 0xd9, 0x5d, 0x07, 0xd8, 0x6a, 0xc8, 0x59, 0xc4, 0x0c, 0x0f, 0x49, 0xa5, 0x2e, +0x79, 0xdc, 0x3e, 0xe0, 0xa0, 0xbf, 0xf4, 0xbc, 0x25, 0x1e, 0xc5, 0x86, 0x2c, 0x09, 0xb3, 0x9f, 0x2a, 0xb2, 0xf7, 0x6d, 0xef, 0x8a, 0xa3, 0xb9, 0x83, 0xcd, 0x9a, 0x75, 0xac, 0x24, 0x1c, 0x7a, 0x52, 0x23, 0x95, 0x35, 0xfc, 0x89, 0x9e, 0x1b, +0xfe, 0x7d, 0xb0, 0x7f, 0x30, 0x60, 0x7b, 0x48, 0x8f, 0x4e, 0x40, 0xe9, 0xf6, 0x13, 0x3b, 0xae, 0xca, 0x45, 0x4a, 0x8e, 0x10, 0x1d, 0xb8, 0x5f, 0xb7, 0xdd, 0x81, 0x34, 0xbb, 0x9c, 0x41, 0x46, 0x84, 0xd2, 0x80, 0x85, 0xec, 0x4f, 0xfd, 0xc7, +0xf8, 0xf9, 0xc9, 0x98, 0xe2, 0xbd, 0xcb, 0x2d, 0x02, 0x42, 0x18, 0x7c, 0xfb, 0x27, 0x72, 0xaa, 0xba, 0x78, 0xaf, 0xc3, 0x5e, 0xa7, 0x92, 0xd6, 0x97, 0xb1, 0x6f, 0xa6, 0xb4, 0x33, 0x67, 0x4d, 0x37, 0xe1, 0x38, 0x3a, 0xf1, 0x68, 0x03, 0x12, +0x20, 0xf0, 0x8c, 0x6c, 0x8b, 0xb5, 0x5b, 0x2f, 0x11, 0xb6, 0x64, 0x14, 0x22, 0x6e, 0xa8, 0xd0, 0xe5, 0x04, 0x2b, 0xe7, 0x39, 0x54, 0xa4, 0x06, 0xfc, 0xf8, 0xdd, 0xdf, 0x26, 0x93, 0x35, 0x10, 0xc7, 0x8c, 0x9b, 0x13, 0xae, 0x29, 0xb6, 0xc5, +0xe4, 0x5e, 0xa9, 0x50, 0xe7, 0x82, 0x5d, 0xcb, 0x2c, 0x33, 0x85, 0x80, 0xd4, 0x34, 0xb2, 0x0d, 0x3f, 0x1d, 0x2a, 0xac, 0xbe, 0xb1, 0x78, 0x19, 0x16, 0xe9, 0xf3, 0x1b, 0x6f, 0x46, 0x21, 0x5b, 0x5c, 0xcf, 0xbf, 0x7a, 0x6e, 0x56, 0x91, 0x65, +0xc1, 0xaf, 0xbc, 0x22, 0x92, 0x9c, 0x7b, 0xf7, 0xcc, 0x27, 0x7c, 0x71, 0x0f, 0x62, 0x1f, 0x17, 0x3d, 0xd1, 0x84, 0xd5, 0x2b, 0x8b, 0x02, 0x99, 0x9d, 0x42, 0x20, 0xef, 0x00, 0x64, 0x97, 0x73, 0xc8, 0x75, 0x2f, 0x63, 0x39, 0xdc, 0xa3, 0x6b, +0x3c, 0x12, 0x0c, 0xc6, 0x03, 0x5f, 0x58, 0x53, 0x67, 0x08, 0xe8, 0x66, 0x9a, 0x81, 0xff, 0xe1, 0xd3, 0xce, 0xfd, 0xf4, 0x7e, 0x69, 0x07, 0xc9, 0x47, 0xbb, 0x6a, 0x6c, 0x06, 0x54, 0x05, 0xd6, 0x98, 0xfe, 0xf1, 0xfb, 0xfa, 0xa1, 0x0e, 0x24, +0x95, 0x43, 0xa7, 0x77, 0x55, 0x79, 0x87, 0xed, 0x01, 0x57, 0xf2, 0xba, 0x4e, 0xc3, 0xca, 0x1a, 0x3b, 0x7f, 0x36, 0x8a, 0xd8, 0x44, 0x40, 0x5a, 0xd7, 0xa8, 0x0a, 0x2e, 0xaa, 0x96, 0xd9, 0x0b, 0x14, 0xc0, 0xd0, 0x3a, 0xf6, 0x45, 0xec, 0xb8, +0xda, 0x48, 0x11, 0xeb, 0x83, 0x9f, 0xdb, 0xee, 0x49, 0xa0, 0x4f, 0x88, 0x7d, 0x6d, 0xa6, 0x89, 0x4d, 0x4c, 0x9e, 0x4b, 0x04, 0x8e, 0x30, 0x41, 0x86, 0x61, 0xf0, 0xcd, 0xb0, 0xa5, 0xd2, 0x70, 0x60, 0x18, 0xde, 0x2d, 0x1e, 0x8f, 0xa2, 0x37, +0x76, 0xf5, 0xb7, 0x94, 0x31, 0xb3, 0xb9, 0xf9, 0xe2, 0x4a, 0xea, 0xb4, 0x1c, 0xab, 0x59, 0x25, 0xbd, 0xa4, 0x28, 0xe3, 0x09, 0x3e, 0xe6, 0x90, 0x15, 0x38, 0x72, 0x52, 0xc4, 0xe5, 0xe0, 0xb5, 0x51, 0x32, 0x23, 0x8d, 0x68, 0xc2, 0xad, 0x74, +0x0e, 0xec, 0xf4, 0x1c, 0x3f, 0x5f, 0xd0, 0xcd, 0x01, 0xb5, 0x53, 0x30, 0xfa, 0xa2, 0x55, 0x71, 0x75, 0xe3, 0x37, 0x60, 0xca, 0x6a, 0xe9, 0xda, 0xe1, 0x6b, 0x13, 0xfd, 0x90, 0x8a, 0xf5, 0x1a, 0xb8, 0x07, 0x20, 0x08, 0x15, 0x78, 0x74, 0xd3, +0xb9, 0xac, 0x57, 0x67, 0x80, 0x50, 0x99, 0x00, 0xba, 0x44, 0x21, 0xa7, 0x43, 0xe7, 0xbb, 0x47, 0x4f, 0x32, 0x29, 0x04, 0x72, 0x84, 0x64, 0x8e, 0x6c, 0x6e, 0x12, 0x66, 0xa3, 0x1e, 0xce, 0x83, 0xf0, 0x88, 0x92, 0x5e, 0x2b, 0xdf, 0xa9, 0x05, +0x9d, 0x4c, 0xb4, 0x38, 0x5d, 0xe4, 0xc2, 0x9e, 0xef, 0xb6, 0xb1, 0x86, 0x35, 0xd8, 0x45, 0x70, 0xed, 0xd9, 0x95, 0x61, 0x25, 0x4d, 0xa5, 0xbe, 0x11, 0x28, 0xae, 0x19, 0x3b, 0x2f, 0xe0, 0xcf, 0xc8, 0x40, 0x1f, 0x87, 0xa8, 0x77, 0x41, 0xee, +0x27, 0xa4, 0xc6, 0xb3, 0x96, 0x9c, 0x58, 0xd1, 0xd4, 0xa6, 0xf8, 0xfe, 0x0c, 0x33, 0x7b, 0x59, 0xff, 0x4e, 0xf2, 0x26, 0xbc, 0x3d, 0xf6, 0xd6, 0x3e, 0x36, 0x97, 0x4a, 0x62, 0x82, 0xd5, 0xc4, 0x8b, 0x06, 0x2e, 0xf9, 0x9b, 0x39, 0x73, 0x03, +0x94, 0x0f, 0xc7, 0x0a, 0x49, 0x2c, 0x56, 0x18, 0x31, 0xad, 0xcc, 0x3c, 0xde, 0xaf, 0x4b, 0x1b, 0x85, 0x23, 0x98, 0x91, 0xea, 0x93, 0x65, 0x9a, 0x2d, 0x5a, 0x02, 0x7d, 0xbf, 0x42, 0xfc, 0x52, 0xdb, 0x14, 0x6d, 0xe8, 0x24, 0x6f, 0x22, 0x89, +0x3a, 0x5c, 0xf3, 0x69, 0x17, 0x34, 0x0b, 0xb0, 0x8f, 0xc5, 0x76, 0x68, 0x2a, 0x79, 0xfb, 0xc3, 0x9f, 0x8c, 0x1d, 0x0d, 0xc0, 0x81, 0xbd, 0xc1, 0xdd, 0x7c, 0xab, 0xa0, 0xd2, 0x7f, 0x46, 0x48, 0xc9, 0xb2, 0xeb, 0xf7, 0x63, 0x51, 0xa1, 0xd7, +0xe6, 0xaa, 0x10, 0xf1, 0x7e, 0x7a, 0x54, 0xcb, 0x5b, 0x8d, 0xe2, 0xdc, 0xe5, 0x16, 0x09, 0xb7] + +d0x6a0797c0=[ 0x31948baa, 0x8c4a216c, 0xf1f142aa, 0x6665e250, 0x9b6fb579, 0x173f7b3f, 0x44bb12ae, 0xa2752b3b, 0x93e1a091, 0x21b05b41, 0xea2fc33c, 0xbdc445ec, 0x001aef2a, 0x44a1fd84, 0x8f248ad3, 0x3e1bdabc, 0xea352c16, 0x6164a6ae, 0xcb857757, 0x9f005a38, +0x8b518ab8, 0xd7405d15, 0xc07f262a, 0x83c5707a, 0x50eac22e, 0x617e4984, 0x9c741ead, 0x2924a183, 0x32e0cf3f, 0xf6f00654, 0xfa11fcfd, 0x7535762e, 0x2d51a1e8, 0x4840072d, 0xa6002b50, 0x046fef41, 0xe1cf7d6b, 0x6d855c07, 0xfd0a5729, 0x6d9fb32d, +0xc7648dfe, 0x71407645, 0xb9abaaad, 0x4f5bacf9, 0x94fa0b45, 0xade09507, 0xbeaaee53, 0xf29fe915, 0xb624fbbb, 0x0f8f5116, 0x134a7b54, 0xfe64fc96, 0x6eebf7b8, 0x036eabbf, 0xf6eae97e, 0x3a6edad7, 0x4b2eac92, 0x57f169fa, 0x53846991, 0x5b109353, +0x1cdfc568, 0x25dfb400, 0xf59eadeb, 0x35fb64eb, 0x83df9f50, 0xb9b14587, 0xe6d4d6bf, 0xb125bf45, 0xdfd4a7d7, 0x1024d0eb, 0x25c55b2a, 0xf285063f, 0xed3468e8, 0xb24b14fa, 0x391a9e42, 0xf58442c1, 0xcc9edc83, 0x144b3faa, 0xf1ebad80, 0x32fa2015, +0xa61ac47a, 0xc40a2641, 0xbddeaac6, 0xc8f133c2, 0x39007168, 0x4c350746, 0x7aba2738, 0x908f0b2e, 0x2a4a0a3c, 0xfe7e13bc, 0x18b02a29, 0x3d6f9e29, 0xdfce48fd, 0x7ed5c879, 0xcff0773c, 0x2d4b4ec2, 0x722eddfa, 0xa1016fae, 0xc065c900, 0xfd10b803, +0x883f2107, 0x9095e404, 0x80b134ef, 0xfa0b13d7, 0xe6ce3995, 0x57eb86d0, 0x4b3443b8, 0x620a0d11, 0x0ce1faa9, 0x3e013596, 0xd4341980, 0xee402c7d, 0x6ef11892, 0xd04119eb, 0xc410c96b, 0xe5ba7d00, 0xc77e62d4, 0xbadfee38, 0xdba1a7bc, 0xdca0e342, +0x4c2fe86c, 0x5864d7c6, 0x1451d080, 0x8b4b6592, 0x9b755a53, 0xd3355d7e, 0xe95b87a9, 0x0cfb1583, 0x981bf1ec, 0xe5a0922a, 0x3695cf54, 0xa11b8084, 0xe2a1d6d4, 0xcfea9816, 0x103e3fc1, 0x978e4fd0, 0xd75ab23f, 0x752f9904, 0x539e86bb, 0xc8ebdce8, +0x03744495, 0xd8cf0c03, 0x764132bb, 0x715a996f, 0xee5ac357, 0x318e6480, 0xe9416883, 0x18aac503, 0xf97f5742, 0x1bde8196, 0x9c6ef187, 0x368f207e, 0x070144fe, 0x485ae807, 0x93fb4fbb, 0x5c11d7ad, 0x3d757103, 0x7dbb63c6, 0x84c43484, 0x87b07011, +0x5b0a7c79, 0xa5746fc5, 0x5f7f7c12, 0x071babd4, 0x21aab46b, 0x650b49ef, 0x7ecf2753, 0xbeb00179, 0x7aa0c812, 0x94e0e46f, 0xdcba0c68, 0x2e3f0a57, 0x9f1ab512, 0xd05bf6c1, 0x00000000, 0xe1d59241, 0x26abf095, 0xae8e3eb8, 0xd8d5e329, 0xb13f506f, +0x723432d0, 0x22def0fe, 0xc30b62bf, 0x40d4fdef, 0x587e38ec, 0x43ba5650, 0xc3118d95, 0xa98f7a46, 0x5c0b3887, 0xa26fc411, 0xa995956c, 0xb550bf2e, 0x1fab81fd, 0x69f05c6c, 0xadfa7a2d, 0x1bc46ebc, 0x1350947e, 0x0475006b, 0xd32fb254, 0x43a0b97a, +0x293e4ea9, 0xb54a5004, 0x8f3e65f9, 0x667f0d7a, 0x6210e23b, 0xb63e1491, 0x0be0be57, 0xd42ef6aa, 0x79d48c87, 0x8c50ce46, 0x0f95be3c, 0x17259415, 0x80abdbc5, 0x26b11fbf, 0x50f02d04, 0xaafb3ed3, 0x1cc52a42, 0x40ce12c5, 0x54852d6f, 0x765bdd91, +0x22c41fd4, 0x79ce63ad, 0x3a7435fd, 0x84dedbae, 0x98011ec6, 0xcb9f987d, 0x0894fac2, 0xa56e80ef, 0x9794a0fa, 0x5f659338, 0x35e18bc1, 0x0bfa517d, 0x6a9ef7d3, 0xb251fbd0, 0x6511a6c5, 0x47d5b911, 0x8825ce2d, 0x4f4143d3, 0xf965b868, 0xaae1d1f9, +0x088e15e8, 0x2e25e57d, 0x69eab346, 0x6a8418f9, 0xe2bb39fe, 0xed2e87c2, 0x1fb16ed7, 0xbac50112, 0xdbbb4896, 0xcc8433a9, 0xae94d192, 0x2a50e516, 0x7da18cec, 0x47cf563b, 0x87aa9f3b, 0x549fc245, 0xcd359556, 0xde81103a, 0xaa5db487, 0x753bf808, +0x62dfdd3e, 0x62e4ac81, 0x046bd1e5, 0x493b51f2, 0xa9cf8464, 0x15914960, 0xe6ea6825, 0x6303f034, 0xf10e4d13, 0xac78788b, 0xdb36ecd5, 0x11fa9885, 0x58c1c977, 0xf72b811f, 0x64fa1132, 0xa813a96e, 0x81b9384b, 0x91a4fc7b, 0x058c8d50, 0x74dca4bd, +0x144d646a, 0x9428712b, 0x83f725a2, 0xabbae832, 0xa9f4f5db, 0x4cb7dca2, 0x3c00a9fa, 0xcea7a5b5, 0x3f929919, 0x5f0359ce, 0xad9f243e, 0x4ef9c14b, 0xe128f89c, 0x805e64fe, 0x4d508017, 0x3bf948fc, 0x70b77558, 0x76a9c8eb, 0xf0e911a6, 0x061ebdb3, +0xbff78c58, 0x822b08a8, 0x879cf447, 0xaa66c538, 0x2876bc2f, 0x95cf2d9e, 0x716b5852, 0xe6d1199a, 0x4b4e3da4, 0xf6ccddaa, 0xafea4868, 0x6091c0d7, 0xcacc7450, 0xce9cd40a, 0x05b7fcef, 0x7775e5e1, 0x9078d171, 0x3fa9e8a6, 0x2e68019c, 0x61769c62, +0xbb9c5dbd, 0x5ee4057b, 0x651d4d87, 0xf710f0a0, 0x0450a05a, 0xcce9b85c, 0x5b53f994, 0x2e537023, 0x4c8cad1d, 0x591de47d, 0x00000000, 0x2991e09a, 0xbfccfde7, 0x39b75515, 0x02756c56, 0x147615d5, 0xbba72c02, 0x4f1e9dfe, 0x668f7d64, 0xba7b0108, +0x101dc430, 0xb9d24054, 0xd8a4dc36, 0xdd285166, 0xafd139d7, 0xe2bac87f, 0x97813077, 0x07f9e106, 0xf0d26019, 0xcb2b28e5, 0xe35d94ca, 0x1253d9d9, 0xdd1320d9, 0x3de7f54f, 0x4ec2b0f4, 0x48e77cf8, 0xe70d3490, 0x7692b954, 0x5edf74c4, 0x1638083c, +0xf482c043, 0x5d763598, 0xe4a475cc, 0xcaf705ef, 0xf29c7df0, 0x95f45c21, 0x003b71bf, 0x96666cc2, 0x6338818b, 0xbe2ba152, 0xb80e6d5e, 0xdb0d9d6a, 0x03a9415c, 0x708c04e7, 0x2dfa317f, 0x4aa96111, 0xae366562, 0x919f8dc4, 0xf2a70c4f, 0x0625cc0c, +0xab81998d, 0x3bc23943, 0x17e42536, 0x2a03d079, 0x2c1d6dca, 0x66b40cdb, 0xada45581, 0x97ba41c8, 0x3e75c5ac, 0x93eae192, 0x17df5489, 0xb9e931eb, 0x5b68882b, 0x5ab4a521, 0x83cc541d, 0x867ba8f2, 0x07c290b9, 0x5f382871, 0x4a9210ae, 0xf5659cf6, +0x398c24aa, 0x2dc140c0, 0x2c261c75, 0x87a785f8, 0x2bdffd73, 0xdccf0dd3, 0x48dc0d47, 0xf34050fa, 0x965d1d7d, 0x284dcd90, 0xa828d8d1, 0xdeba6185, 0x64c1608d, 0x750089b7, 0x94130094, 0xd89fad89, 0x732545bb, 0xcb10595a, 0x614deddd, 0x16037983, +0xdcf47c6c, 0x5c91692d, 0x82107917, 0x58fab8c8, 0xc965350c, 0x11c1e93a, 0x6753506e, 0x840ec4a4, 0x72f968b1, 0x29aa9125, 0x74e7d502, 0xbd82e00e, 0xf1353cac, 0xe1138923, 0x3a1e1449, 0xe366e575, 0xbdb991b1, 0xcd0ee4e9, 0x8640d94d, 0x13b4856c, +0xf6f7ac15, 0xe0cfa429, 0xb8351ce1, 0xe0f4d596, 0x4b754c1b, 0xc8b91806, 0xcf7b88bf, 0x2be48ccc, 0xac430934, 0xdf5d3d30, 0x3c3bd845, 0x5a8fd49e, 0x65263c38, 0xbe10d0ed, 0x386b781f, 0xdad1b060, 0xbc65bcbb, 0xc88269b9, 0x72c2190e, 0x93d1902d, +0xbc5ecd04, 0x4f25ec41, 0xd9438083, 0x9043a0ce, 0xae0d14dd, 0x715029ed, 0xccd2c9e3, 0x80651541, 0xf37b2145, 0x2a38a1c6, 0xba4070b7, 0x4d6bf1a8, 0x15aa38df, 0xe49f0473, 0x385009a0, 0x2f8f5d29, 0xcf40f900, 0xdaeac1df, 0x85e99811, 0x818249f4, +0x138ff4d3, 0xe5432979, 0x60aab168, 0x676821d1, 0xf55eed49, 0x731e3404, 0xe281b9c0, 0x2fb42c96, 0x85d2e9ae, 0xe57858c6, 0x024e1de9, 0xdf664c8f, 0x9236cc98, 0x3e4eb413, 0x5caa1892, 0x039230e3, 0x5d4d4427, 0x774e945e, 0x920dbd27, 0x592695c2, +0xd978f13c, 0x8435b51b, 0xe736452f, 0xc95e44b3, 0x01dc2d0a, 0x4900204d, 0x1268a866, 0x1026b58f, 0xf4b9b1fc, 0x01e75cb5, 0x3ddc84f0, 0x3a2565f6, 0xe60ae138, 0xba7437ed, 0x4cd4db3d, 0xbd3e156e, 0xbfb91bab, 0xae0e0f1c, 0x5c7ed6d5, 0x75796c1a, +0x04d03519, 0x82d95238, 0x2cd75d24, 0x04cdfeb4, 0x156721ae, 0x805e5cfd, 0x132dd1df, 0x70b4405c, 0xf6a0ecd0, 0x1230c880, 0x58aee3cc, 0x0387dc37, 0x63999183, 0x628488dc, 0xe2dad421, 0xe140c3bb, 0x0100d2f2, 0x59b3fa93, 0x39b07c8a, 0xda6a7a59, +0xe48deffd, 0x92735fd0, 0x17fde4c6, 0xbeb9c959, 0x8493a249, 0x122d032d, 0xf52730e7, 0x77fe62df, 0x5b293ffb, 0x82c49995, 0x722e8534, 0x2dd78fd6, 0xdfa7561f, 0x3c609b61, 0x62994371, 0xf26d1264, 0x13301a72, 0xf7bdf58f, 0x64d3b300, 0x63845a2e, +0x848e69e4, 0xaac3f1a8, 0x4f4ecca7, 0x3a37a0bd, 0x4919f77b, 0x83d980ca, 0x2b80b40a, 0x610354eb, 0x2b9d7fa7, 0x3b37724f, 0x91f483e7, 0xaf131643, 0xe717f867, 0xdd3d9377, 0x147a38f1, 0x3b2ab9e2, 0x8709b5d3, 0xf0f7d70c, 0xad941886, 0xe15d0816, +0xaf0eddee, 0xdc208a28, 0xf1f705fe, 0x38ad65d5, 0x4e4e1e55, 0x17e02f6b, 0x91e9484a, 0x90e99ab8, 0xc95a602b, 0x3c7d50cc, 0xda77b1f4, 0xbb692eb2, 0x11aadf1a, 0x6749a49a, 0x4dd409cf, 0xdc3d4185, 0x064af071, 0xa9442d9f, 0x5ff90ae2, 0x74647545, +0x97a3b83b, 0xdfba9db2, 0x76feb02d, 0x2dca447b, 0x2e5053e1, 0xdd2058da, 0x5b34f456, 0x95397d53, 0xf53afb4a, 0x815e8e0f, 0xe58d3d0f, 0x5d7e0427, 0xcf10905a, 0x71a95903, 0x66497668, 0x80439750, 0xc8477974, 0x05cd2c46, 0x93738d22, 0x4a83e0e1, +0xcd979e9f, 0xae13c4b1, 0xcf0d5bf7, 0x5fe4c14f, 0x72334e99, 0xf427e215, 0x7564a7b7, 0x86096721, 0x4b833213, 0x9424640c, 0xf36dc096, 0xe4902450, 0x4f53070a, 0xf270d9c9, 0xb8f33928, 0x4dc9c262, 0x859370bb, 0x281aa390, 0x60038619, 0x3fe74756, +0x5ef9d810, 0xe6172a95, 0x96bea164, 0x87147e7e, 0x4804ee24, 0xaade3a05, 0xe3da06d3, 0x49043cd6, 0x71b492ae, 0x38b0ae78, 0x3d7d823e, 0xabdee8f7, 0x90f45115, 0x02870ec5, 0xbea402f4, 0xf43a29b8, 0x48192589, 0x96a36ac9, 0x029ac568, 0x3d604993, +0xd9eda66e, 0x16fd3634, 0x2f4d4abe, 0x2a9dad55, 0xbc3ec79c, 0x4a9e2b4c, 0xdb6aa8ab, 0x611e9f46, 0xbc230c31, 0x4b9ef9be, 0xe2c71f8c, 0xdb776306, 0xd9f06dc3, 0xf6bd277d, 0x9439afa1, 0x4cc91090, 0xc85ab2d9, 0xba69fc40, 0x9524b6fe, 0x70a98bf1, +0x8614ac8c, 0xf7a03e22, 0xe590f6a2, 0x6654bdc5, 0x65d361f2, 0xb9f3ebda, 0x59ae313e, 0x001dcbad, 0x4e53d5f8, 0xa959e632, 0x16e0fd99, 0xad89d32b, 0xd8ed749c, 0xb9ee2077, 0x2f508113, 0x074a2283, 0x5a29ed09, 0x65ceaa5f, 0x77e3a972, 0x5d63cf8a, +0xcc8a87c0, 0xcaddbc1c, 0x011d195f, 0xbd23dec3, 0x83c44b67, 0xa844ff6d, 0x64ce78ad, 0x58b32861, 0x67546f37, 0xac8901d9, 0xce1042a8, 0xd8f0bf31, 0xabc3235a, 0x039a179a, 0x1467f35c, 0xcac077b1, 0x814345a2, 0xa85934c0, 0xf0ea1ca1, 0x926e947d, +0x5c631d78, 0xce0d8905, 0x3a2a6b10, 0xbb74e51f, 0xe70a33ca, 0x291a7162, 0xe3c7cd7e, 0xdea784ed, 0xb8eef285, 0x0757e92e, 0x73339c6b, 0x601e4db4, 0xe05ddae4, 0x5a3426a4, 0x39adb727, 0xc947ab86, 0x2cca9689, 0xac94ca74, 0x157aea03, 0x97be7396, +0x00000000, 0x3efa5e09, 0x2e4d984c, 0x5ee413bd, 0xf1eace53, 0xcbdd6eee, 0x05d0e7eb, 0x06573bdc, 0x10b7c645, 0x3ee795a4, 0x10aa0de8, 0x2807683d, 0x11b714b7, 0x858ebb16, 0xcbc0a543, 0xf3700b3b, 0x7479bee8, 0x76e37b80, 0x3ffa8cfb, 0xcd8a5532, +0x2907bacf, 0x732e57c6, 0x2a8066f8, 0xbfa4d006, 0xe0401149, 0xcc974c6d, 0x936e468f, 0xdeba4f40, 0xa77f363a, 0x95e4bbae, 0x85581499, 0xf9f72761, 0xda8283a3, 0x7dfdb599, 0x10a94444, 0x7cbad88b, 0x56e40e45, 0x5fcf7c49, 0xb855719a, 0xa6385b28, +0xe060fa5a, 0x489ccf84, 0x82a2e310, 0x94a3d6bc, 0xf0c9be1e, 0x10bcaf37, 0x3ba514eb, 0x33dce086, 0xa8fc35de, 0xd5146b34, 0x18c55b5a, 0x3af7928a, 0x35617a1d, 0x0ec46ef6, 0x1e6d2ab2, 0x841f798b, 0x9b20d558, 0xca2bc7e7, 0xefe3f9be, 0x488924f7, +0x511ef9cc, 0xcb794186, 0x6aae0654, 0x3d0d6503, 0xe8190e37, 0x2ce34c55, 0xa9aeb3bf, 0x01476d12, 0xb02c85f7, 0x4658a172, 0x94b63dcf, 0x248f534b, 0x222722a3, 0x920ba754, 0x2b19bbdc, 0x7591aa87, 0x4f73d37e, 0x9a67b84a, 0xca3e2c94, 0xaf06c257, +0x2db1ca34, 0xe95e6325, 0x8acefc0e, 0x8c736695, 0xe94b8856, 0x2a5ed6ce, 0x83f06571, 0xd3bc1adc, 0xf7334997, 0x1f2a47a0, 0xc4fa4262, 0x9b353e2b, 0xf6742485, 0x504c7fad, 0x8adb177d, 0x505994de, 0xbfaf8613, 0x3c4a0811, 0x7de85eea, 0xeeb17fdf, +0xfe0dd0e8, 0x06a871e8, 0xa9bb58cc, 0x18d0b029, 0x5fda973a, 0x3426170f, 0x3c5fe362, 0x7a074210, 0xcb6caaf5, 0x62d7f239, 0x7339db6f, 0xe6dd60c1, 0xcc965d7c, 0xf19b387f, 0x3d188e70, 0xaf132924, 0x62c2194a, 0xeea494ac, 0x2da42147, 0x63857458, +0x9d88a4b0, 0x646a68a2, 0xc3155e98, 0xa1d747d2, 0xc252338a, 0x3ae279f9, 0x727eb67d, 0x3574916e, 0x647f83d1, 0xd2ee9cbd, 0x092b720c, 0xf661cff6, 0xc5a8c403, 0x2cf6a726, 0x11fbc225, 0xd2fb77ce, 0x652d05b0, 0x8b89911c, 0xdbc5eeb1, 0x921e4c27, +0x6c0677bc, 0x6538eec3, 0x07ef1cfa, 0x8d340b87, 0xd4530626, 0xcdc4db1d, 0xb0396e84, 0xff5f5689, 0xe79a0dd3, 0xb17e0396, 0x6bfc8035, 0x63909f2b, 0x0879f46d, 0xa76add49, 0x174658be, 0xb684f41f, 0x732c301c, 0xf726a2e4, 0xb7c3990d, 0xda9768d0, +0x56f1e536, 0x9d9d4fc3, 0x249ab838, 0x093e997f, 0x4f66380d, 0xcdd1306e, 0xbefd0072, 0x40e53be9, 0x470a2713, 0xdc3f1938, 0xae41af45, 0x329b8d94, 0x840a92f8, 0x9cda22d1, 0x57b68824, 0x1753b3cd, 0x0ed18585, 0xc300b5eb, 0xeff612cd, 0xf8a5a100, +0xfe183b9b, 0xb907f7fb, 0x582060b3, 0x2a4b3dbd, 0xa085c1b3, 0x93592135, 0x1e78c1c1, 0xdbd005c2, 0xe1327c3b, 0x01528661, 0x7b402f02, 0xb7d6727e, 0xb8409ae9, 0xe1279748, 0x8c668de6, 0x9a725339, 0x07faf789, 0x06bd9a9b, 0x934cca46, 0x160135ac, +0xbee8eb01, 0x7caf33f8, 0x4e21551f, 0xa62db05b, 0xff4abdfa, 0xf18ed30c, 0x33c90bf5, 0xb6911f6c, 0x40f0d09a, 0x74d6c795, 0xf9e2cc12, 0x726b5d0e, 0x49dba296, 0xe78fe6a0, 0x00000000, 0x7a12a963, 0xbfba6d60, 0xdc2af24b, 0x0015eb73, 0xe6c88bb2, +0x328e66e7, 0x8d21e0f4, 0xd5018047, 0x58358bc0, 0x41a256fb, 0xe0751129, 0x19823648, 0x25ddd52a, 0x3433fc7c, 0x74c32ce6, 0x086c1f1e, 0x8b9c7a6f, 0x854dffea, 0x82b70863, 0x6c139ccf, 0x6d411aae, 0x9ccfc9a2, 0xb9121c88, 0x1997dd3b, 0x49ce49e5, +0x4e34be6c, 0x2375a4c2, 0x1f3facd3, 0xc247d8f9, 0x83e58e02, 0xdd78742a, 0xa0902ac0, 0x5e9dfa28, 0xa1c2aca1, 0x23604fb1, 0x2b0c50af, 0x0f96e897, 0xb16be8e5, 0xa8e9dead, 0x7b55c471, 0x0f8303e4, 0x6be96b46, 0xd3a9f1af, 0x1614dedf, 0xdd6d9f59, +0xf8b04a73, 0xc5bd2f70, 0x758441f4, 0x5972e6d2, 0x471fcc60, 0x57a36357, 0xd446ed55, 0x6abbed27, 0x2232c9d0, 0xcc83b60f, 0x11ee2956, 0x95f150dd, 0x3bb0ff98, 0x25c83e59, 0x5e88115b, 0x41b7bd88, 0x59670da1, 0xae544436, 0x464d4a01, 0x6d54f1dd, +0xe80ce544, 0x510b12bf, 0xc4efa911, 0xf0dc556d, 0x4dc656f9, 0xd4bc4a28, 0x84509f02, 0x4159f11b, 0x51adcde7, 0x514cdf43, 0x41b8e3bf, 0x8fe645ee, 0x11543695, 0x1e7ca746, 0x8f07574a, 0x8647a35a, 0x049e4b3f, 0x06897767, 0x57c5a824, 0x553386d8, +0x4e7160c8, 0xdd1dac9c, 0x4b4f219e, 0x882e2a44, 0xd16319da, 0x8379e20c, 0x12e300a4, 0x4f307805, 0x8ad804b8, 0x13430acd, 0x4526a880, 0xc0372f4f, 0x1fdcad2f, 0x8398f0a8, 0xc996c9fb, 0x173c5356, 0x40f9fb72, 0x49581dc6, 0x95e5bb33, 0x1d2a83d3, +0x1ae2ec79, 0x03b73631, 0x46708c15, 0x0801ecdd, 0x999b0e75, 0x5fc444f9, 0x8706bb97, 0xde4b8809, 0x896f3289, 0x4fd16aa1, 0x87e7a933, 0x9b6d2089, 0x5724ba80, 0x5c92606c, 0xcb60e707, 0xce5ea651, 0x18f5d021, 0xd3953726, 0xc977db5f, 0xd64a64d4, +0x86a6b1fe, 0xdcbda6f5, 0x0a16d085, 0x4aef2bf7, 0x8d106b12, 0x5dd378a1, 0x014118cd, 0x0ddebf2f, 0x4c665c90, 0x53baf1bf, 0x9e5361df, 0x1955da48, 0xcb81f5a3, 0x9b8c322d, 0x4e90726c, 0xd0c313b3, 0x580c2b53, 0x0c9fa7e2, 0xc836c392, 0x8b991c75, +0xc1763782, 0x97f2876b, 0x52fbe972, 0xc0d63deb, 0x9d05454a, 0x434ecd43, 0x4486a2e9, 0x5c7372c8, 0x922dd499, 0x55d2947c, 0x10f43cfc, 0x420fd58e, 0x1c6b9b1e, 0xdc5cb451, 0x1dcb9177, 0x43afdfe7, 0x1814c285, 0x84b18da6, 0xd6ab7670, 0xc5096e19, +0x8cb0617b, 0x594d339e, 0xc3610bda, 0xc7ff40e5, 0x8b780ed1, 0xcde99060, 0x4018e9d6, 0x971395cf, 0x802fc699, 0x9eb2737b, 0xcebfb4f5, 0x5a1b170b, 0x5bbb1d62, 0x9f127912, 0xc65f4a8c, 0x08e0fe79, 0xd5fd52e5, 0x17dd41f2, 0x9ff36bb6, 0x8e464f87, +0x59ac213a, 0x169c593f, 0xd45d588c, 0x9de457ee, 0x11b52431, 0x03562495, 0x1ba3f4b4, 0xda34d192, 0xc8d7d136, 0x07c86faa, 0xd70b7c19, 0x5e644e90, 0x1a03fedd, 0x5b5a0fc6, 0x0940f410, 0x05df53f2, 0x4819050b, 0xd983e7a3, 0x8ea75d23, 0x54938cb1, +0x15ca7daa, 0x19b4c8ec, 0x09a1e6b4, 0x5684b0e9, 0xc71e5241, 0x4c874e34, 0xcffeac38, 0xc2c101b3, 0x98da16b8, 0x535be31b, 0xdad5c336, 0xca21ffca, 0x13a21869, 0x9a2c3844, 0xd3742582, 0x49b90f62, 0xcc499a09, 0xdb94dbfb, 0xcf1fbe9c, 0x80ced43d, +0x500dc78e, 0x938ddef0, 0x903ae8c1, 0xc44876d4, 0x936ccc54, 0x0e69891e, 0x898e202d, 0x8df179b6, 0xc4a96470, 0xd2d42feb, 0x01a00a69, 0x0af7c221, 0xdfeb8260, 0xcca888ad, 0x152b6f0e, 0x92ccc63d, 0x5f25565d, 0x45c7ba24, 0x12021200, 0xc1972526, +0x4467b04d, 0xd1820b7e, 0x1c8a89ba, 0xcd0882c4, 0x4a0e3953, 0x983b041c, 0x521afbd6, 0xd962f507, 0xdeaa9aad, 0x816ede54, 0x5e855c34, 0x1b42e610, 0xc380197e, 0x0e889bba, 0x8a39161c, 0x58ed39f7, 0x473194d8, 0x46919eb1, 0x0b57c848, 0x9ca54f23, +0x0bb6daec, 0xd8c2ff6e, 0x10152e58, 0x1e9db5e2, 0x9445b15a, 0x9504a997, 0x5665a24d, 0x167d4b9b, 0x053e4156, 0xc2201317, 0x0d3fad8b, 0xd7ea6ebd, 0x00000000, 0x8238fac1, 0x00e112a4, 0xcac0ed6e, 0x818fccf0, 0x5d326a05, 0x066865c3, 0xdb75c95f, +0x82d9e865, 0x02f62efc, 0x02173c58, 0x8c5173df, 0x1f3dbf8b, 0x90dbfa65, 0x047f599b, 0x0c7eb546, 0x919ae2a8, 0x85f0956b, 0x9c445d87, 0x96b39fa6, 0x4bae333a, 0x94a4a3fe, 0x0f2891d3, 0x5afa05af, 0x148b6567, 0x47d0867c, 0x07297d0e, 0x917bf00c, +0xd2353d4f, 0x851187cf, 0x42eec72a, 0x48f817af, 0x4d27445d, 0xddfcbe38, 0x146a77c3, 0x9acd2ae0, 0x54729e15, 0xd0220117, 0xc5e87cbd, 0xc6be5828, 0xd51c4041, 0x50ecd52a, 0x96528d02, 0xdf0a90c4, 0xd823edca, 0x88cf38e0, 0x0fc98377, 0x997a1cd1, +0x0f443167, 0xe93f6afc, 0xa59b17dd, 0xe95297f3, 0xb7a2d770, 0xbe55d5b4, 0x114a7400, 0x631d9b9b, 0x26231971, 0xdd25b320, 0x71245b36, 0xb20fad71, 0xc9af402e, 0xf7312f9b, 0xb4bc9ed2, 0xd888c921, 0x7ba0ed5f, 0xa6e8a370, 0x3840a119, 0x981b31ca, +0x8c91c2c4, 0xb4d163dd, 0x0373b4ad, 0xd11236ea, 0xf4429b36, 0x4ca47d21, 0x582e8e2f, 0x576abf48, 0x290ad519, 0xe616a694, 0x40fe05e4, 0x06deceac, 0xcc023a2f, 0x2fb9e6ba, 0x0ae94b66, 0x8a22f167, 0x65aea838, 0xa0366ddc, 0x4fba3483, 0xd7a10549, +0x6aea995f, 0x929f87a3, 0x1239c0ad, 0x31da5ed2, 0x253d50d3, 0x1e0e4567, 0xbe3828bb, 0x4093f8eb, 0x7257ef9b, 0xc9c2bd21, 0xd20c7f48, 0x895145ca, 0x4a7ab38d, 0x9181ce01, 0xd4bf4ceb, 0x32a9ea7f, 0x77fa959a, 0x51d98ceb, 0x6a876450, 0x20902ad2, +0x17f947a3, 0x54190be5, 0xc6eb7149, 0xb17c19dc, 0xac6c1519, 0xc32bf647, 0x5b5d3a82, 0x7e606a51, 0xf29c559a, 0x264ee47e, 0xcadcf483, 0x5b30c78d, 0xea4cde51, 0xbd4b9c16, 0x5d83f42e, 0xb8e6e617, 0x3d802617, 0x382d5c16, 0xfb06aa51, 0xa6855e7f, +0x6f47e35e, 0x74e4dc38, 0xfdb599f2, 0x52c7c549, 0x06b333a3, 0x341ad9dc, 0xea21235e, 0xc6868c46, 0xaf725cbb, 0x7bcd1050, 0xf75cd294, 0x52aa3846, 0x861574ad, 0x5ef04083, 0x91ec330e, 0x58437320, 0x4964fa2f, 0x5e9dbd8c, 0x78d359f2, 0x09f702c4, +0xfdd864fd, 0x1d100cc5, 0xb7cf2a7f, 0xcf1c738d, 0x83d5f3a3, 0x4620cb48, 0x438db149, 0x3704907e, 0x606e2f36, 0x9ea80269, 0x1e63b868, 0xe508ef36, 0x031e49a2, 0xb111e4d3, 0xefe1a450, 0x63706694, 0xfb6b575e, 0x850b3d0f, 0xef8c595f, 0xf1efe137, +0xa9ac9217, 0x893cb8c5, 0x2cca5217, 0x74892137, 0x49090720, 0xcf718e82, 0x148af30e, 0x80cbba01, 0xbb9552ba, 0xb88b1b18, 0x0c3785ca, 0xec9210fd, 0x05ad7a01, 0xf42f6639, 0x8566c000, 0x9db64bcb, 0x37696d71, 0x66b0e19a, 0x8a4f0c68, 0x3ef392ba, +0x18bd76c4, 0xaf1fa1b4, 0x1127890f, 0xa5f6ead2, 0x2a7961b4, 0x8fe27669, 0x6c3457f3, 0xe3d6219a, 0x92f27aac, 0xa345d971, 0xdbfb7d8c, 0x29672816, 0x77976895, 0xaab2dbb5, 0x9ddbb6c4, 0x32c41770, 0x9ec5ff66, 0x7d13defc, 0xb262507e, 0x464d3647, +0x723a1294, 0xf818e3f3, 0x23e39e7f, 0x65c35537, 0xa9c16f18, 0xecffedf2, 0x975f00ad, 0xc5f538eb, 0x4fd7c98c, 0xcc6fc720, 0xe67b5b9b, 0xfec62d5f, 0xbbf8afb5, 0x8cfc3fcb, 0x1d7df1ca, 0xde3bfa82, 0x66dd1c95, 0x9b057868, 0x9732fda2, 0x78bea4fd, +0x9441490f, 0x9876ccc5, 0x7149a639, 0x2ca7af18, 0xa328247e, 0xd7ccf846, 0xd8e5342e, 0x2fd41bb5, 0xe0c86838, 0x7e0d975e, 0xc05842ea, 0xc035bfe5, 0x453e82ea, 0x8f8f8b66, 0x43e04c46, 0xde56078d, 0x1794baac, 0xe5651239, 0xf8751efc, 0x7d7e23f3, +0x0f29cc68, 0x942cb400, 0x9b688567, 0x80a6470e, 0x31b7a3dd, 0x4a174e82, 0x347724d3, 0x6c59aafc, 0x099affcb, 0x0c5a78c5, 0xcab1098c, 0x5dee0921, 0x006dfd0f, 0x0a84b669, 0x45537fe5, 0x3e9e6fb5, 0xaadf26ba, 0x2550addc, 0x1bcec269, 0xf2f1a895, +0x69992df2, 0x4cc9802e, 0x3deddb18, 0xe3bbdc95, 0x51b471e4, 0xd4d2b1e4, 0x18d08bcb, 0x867889a2, 0xdd484e2f, 0xac01e816, 0x2a149cbb, 0x57074247, 0x20fdd7dd, 0x6003d239, 0x3b5ee8bb, 0xf1821c38, 0xa05b90d3, 0x1ba33f66, 0xc3460b48, 0x5474f6ea, +0x00000000, 0xd17fcbe5, 0xc598c5e4, 0xbd266119, 0x6f2a1e51, 0x238e6370, 0xdb968083, 0x12543da2, 0x14e70e01, 0xfeabd050, 0x3b3315b4, 0x69f4d0fd, 0xd2618247, 0x05c0870e, 0xe0a59537, 0x83b80eac, 0x06c52cb8, 0x82c91b6e, 0x45b2fdfc, 0x007a296c, +0x3019a41b, 0x9947e5b0, 0x2b2d3f99, 0x8f6433e1, 0x430df828, 0x450898a0, 0x55944b25, 0x6e5f8e55, 0xb41593cd, 0x30a3c147, 0xf11d0b6d, 0x3b0b8940, 0x9f428538, 0xda3034f4, 0x7eb974bc, 0x929584db, 0x00000000, 0x8f1e1a8d, 0x2de81321, 0x7e79388c, +0xa92468c7, 0x5e462a4e, 0xc7bbaaa2, 0xd12219af, 0xa2f609ac, 0x94eacd3f, 0xb902de1e, 0xe73edd3c, 0xccd3ae95, 0x99fd80ec, 0xec96953b, 0x0dd701e3, 0xdaf078c4, 0x58f92f9a, 0xa28c20c0, 0x20ff5ef2, 0x00ba655c, 0x75113cbb, 0x5efc4f12, 0xf1672201, +0xafe1447f, 0x1df1b73a, 0xfa0f2636, 0xf7186be5, 0x481fd573, 0xb9b8bb42, 0x92efadb7, 0xaf5b2123, 0x9f82c908, 0xc1c4e346, 0x8209575e, 0xf1dd475d, 0xaf21084f, 0x0d6d64bf, 0xc17e861a, 0xe181d8e8, 0xfab5436a, 0xa24c6cf0, 0x0d174dd3, 0x552e2e79, +0xdc8f3120, 0x067f49e4, 0x73d41003, 0x65f7c652, 0xea2990ef, 0xa4894048, 0x922fe187, 0x6ee5eb09, 0x06056088, 0x36dc88a3, 0x3d74c0a4, 0x68e08b81, 0x2b5716f5, 0xfa750f5a, 0xbfc7f2a6, 0xdcf5184c, 0x55ee6249, 0xdc35547c, 0x840c37d6, 0x75d1708b, +0x48df9943, 0xb210f345, 0x3bcbc570, 0x53912bad, 0x8fa47fd1, 0x63f2a6da, 0x73ae396f, 0x3bb1ec1c, 0x2d285f11, 0xbf7d97fa, 0x109cd385, 0x1bf4d7b2, 0x1659ff3d, 0x2d52767d, 0xa95e41ab, 0x82737e32, 0x4e1ab5fb, 0x6820c7b1, 0x89db3635, 0x4e609c97, +0x6332eaea, 0xa4f36924, 0xfcb023e2, 0x55540715, 0x78c63d58, 0x00c04c30, 0x06bf05d4, 0xe744f450, 0x658def3e, 0x65378a62, 0x36a6a1cf, 0x2b975ac5, 0x0dad288f, 0x10e6fae9, 0xb978f772, 0xa99e0d9b, 0xec56d90b, 0x45c8d490, 0x9987a980, 0xb4d5dffd, +0xfc706fd2, 0xb2aa9619, 0xca6cab41, 0x6e9fc265, 0xfacf6a06, 0x756b15d7, 0x8fde56bd, 0x9450a863, 0x1b349b82, 0x9ff8e064, 0x1b8efede, 0xd79d1c7b, 0x78bc1434, 0xa4490c78, 0x1b4eb2ee, 0xd1e2559f, 0x993dccdc, 0xfcca0a8e, 0xea93f5b3, 0x30d9e82b, +0xcaace771, 0xe14194d8, 0x685aeedd, 0x73145c33, 0x263a724a, 0xf7a20eb9, 0x20453bae, 0x5e86667e, 0x532b4ef1, 0xdc4f7d10, 0xeae9dcdf, 0xbf07be96, 0x9490e453, 0x689aa2ed, 0x3dcea5f8, 0xda4a1d98, 0x1d31fb0a, 0x84761eba, 0xca16822d, 0x89a11f59, +0xcad6ce1d, 0x1d8b9e56, 0xc1beca2a, 0x2bed73a9, 0x89615369, 0x9f38ac54, 0x82b33202, 0x3b71a02c, 0x361cc493, 0x3666edff, 0xb9c2922e, 0x203f12c2, 0x30638d77, 0x16e39a61, 0x7e0311e0, 0x0bd2616b, 0xd75d504b, 0x9255c8eb, 0xb2d0bf75, 0x5e3c0322, +0xc77be692, 0xd7e73517, 0x43b79d74, 0xe784b860, 0xececbc57, 0x3db48c94, 0x4377d144, 0x1623d651, 0x26fa3e7a, 0x0b122d5b, 0x6348c386, 0xf7624289, 0xb26ada29, 0x53eb02c1, 0xf1a76e31, 0x4ea0d0a7, 0xea53b983, 0x5351679d, 0x58434ac6, 0xcca987f9, +0xc104af76, 0x2d923a4d, 0xda8a51a8, 0x48a5b02f, 0x3d0ee9c8, 0x0ba84807, 0xd15830c3, 0x26801716, 0xa236459c, 0xec2cf067, 0xe13bbdb4, 0x2085779e, 0x84cc7be6, 0x26405b26, 0x43cdb418, 0xbfbddbca, 0xb46fbaa1, 0x78067168, 0x891b7a05, 0xfc0a46be, +0xc7c183ce, 0x105c9fb5, 0xb4aff691, 0x1699b30d, 0xe7fe910c, 0x583963aa, 0x1d4bd266, 0x1026b6d9, 0xa4332514, 0x0b680437, 0xe1fbf184, 0x588306f6, 0xcc69cbc9, 0x4edaf9cb, 0xcc13e2a5, 0xd1987cf3, 0x7ec35dd0, 0xa9e424f7, 0x6e25a739, 0xc701cffe, +0x75ab59e7, 0x736e755f, 0xd7277927, 0x942a810f, 0x63888fb6, 0xf7d827d5, 0x84b6528a, 0x787c5804, 0x654da30e, 0x4572b1cc, 0xaf9b6d13, 0x4865fc1f, 0x2a0ee254, 0x78711976, 0x87fa6964, 0xff8b7012, 0x357feecb, 0xcab23137, 0x799663f2, 0x83a6cc29, +0xddd1209a, 0x3c8a897d, 0x5b8a9c94, 0xd98d85d7, 0xf222b2e9, 0x0da9c2fb, 0x40e19aa8, 0xadf48b30, 0xb6d922e2, 0x1f710c9f, 0xc75d5c22, 0x1e96761b, 0xbe8d903e, 0xed151198, 0xa809fb17, 0xd462e8c2, 0x670015e9, 0x57828b05, 0xc6fc8948, 0x1ed0d9f5, +0xf3836783, 0x82071943, 0x8a53ab9f, 0xdd978f74, 0xd86aff53, 0xc3475681, 0x041a0aa3, 0xb32452c5, 0x225a5088, 0xe5070caa, 0x451cea8f, 0xb2c32841, 0x455a4561, 0xbecb3fd0, 0xd03e4d8f, 0x9483726a, 0x56235e6f, 0xa401ec86, 0x23bd2a0c, 0xac555e5a, +0x635cb0a4, 0x2a484dba, 0x53de2e48, 0x71c2d12e, 0x1acad356, 0x917e024d, 0x8bf27ef5, 0x9d30ba32, 0xd424472c, 0xe4e0762e, 0x4106e02c, 0xb28587af, 0x393156b4, 0xd1d9370b, 0xc2e683eb, 0x48f3879a, 0x79d0cc1c, 0x48b52874, 0x7c2dbc3b, 0xf7dfc2ce, +0x8fe87456, 0xd078e261, 0x045ca54d, 0x9138ada3, 0xb362fd2b, 0x44fb900b, 0xd5c33da8, 0x75d8db8d, 0x3977f95a, 0x7d8c6951, 0xb778f788, 0x70630444, 0x8bb4d11b, 0xf7996d20, 0x13791b0e, 0xc71bf3cc, 0x9d7615dc, 0xe8aece51, 0xa5a039ec, 0x8241b6ad, +0x6ef5725f, 0xadb224de, 0x4caf22d7, 0x996c1f7f, 0xffcddffc, 0xe541a344, 0xcea83b94, 0x08121d32, 0x00000000, 0xa9ee8193, 0x12d8ce64, 0xa1fc9ca1, 0x2e524719, 0xdc365a1e, 0xf67e17a4, 0xac13f1b4, 0xbb364ff7, 0x3d6df3f9, 0x2fb53d9d, 0xb69f8d0c, +0x0046afee, 0x3165e468, 0xd9cb2a39, 0x30c43102, 0xbf6aeaba, 0x176311ad, 0x7c6b13d5, 0x01a1d56a, 0x6eb3ddb1, 0x2baf373e, 0xa5e69602, 0xa84f54f9, 0xfa760035, 0x40a73546, 0xa05d49cb, 0x539881a6, 0x631a1f4a, 0x5a2b49fe, 0x8a150471, 0x8e0f0ed2, +0x1a8c7cb8, 0x743fa109, 0x09f567b6, 0x6aef78fc, 0x5e31435d, 0x57c424eb, 0x26405a2b, 0x2606f5c5, 0x62fd65ce, 0xf2641d07, 0xc6ba26a6, 0x27a720af, 0x0c4eb87f, 0xceee947a, 0xbad13573, 0x98cdca15, 0xe11d0609, 0xa01be625, 0x527ffb22, 0x2ff39273, +0x71847ec0, 0x87bcc68a, 0x05bbdfc9, 0xe90f1b3b, 0x62bbca20, 0xe15ba9e7, 0xcaf49ed9, 0xcf09eefe, 0xd5859246, 0x44bd3fe5, 0xd82c50bd, 0x5fd639d9, 0xecb4c4f2, 0x5a6de610, 0x8faedbb8, 0x6f54a735, 0x6aa9d712, 0x133fb4e0, 0x988b65fb, 0x5665f181, +0x523954cc, 0x30829eec, 0x90dfd727, 0x759e7463, 0x129e618a, 0x01e77a84, 0x3498944f, 0xe949b4d5, 0x6b080278, 0x1b6b063c, 0x5f909637, 0x4914fd1e, 0xfe2aa578, 0xecf26b1c, 0x5bcc337a, 0x31234b86, 0x1f37a371, 0xba979a9d, 0x23fb85e2, 0x7025abaa, +0xcb13e45d, 0xe4a6d9c0, 0x0854b2dc, 0x35394125, 0xa1ba334f, 0xfb917ab1, 0x94c5dd84, 0x992ab091, 0x1725be43, 0x41404fc2, 0x09b3c858, 0xbb70e019, 0x0def6d15, 0x956408ee, 0xcb554bb3, 0x16c2c4c7, 0x8e49a13c, 0x5e77ecb3, 0x9cd7c0b6, 0x495252f0, +0xa4474368, 0x05fd7027, 0xe0fa7c8d, 0x2be998d0, 0xfa30afdb, 0xed53be76, 0xf3c5c86d, 0x6f1208db, 0x865bbc0e, 0x2e14e8f7, 0x7837b698, 0x909978c9, 0x389083de, 0x861d13e0, 0x83e063c7, 0xfbd7d55f, 0xa9a82e7d, 0x66a1c083, 0x38d62c30, 0x66e76f6d, +0x0c081791, 0x27e18f41, 0xb73e5866, 0xdc70f5f0, 0x9522a700, 0xe0bcd363, 0x3d2b5c17, 0x74790ee7, 0x4ce98d39, 0x4d485853, 0x34de3ba1, 0x16846b29, 0xc301f96f, 0xd19f98e5, 0x3ccc2693, 0xf638b84a, 0x1b2da9d2, 0x4d0ef7bd, 0xfe6c0a96, 0xc2a02c05, +0xbf2c4554, 0x221cff66, 0x9c916f58, 0xe8e861bf, 0xcf4f4110, 0x7dcac6bf, 0x6b4ead96, 0x6746ba07, 0xb94debc1, 0x5dd5830e, 0xa2aef7ec, 0x9cd5cc50, 0x800c0d18, 0x39bc1d1d, 0x007e6843, 0x4a1898ab, 0xa939be86, 0x97c116bd, 0x9b917976, 0x2ef2953f, +0x78b05f5b, 0x7f8a823e, 0x07c726a1, 0x5aef5e6b, 0x356fe151, 0x9078585f, 0x73a485b6, 0xf3d6e0ed, 0x2935b39e, 0x2e7106b8, 0x64699e13, 0xf411c64c, 0xa2d09faf, 0x3e0553ff, 0xff7b74e2, 0x29b62019, 0xcd502095, 0x563ca227, 0x25982791, 0xa9c44542, +0x22a2faf4, 0x7ff4ea7d, 0x7f7779fa, 0xb9ce7846, 0xff868f26, 0xcae96e77, 0xbef4a523, 0x56bf31a0, 0xc1fdb49a, 0x17cd1ba5, 0x51781701, 0xca6afdf0, 0x4ddfbe0a, 0x1b9d746e, 0xa569d14d, 0x1b608faa, 0x0cd3fc4c, 0x1ca7a90b, 0x410c4246, 0xb9b01005, +0xef8cb222, 0xca1495b3, 0x64ea0d94, 0x322b5477, 0xf841a987, 0xd189e1dd, 0x7463a317, 0x5a913628, 0x8748b83e, 0xc63a923b, 0x8ca19917, 0xef0f21a5, 0x0b14daed, 0x10745547, 0x3ef8a83b, 0x17b373e6, 0x0b97496a, 0x749e58d3, 0x35118912, 0xe4e6008c, +0xd6cd54fb, 0xdd2475d2, 0x35ec72d6, 0x8cdff154, 0x6847999b, 0xb563ec49, 0x8b9b4472, 0x68ba625f, 0x41f1b982, 0x63d0d0f1, 0x6f032cbd, 0x294bdbdd, 0xddd98e16, 0x973ced79, 0x393f8e9a, 0xd6b33cb8, 0x5a12a5af, 0x1c243a8c, 0xe835fcc0, 0x22216973, +0x25e64fd2, 0x7f0911b9, 0xf355736a, 0x9006301c, 0x4a66f0e8, 0xdda7e655, 0xe8b66f47, 0x07b94ee2, 0x8c5c62d3, 0x51fb8486, 0x90fbcbd8, 0x7833ccdc, 0x0cad940f, 0x784da49f, 0x9b6c82b2, 0x68c40a1c, 0x100a3d04, 0xbe8acd60, 0xe3dcdde9, 0xae7d0ba0, +0x9bef1135, 0x6ffed779, 0x9caba413, 0x35921a95, 0xca970634, 0x741dcb54, 0xa5942a89, 0xae80f064, 0x74e03090, 0x51067f42, 0x1730e061, 0xef7149e6, 0x5d561089, 0xc17e271d, 0x97bf7efe, 0x1c5a52cf, 0x418fd1c1, 0xb2a4cae8, 0xcd2e48d6, 0xf8bc5243, +0xd64ec77c, 0xbe7736a4, 0x32553c34, 0xe321262d, 0x46cb64e7, 0x3941e6d9, 0x632d2b35, 0x174e8822, 0x46369f23, 0x225f0130, 0x39c2755e, 0x73daedf5, 0xdd5a1d91, 0x073add65, 0xda60c0f4, 0x87b543fa, 0xb227596f, 0x56c159e3, 0x9085a39b, 0x4a9b0b2c, +0xf46fae0f, 0xcdaddb51, 0xdae35373, 0x41722a05, 0x808f9e9f, 0xb2daa2ab, 0x2565dc55, 0xf83fc1c4, 0x4d5c2d8d, 0xd630af3f, 0x80f1f6dc, 0xa2530c28, 0xf3a888ae, 0xa9ba2d01, 0x5a6ccdec, 0xf49255cb, 0x4da1d649, 0x3e7b3bbc, 0xa22d646b, 0xd10a725a, +0xae0363e3, 0x8b18d7f5, 0xeff2da61, 0xe35f4e6e, 0xc644fa78, 0xb259312c, 0x00fdfbc4, 0x78ce3718, 0x4ae5636f, 0x8c220a90, 0x2e8cfd7c, 0x9c283794, 0x649465d7, 0x63534376, 0xe465930b, 0x8b66bfb6, 0x0b6ab2ae, 0x1089ae83, 0x10f7c6c0, 0xe8c80704, +0xb5e07fce, 0x63aeb8b2, 0xc183dcd9, 0xaefe9827, 0x3e86c078, 0x9b12eaf1, 0x0be92129, 0xf4ec3d88, 0x46b50ca4, 0x1b1ee7e9, 0x87cb2bb9, 0x8736d07d, 0x1cd9c148, 0x22dc92b7, 0x29c8485a, 0xda1ea8b7, 0xc6c769ff, 0x6f7d44fe, 0xa947d6c5, 0x5185ecc5, +0x5d2878ca, 0xb51d840a, 0x6417f650, 0x1be31c2d, 0xff051ca1, 0x5dabeb4d, 0x00839387, 0xc1004f5e, 0xc6b901bc, 0x73597e72, 0xe49868cf, 0xe41bfb48, 0x8be52c31, 0x6839f1d8, 0xd1f7899e, 0x6f80bf3a, 0xb9338382, 0x9c565fd7, 0x0c506fcb, 0x8072655b, +0xd1741a19, 0xa5ea42ca, 0xb59e178d, 0xe3a2b5aa, 0x9742853a, 0x251bb416, 0x4648f760, 0xa517b90e, 0x2e0f6efb, 0xe84b9483, 0x32d6afb3, 0x00000000, 0x0c2e0788, 0x4d2245ce, 0xcdd3b312, 0x32a8c7f0, 0xfff8e765, 0xbe095ee7, 0x5642ca64, 0xda9d3b30, +0x73271631, 0xf32b1b29, 0xf8c23a00, 0x0744b526, 0x15e89805, 0x330b21e6, 0x14c3d0cf, 0x63229bdc, 0xc2d02f14, 0x114636f1, 0x88e15238, 0xe7c0747d, 0xf45ee8cc, 0x0d28f553, 0xa784b07c, 0xadf10951, 0x6cd2c4cf, 0xca7d3c79, 0xe09d3803, 0xd8c8e802, +0xb41a2ccd, 0x695722f1, 0x0a75b92d, 0xfe2b51e1, 0x0ff05f13, 0x65549f68, 0x4c477998, 0xab870de5, 0xb19fcaf3, 0x21bef59d, 0xc8a59639, 0x7412a999, 0x52f1107a, 0x6df98c05, 0xbcb73fa0, 0x7264ad2d, 0x61fa319c, 0x2ae0047a, 0x5ef2ade3, 0x6f212645, +0xc0088554, 0xd065fb6f, 0xe8302b6e, 0x71974fa7, 0x45c1223f, 0xc755c92a, 0x8e97568c, 0x416f8ccb, 0xc4a62ba0, 0xa0d9fc02, 0xf686428c, 0x368ec7d8, 0xf228ec78, 0xdb3b0a88, 0xb34760b3, 0xb26c2879, 0xc98edef3, 0x910a77a4, 0x012b48ca, 0xb8199154, +0x863a45e1, 0xd14eb3a5, 0x1a18c716, 0x44ea6af5, 0xacda419b, 0x687c6a3b, 0x03f3e28a, 0xf9761d9f, 0x3f089c7f, 0x34566d98, 0x067604b4, 0x8d64b406, 0xcc0b38cd, 0x5a5c0317, 0xaaac452f, 0xd39619e5, 0x3e23d4b5, 0x19eb259c, 0x106d7e3b, 0x8294eb15, +0xe518de3d, 0x76ca03d9, 0x55ac5c04, 0x565fbe8e, 0xfa85ff15, 0x4d6c3152, 0xbac13b14, 0x2095bd57, 0xedb5cd50, 0x7539e153, 0x5102f2f0, 0xa95fa7a5, 0xda104242, 0xf7ad0a46, 0x5029ba3a, 0x7cbfbaf4, 0x18c06d56, 0xa32a1e88, 0x1eb669e2, 0x7d94f23e, +0xe6eb3cb7, 0x92f9952e, 0x678c3528, 0x02d8aa40, 0x84e2efa1, 0x3cfb7ef5, 0x2838ae3a, 0x1f9d2128, 0x3855d001, 0xa47752f6, 0x2bcb4cb0, 0x397e98cb, 0x977c7310, 0xf575a006, 0x9c2282f7, 0x2c9600ce, 0x31d38ba6, 0xaf29a311, 0xe36eda89, 0x0c03bd99, +0x96573bda, 0x25105b69, 0xced3928d, 0xa6aff8b6, 0x8fbc1e46, 0xfdd8b36b, 0x7ac9be40, 0x9fd1607d, 0x37a58f12, 0xe2459243, 0xdebeecb6, 0xa55c1a3c, 0x12b5d47b, 0x6e0a6e8f, 0xd738b711, 0x48e9d76c, 0x53da58b0, 0x9a548643, 0xb7e9ce47, 0x8167099f, +0x83bfa3df, 0xbf44dd2a, 0x60d17956, 0x161b7a8f, 0x00000000, 0x7e6710b4, 0x2dbd4804, 0xd613ffdb, 0xb0b48239, 0x647fd7a2, 0x2f65e244, 0x734fe5e7, 0x948f919a, 0xf303a4b2, 0xf0f04638, 0xeae8812e, 0x6209d316, 0xebc3c9e4, 0x8a39f878, 0x5884a957, +0x1d458b68, 0x5774f644, 0x4fb49b12, 0x26e3b9e3, 0xc67e81e0, 0x7be2f68a, 0xb5316407, 0xbbea73de, 0xe91b63a4, 0xbd9c776a, 0x23665fdd, 0xc123cd9e, 0x4719887f, 0x59afe19d, 0x4e9fd3d8, 0x9efa28b7, 0x357d2552, 0x5b774bdd, 0x5d014f69, 0x4632c0b5, +0xee462fda, 0x793a5cca, 0x804c4155, 0xa874ef6f, 0x70bc076d, 0x30f8c36c, 0x075d4c7e, 0x243b13a3, 0x78111400, 0xb932d99e, 0x988c2c03, 0x95a4d950, 0x09865ba7, 0x548714ce, 0x0b5ef1e7, 0x0edb17d9, 0x90213f6e, 0xbe6f95e0, 0x43b7268b, 0x04aeaef4, +0x9b7fce89, 0x3ba6328b, 0x4b1a35e6, 0xe43396f7, 0x77e14b13, 0x6b8f88b1, 0x89ca1af2, 0xcff8da47, 0xf1db0ef2, 0x4044c401, 0x5c2a07a3, 0xfbaeb7df, 0xd4cb559b, 0x7f4c587e, 0x66a77de2, 0x49c29fa6, 0x17303245, 0x5fd9e529, 0xd5e01d51, 0xdd4d0e3c, +0x85c9a76b, 0x8c4ffccc, 0x1b338fdc, 0x6aa4c07b, 0xa2015642, 0xdf95a47c, 0xf85d5555, 0x9d09ca3d, 0x2e4eaa8e, 0xd2bd512f, 0xe1b670c9, 0x224d1717, 0x8b12b0b2, 0xae02ebdb, 0x429c6e41, 0xc58d636a, 0x3220692c, 0xdc6646f6, 0x27c8f129, 0xa1f2b4c8, +0xcd207007, 0x139e9cb1, 0xef6d6710, 0xfcf3fba1, 0x08ad136d, 0x87110d2b, 0x3dd0363f, 0x99a764c9, 0xec9e859a, 0xb6c2868d, 0x3a8d7a41, 0xd9e3a0c8, 0x2913e6f0, 0xc3fb67de, 0x4a317d2c, 0x0585e63e, 0x93d2dde4, 0xff00192b, 0x1c6ec3a2, 0xcb5674b3, +0xa956ff80, 0x2af431fd, 0xe86d0b54, 0x36e9d478, 0x04d96f53, 0xc23cd7c2, 0x9dee2c9e, 0xd9621c15, 0xb4805c62, 0x2e88b3c5, 0x6eddec1d, 0x47b39ce1, 0xf1c72a8e, 0x07432e52, 0x02510766, 0xe9a64d33, 0x73aea294, 0x758327ca, 0xdcd5d84a, 0xdf4f994b, +0x5d261151, 0x413bf4d4, 0x062d855e, 0xc06dd0a4, 0xee408e0a, 0xddbb7346, 0x9c808792, 0x9c256af9, 0xf25d6b8f, 0x5fd2fb5c, 0xec11896c, 0xe8c8e63f, 0xb1927556, 0xdd1e9e2d, 0x9859e8c1, 0x58343865, 0xf470eed1, 0x693b2f24, 0x4429dde0, 0xf4d503ba, +0x364c3913, 0xecb46407, 0x31aafa2a, 0x87de4c45, 0xb54b1a05, 0x9f1ac693, 0x34b8d31e, 0x9ed180f4, 0xc3f791a5, 0x5891d50e, 0x9fbf2bf8, 0x420458be, 0xde84df2c, 0xafde97b5, 0x18c48ad6, 0x2800dbf0, 0x6f16aa7a, 0x341d3e75, 0xb0593331, 0x35739579, +0x9e746d9f, 0x6fb34711, 0xae15d1d2, 0x76bc8ba0, 0x6e780176, 0xea99e159, 0x68558428, 0x2b9a9af1, 0x1e4ce2e3, 0xebf74a55, 0x30c45126, 0x06886835, 0x5d83fc3a, 0x1d734e89, 0xf68404dc, 0x5a653f03, 0x1ee90f88, 0xed7f2260, 0xace13bdf, 0xad8f90d3, +0x877ba12e, 0xc57ff990, 0x05b7c45f, 0xab07f8e6, 0xf5bba8b6, 0x59ff7e02, 0x71ffa5f2, 0xa838548c, 0x2cd9b4a3, 0x7034e395, 0x43cf1ed9, 0xf74f42bb, 0xd9c7f17e, 0x4678da86, 0x35d67812, 0xb3669f5b, 0x6aa16e25, 0x2b3f779a, 0xb2083457, 0x33fbfd4c, +0x047c8238, 0x6b6a2842, 0x81f3c91b, 0x83a2ce7d, 0xea3c0c32, 0x4716718a, 0xf7eaafd0, 0x1a3060db, 0x7777cdc7, 0x00a5ed6b, 0x40555fd8, 0x02f4ea0d, 0xeddacf0b, 0xeb52a73e, 0x454776ec, 0xb2add93c, 0xc78b139d, 0x2e2d5eae, 0x5e19bd3b, 0x2db71faf, +0x1f2249ef, 0x28a5369b, 0xb3c37230, 0xb0fcde5a, 0x45e29b87, 0x335e1027, 0xb5eef76e, 0x42a1b5d5, 0x40f0b2b3, 0xe903a058, 0xf00c6ce9, 0x809d6217, 0x715a4899, 0xb6d15b04, 0xd80cb719, 0x82cc6571, 0x6bcfc529, 0xc2993aa9, 0xf333c083, 0x86b0e749, +0x19aa21da, 0x761966cb, 0xef8bc86d, 0x81562470, 0x84440d44, 0x01cb4667, 0x9b6644ab, 0xf51e45dd, 0x32955640, 0xaf7b7ade, 0x296e70fc, 0x86150a22, 0x5c48ba5d, 0xda5db07f, 0xf2f886e4, 0x1bfb26bc, 0x852aa648, 0x8269881a, 0x9bc3a9c0, 0x595a9369, +0x5ebc5050, 0x9992aea6, 0xc4b4bff7, 0x77d220ac, 0xc5da14fb, 0x310f1741, 0xaa6953ea, 0xaaccbe81, 0x6a04834e, 0x68f06943, 0x3061bc4d, 0xc0c83dcf, 0x83072316, 0xef2e2506, 0xc6e5b891, 0xad2a7db8, 0x033fac6a, 0xdb331b73, 0x190fccb1, 0xaeb03cb9, +0x6d47ad1c, 0x07e6c339, 0xdfea7420, 0x9aad02cc, 0x419e19bf, 0x1dd6a3e2, 0x3722921f, 0x2c7c59c8, 0x1a958db0, 0x436af3b2, 0x5ced5736, 0x7265e4f3, 0x744861ad, 0x016eab0c, 0x2a51dc96, 0xc1037ba8, 0xc72efef6, 0xb425b109, 0x5b0b940f, 0xdb96f618, +0x858f4b23, 0xd8a95a72, 0xde213247, 0x3230bb2b, 0x1f87a484, 0x186167bd, 0x1cb808ee, 0xaba2158d, 0x1b5ecbd7, 0x5f771637, 0xdc703521, 0x9a08efa7, 0x98fc05aa, 0xc3527cce, 0x730b4fff, 0xb7bff008, 0x699ec24f, 0x448c308b, 0x46dd37ed, 0x9d4bc1f5, +0x993743cd, 0x2d12f2c4, 0xb71a1d63, 0x7526caa1, 0x1c1de585, 0x05122934, 0x29cb9d97, 0xf3962de8, 0x74ed8cc6, 0x84e1e02f, 0x70910efe, 0x37877f74, 0xc64055fa, 0xac44d6b4, 0xf0a98182, 0x2f43f5a2, 0x6de24077, 0xf162c7e5, 0xc1a696c3, 0xa9f312eb, +0xeee56361, 0xb137983d, 0x80388f7c, 0x2fe618c9, 0x00000000, 0xc411529c, 0x6c8ceb7b, 0xf621e9b7, 0x039a4101, 0x5bae7964, 0x5ac0d268, 0x6c290610, 0xa89db9e7, 0xb674b66f, 0xdaf85d14, 0x72c00998, 0xcffc31ca, 0x733311ae, 0x68b275db, 0xd1128756, +0x5c1d148d, 0x2f2e0523, 0xc749f6fd, 0x6007b2ec, 0x80d58605, 0x5f1282c1, 0xe867f3de, 0xf0ed57d8, 0x397122b7, 0xa99bc783, 0x54a8d3ba, 0x08b19108, 0x1eeeb69c, 0xc99c756f, 0x279bc214, 0x1de120d0, 0xb21ef5c9, 0x90eae534, 0xf85cc6d0, 0x24945458, +0x788d16ea, 0x656c363a, 0x4a466526, 0x188aa406, 0x4f29b7cf, 0xb7712720, 0x479826c7, 0x4a423319, 0xaa9451cf, 0x86b1949f, 0x21ffd08e, 0xe5b9b03f, 0xdaac8012, 0x93e12547, 0x9b54e270, 0x75570334, 0x41fc345d, 0xca97b51c, 0x9e3f66a6, 0x2a41d7ca, +0x68b623e4, 0xa22196f8, 0x188ef239, 0x030f964c, 0x2c25c550, 0x9e3b3099, 0x4949f36a, 0x31c0b3bf, 0x08b5c737, 0x3f116612, 0x0ed58392, 0x4c2277bc, 0x985b743c, 0x765cc347, 0x8e000597, 0xed0c7708, 0x83de4676, 0x103f6331, 0xc9982350, 0x494da555, +0x630c729f, 0x8b6b8141, 0x1de576ef, 0x32cb73cc, 0xbaab32fe, 0x294e4186, 0xafffd519, 0x22f410fd, 0x3c1ef05e, 0xb1116385, 0x5a7d5028, 0x0bbe0744, 0xfe38d44a, 0xfe3c8275, 0x85be02d3, 0xc442368e, 0xdfc352fb, 0xd47d55bf, 0xeb6c33ad, 0x24900267, +0x2c21936f, 0x0dde43e1, 0x37a0f71a, 0x5f16d4fe, 0xd116d169, 0xa12a568b, 0x3a7eb4fb, 0x41f86262, 0x9d34a6d5, 0x8b6fd77e, 0x4f2de1f0, 0xee07b77b, 0x86b5c2a0, 0x7553550b, 0x1b85324a, 0xbfc4e017, 0x6bbde397, 0xe3dda2a5, 0xf5828531, 0xdfc704c4, +0xa4458462, 0xacf04355, 0x1554e7e7, 0x85ba54ec, 0xd77695cc, 0x066044a5, 0x165f2794, 0xb47ae753, 0x788940d5, 0xd9a74061, 0x958161e2, 0xa74a122e, 0xe863a5e1, 0x294a17b9, 0x54ac8585, 0xb47eb16c, 0x2f2a531c, 0x7038d1dd, 0x4497b08b, 0x0004563f, +0x0dda15de, 0x3a7ae2c4, 0xf6894542, 0xc74da0c2, 0x6ed66741, 0x5a790617, 0x51c70153, 0x6ddda732, 0xf586d30e, 0x21fb86b1, 0xa12e00b4, 0xe0d662d6, 0x968aa191, 0xe0d234e9, 0x030bc073, 0xccf3a786, 0x6dd9f10d, 0xa441d25d, 0xbccf2064, 0xd21d111a, +0x6ed2317e, 0x34af6156, 0xb9a4a4b2, 0xbaaf64c1, 0x90eeb30b, 0x0664129a, 0x8d0f93db, 0x34ab3769, 0x1550b1d8, 0xcff867f5, 0xe6b2704c, 0x279f942b, 0x8d0bc5e4, 0xaa9007f0, 0xca93e323, 0x6663a076, 0xe5bde600, 0x4c262183, 0x1334a342, 0x1eeae0a3, +0x32cf25f3, 0x8e0453a8, 0x52ccc120, 0x703c87e2, 0x42f7f42e, 0xd9a3165e, 0x5c1942b2, 0xf3e2c194, 0xb9a0f28d, 0xb21aa3f6, 0x968ef7ae, 0x7b86d699, 0x52c8971f, 0x2a4581f5, 0x88604132, 0x5972c664, 0x83da1049, 0x7de2c403, 0xc12de467, 0x165b71ab, +0x0ed1d5ad, 0xa225c0c7, 0xfb5706a3, 0x00000000, 0x1330f57d, 0x57a745f6, 0x958537dd, 0x7ee90470, 0xeb686592, 0xc2262414, 0x5976905b, 0xccf7f1b9, 0xd772c3f3, 0x985f2203, 0x7b8280a6, 0xbfc0b628, 0xfd331439, 0x80d1d03a, 0xa99f91bc, 0x4493e6b4, +0x76589578, 0xaffb8326, 0x42f3a211, 0xa74e4411, 0x6bb9b5a8, 0x103b350e, 0xdcccc4b7, 0xc129b258, 0x479c70f8, 0x056fd2e9, 0x0bba517b, 0xfd374206, 0xf68d137d, 0x93e57378, 0x65686005, 0xd4790380, 0x39757488, 0x31c4e580, 0x9d30f0ea, 0x7de6923c, +0xee03e144, 0x51c3576c, 0xe3d9f49a, 0x6003e4d3, 0xf0e901e7, 0x7eed524f, 0x8864170d, 0x22f046c2, 0xd2194725, 0xf3e697ab, 0xc222722b, 0x6667f649, 0xc44660b1, 0xdaa8d62d, 0x9b50b44f, 0x57a313c9, 0x73374791, 0xdcc89288, 0xb11535ba, 0xfb53509c, +0x056b84d6, 0x630824a0, 0xe6b62673, 0x1b816475, 0xacf4156a, 0xbccb765b, 0x3c1aa661, 0x3f15302d, 0xf85890ef, 0xed082137, 0xb775711f, 0x37a4a125, 0x70065d6e, 0x5c134417, 0xb3fbf790, 0x7992fd19, 0x963c703c, 0x22f7e879, 0xb4567000, 0xef336560, +0x68723888, 0x07765177, 0xdb14275d, 0xfe4e48b4, 0x3427423d, 0xcd82b3bb, 0x70dd8b89, 0x2b63480e, 0xa25d0ca3, 0x0ee2f100, 0x43caa661, 0x22b1d6db, 0x914a214b, 0xc36042bb, 0xa21b3201, 0xe89ee2f0, 0x8ed5fd9f, 0x11a6fb33, 0x8e4815da, 0xd280872a, +0x438c98c3, 0xe8030ab5, 0xf7dae8c3, 0x9898bf9e, 0xbd190690, 0xdbcff1ba, 0xd52d00ba, 0x61a0a65d, 0x2c88f13c, 0x617b70ba, 0x1f9fdcd4, 0x613d4e18, 0x18e98da3, 0xf97e2761, 0xf9e3cf24, 0xf9a5f186, 0xbaf2bfa2, 0xc41613cc, 0x77ede45c, 0xba296945, +0x5c8eac52, 0x96a19879, 0x07ebb932, 0x3db3e24a, 0xac2215e6, 0x0994a077, 0xa5b6b591, 0x222c3e9e, 0x2bb89ee9, 0xfe959e53, 0xf0ea8716, 0x5cc892f0, 0xdb89cf18, 0x226a003c, 0x98436979, 0x8e93c33d, 0x4db5bf24, 0xbd5f3832, 0x87415de8, 0x89a3ace8, +0xa56d6376, 0x66d6f72a, 0x89787a0f, 0x52b78bb5, 0xac642b44, 0x6f0469ff, 0x8707634a, 0x79492bfe, 0xb48da6e7, 0xdb5219ff, 0x68efd0cd, 0x5c557ab5, 0x18afb301, 0x09d29ed5, 0xbd84eed5, 0x773632bb, 0x7e3f7a89, 0xef755bc2, 0xe8d8dc52, 0x00000000, +0x5bbec387, 0x4df38186, 0xfed3a0f1, 0x967a4e9e, 0xf7470086, 0x44211f53, 0xab544491, 0x07ad8790, 0x6f9981ba, 0x2b2576ac, 0xb3202177, 0xe67c13f0, 0xf7013e24, 0x4a1838b4, 0x3ac5b33d, 0xca690a89, 0x96e7a6db, 0xc48bfb89, 0xd5b0e8ff, 0x3a585b78, +0x251c514b, 0x3d6834ad, 0xbdc2d077, 0x1fd9e276, 0x2581b90e, 0x551a0c25, 0x7e79442b, 0x9f7306ac, 0xacbffda3, 0xf0acb9b4, 0xfe087616, 0x00dbd6e7, 0x3351134a, 0xc4502d6e, 0x55c1dac2, 0x6834062a, 0x555c3287, 0x187465e6, 0x3df5dce8, 0x07306fd5, +0x68a9ee6f, 0xb4104ea2, 0xe63a2d52, 0x094f7690, 0x5b651560, 0xe10a4287, 0xdcff9e6f, 0xefae8d25, 0xabc9acd4, 0x009de845, 0xe6a7c517, 0xa286da44, 0xa52b5dd4, 0x87dcb5ad, 0xa2c0e4e6, 0x89e5924a, 0x44fac9b4, 0x160b7ca3, 0xdc62762a, 0x4ac3ee53, +0xbab48100, 0x09094832, 0x117d2dd4, 0x704063cc, 0x80370c9f, 0x0ea4cfa2, 0x33172de8, 0x790f155c, 0xc3267c19, 0x169694e6, 0xcdc48d19, 0x11e0c591, 0x164d4201, 0x660d21cd, 0x9feeeee9, 0x00463ea2, 0xd25b51cd, 0x879a8b0f, 0x4d285761, 0x80aae4da, +0x77700c19, 0x7ee4ac6e, 0xab8f9276, 0x8e0e2b78, 0x61e698ff, 0x9191f7ac, 0x16d0aa44, 0xdc244888, 0x77abdafe, 0xe1d19460, 0xe197aac2, 0x446721f1, 0xdcb9a0cd, 0xa5f08b33, 0x664b1f6f, 0xefe8b387, 0x8071323d, 0x34baaa78, 0x52f1b517, 0xc3fdaafe, +0xd2c6b988, 0x526c5d52, 0xcab2dc6e, 0x4a5e0616, 0x910c1fe9, 0x9f35380e, 0x980557db, 0x4a85d0f1, 0x9fa8d04b, 0x0e3927e7, 0x4d6e69c3, 0x34617c9f, 0x2c5327db, 0x79d4c3bb, 0xc3bb945c, 0xf79cd661, 0x255a6fe9, 0xd56b3e18, 0xb4cb9845, 0xc4cdc52b, +0x2bfea04b, 0x522a63f0, 0x44bcf716, 0x5587e460, 0x893e44ad, 0xcd59655c, 0x1f440a33, 0x7ea292cc, 0xba6f57e7, 0x98de813c, 0x0e7f1945, 0xab127a33, 0xf03151f1, 0x3d2e0a0f, 0x25c787ac, 0xe6e1fbb5, 0x2ccecf9e, 0x6fdfbf18, 0x43574e24, 0xca2f342b, +0x113b1376, 0xb3bdc932, 0xf0776f53, 0x18325b44, 0xf93819c3, 0xcaf4e2cc, 0x3a838d9f, 0x5b232bc2, 0x80ecda78, 0x33ccfb0f, 0xe14c7c25, 0xacf9c301, 0x91d7c90e, 0x338ac5ad, 0x5bf8fd25, 0x1f023491, 0xb3661fd5, 0xd5f6d65d, 0x6f42575d, 0xe8453417, +0xcd1f5bfe, 0x43117086, 0xd21d6f6f, 0x3a1e65da, 0x2c151979, 0x34fc94da, 0x709bb52b, 0x6690c988, 0x39fd96e7, 0xb43330e5, 0x06be687a, 0x29d2ba67, 0x4680178e, 0xe5f44155, 0x451fef54, 0x9c37a846, 0xd7c4d41e, 0x0984d9b2, 0x3e95dc59, 0xad98c5d7, +0x102f2c80, 0x41e85d30, 0xd333667a, 0xde400dac, 0x486c8482, 0x9092e154, 0xe103f331, 0xcc26fb32, 0x4a255e9c, 0x76f958db, 0xd17abc64, 0x280498a3, 0xbe28118d, 0x7a5c11c9, 0xefef603d, 0x6a733d49, 0xfb37fed9, 0xd9284712, 0xe0d5d1f5, 0xbdb7e957, +0xe8872a83, 0x772f7a1f, 0x7ce279b3, 0x49baa646, 0x5843a802, 0x2ebaf0d9, 0x6ba51f8d, 0x30794f55, 0x0ca54912, 0x403e7ff4, 0xac4ee713, 0x95b371f4, 0x8b70ce78, 0x859c5d74, 0xb9405b33, 0x88ef36a2, 0xb35b7a5b, 0xc083b220, 0x3230954b, 0xa5ca3ea1, +0xbadfa3e9, 0x2b9b6079, 0x01d622c4, 0xc7ebf89e, 0x169144fa, 0xf2b3276b, 0x23c99b0f, 0xf0fafd75, 0xa96f77b3, 0x3bb44cf9, 0x14d89ee4, 0x720eeabf, 0x9a89c03c, 0x60681c21, 0x87d5876a, 0x1747663e, 0x5a0a721c, 0xcfb903e8, 0xf5db6dd5, 0x538eabae, +0xb112a045, 0x1d5c4756, 0x5258896a, 0x4d4d1422, 0x98c01a22, 0x80bdcdd4, 0xee3942f9, 0x21804111, 0xc5a22280, 0x6e848f2d, 0x0bcd03ac, 0x3cdc0647, 0x0852fb76, 0x56af3b0e, 0xa37456db, 0x371105eb, 0x6d1b77f7, 0xe34a292f, 0x2a4d42bd, 0x3d0a2483, +0xf97e24c7, 0x79c3e913, 0xf12cdfb1, 0x31af6d91, 0x962c892e, 0xeda6ba23, 0x66d6745b, 0xdab7bfc8, 0xa2a2741f, 0xc9076b92, 0x8322350e, 0x04f7b264, 0xd612f6da, 0x273e296b, 0x4ed2ecf8, 0xe66bb98f, 0x6700569f, 0xb67aeafb, 0xf40d4f11, 0xfd8996a3, +0xce6f212c, 0x4277a5ea, 0x8f877c1c, 0xa8b95577, 0x2f6cd21d, 0xd0ac9ea0, 0x07684abe, 0x844a7fb0, 0x052190a0, 0x3a626e3d, 0x8dcea602, 0x61be3ee5, 0x816bef10, 0xf644950f, 0xc4740044, 0xec7098e7, 0x5cb41a66, 0xd58d0e00, 0x348efd31, 0xca989348, +0x7f7d8169, 0x3558dff5, 0xb7acc83f, 0x63f7e4fb, 0xbb09812d, 0xa13d8cc5, 0xafd11fc9, 0x4c9b36e6, 0xa41c1c65, 0x19abf532, 0x89391466, 0x2d250803, 0xd45b2cc4, 0xae073d0d, 0xa655c67b, 0x71911265, 0x44c9cd90, 0x1c8a6592, 0xc31c4afa, 0x0f3ab1c8, +0xfe166e79, 0xab26adad, 0x7815cbd7, 0xcdf0d9f6, 0xb89679f7, 0x0eec930c, 0x50115374, 0x74b082c5, 0xeacef09d, 0x3f43fe9d, 0x4f04ce3c, 0x54e6e110, 0x382bb423, 0xa0ebae01, 0xb28d589f, 0xfae1dc1d, 0xc8d14956, 0xbc61cb93, 0x1f159d48, 0x33e6b78f, +0x65498c81, 0x5f2be2bc, 0xf792b7cb, 0x11f90e44, 0x1266f69e, 0x150ebc20, 0xfc5fb467, 0x1ec3bf8c, 0x205663d5, 0xeb18d259, 0x8c1884c6, 0x221fb9cb, 0x4bf37c58, 0xd2e544be, 0xffc04cbd, 0x0a1b2168, 0x8aa6ecbc, 0x9e7e7258, 0xe9510847, 0xc63dda5a, +0x5d6238a2, 0x8603a5ae, 0x92db3b4a, 0x7566a001, 0xdb619d0c, 0x649fae45, 0xf8a80603, 0x039ff8da, 0x69ecc593, 0x1be22f2c, 0xd8fe65d6, 0x82f417ca, 0x6f52ade9, 0xdf962f68, 0x2cf32ac7, 0x26e80baf, 0x5bdc50d8, 0x1a340de8, 0x36c7272f, 0xaaf08f69, +0xa783e4bf, 0xc2ca683e, 0x7d345b77, 0x7eaba3ad, 0x94655330, 0x6ccd5533, 0x4756354a, 0x9144c390, 0xbffe3349, 0x991638e6, 0xe7bd9b4b, 0x9fa8509c, 0xb0c48281, 0x930d198e, 0xcb4eb18c, 0x24a1d1b1, 0x97faabea, 0xc15590e4, 0x9de18a82, 0x73d8c87b, +0xdddff576, 0x9b5fe2f8, 0xdc09d7b2, 0x577919ca, 0x2577f375, 0x00000000, 0x13b0d45a, 0xe4226391, 0x187dd7f6, 0x0d736bd6, 0xf36505af, 0xe29c0beb, 0x59958ac6, 0x704730a1, 0x5530c3d4, 0x683ae757, 0x6221c63f, 0x51c771b0, 0x5efdc078, 0x0249da1e, +0x8e515ed8, 0x43a1872e, 0x7b8a330d, 0xb5e51221, 0x13861b5f, 0x5428cd99, 0xdd9976d6, 0x06fc677a, 0xc25de30d, 0x4a362607, 0xe0771260, 0x8c2db3ca, 0x6f3ace55, 0x78faa3ca, 0xc57bfa32, 0xf3f1093f, 0x62a23e94, 0x1ca4fa24, 0x3ac87d89, 0x368af30d, +0x1a589d5e, 0x10e674a0, 0xee8f8d5e, 0xf22b777a, 0x44ceb939, 0x17c06d9f, 0xce1f6d89, 0x0c428e84, 0x8f4ddc35, 0xa9215b98, 0xe3177d9f, 0x7920dd8f, 0xd9df0016, 0xbb7d3e82, 0xb73fb006, 0xb379c6c6, 0x7b9acc35, 0x82d52cf4, 0x92335854, 0xbc5b27bd, +0x7562530b, 0x09de8601, 0x00000000, 0xa0ffdd99, 0x9e71d6d0, 0x5df64b98, 0x4674a883, 0x6c5aa1aa, 0xe5eb1ae5, 0x18e28ce4, 0xd59d8e92, 0x908949ee, 0x5c2c35dd, 0x915337ab, 0xf14b1885, 0xb019a939, 0x84294b8e, 0x31acea32, 0xc61b95cd, 0x113c0ae5, +0xffb387bb, 0xaa413467, 0x3c341af3, 0xbf3b4842, 0x38726c33, 0x27b6f9e8, 0x87492471, 0x250ce852, 0xa603bae3, 0x673e3611, 0x39a81276, 0xdabf6fe9, 0x74b82d4e, 0xa563d51c, 0x81b5430b, 0xd1dbf852, 0x637840d1, 0xf50d6e45, 0x681cd76a, 0xcd7f0276, +0x8e97a270, 0xd8057e53, 0xcb83650c, 0xe7510b5f, 0xd7279f28, 0x530ed4a6, 0xb1c3d77c, 0x96752e94, 0x51b4c51c, 0xcfc513cc, 0x5e962467, 0xb81d517d, 0xb9c72f38, 0x8df7cd8f, 0x59b03d58, 0x5692dc23, 0x60182f2e, 0x89b1bb4f, 0x69c6a92f, 0x72444a34, +0x4152b1bc, 0x0b6497bb, 0x6ee0b010, 0x3f54750c, 0x55f2b3dc, 0x7cbcd50a, 0xafdd3ce2, 0x044676c0, 0x1938f2a1, 0xc4a18477, 0x43e8a006, 0x2bf4776c, 0x4088cff9, 0x30769477, 0x0726193f, 0xf7b77fff, 0x886bc50a, 0xa8fb25dd, 0xdc430893, 0x125c651a, +0x61c2516b, 0x495649f8, 0x7a40b270, 0xc7c1eb88, 0x35ea9cf2, 0xca591b49, 0x830f52b1, 0x37508d48, 0x14a00260, 0x4d103f38, 0x157a7c25, 0x488c37bd, 0x988db1aa, 0x93e92611, 0x5748a266, 0x52d4aae3, 0x76023cf4, 0xfd099601, 0x4faa2e82, 0xf09166c0, +0xdf23676c, 0xfbf5f17b, 0xec359ce4, 0xacbd531d, 0xad672d58, 0x2090e0d7, 0x8b0baaf5, 0x47aed6c6, 0x1fc495db, 0xc0e7f2b7, 0xc13d8cf2, 0xd0018617, 0x1d7e8461, 0xf66d01ba, 0x6d80dfef, 0x222af16d, 0x214a9e92, 0xb6e5ce43, 0xb2a3b883, 0x03606fff, +0x97af50d1, 0x658427ab, 0x4514c77c, 0xd447f0d7, 0x294e66d6, 0xfa2f8f3e, 0xfcd3e844, 0x0abee9fe, 0xf4d71000, 0x1e1eeb9e, 0xe68b751a, 0x586a431d, 0x0804f844, 0x66e44854, 0x9faba895, 0xae0742a7, 0xd6fde16d, 0x2d081016, 0x01da7e45, 0x5b0a2ce2, +0xd2bb97ad, 0x739e3471, 0xab9b4a22, 0xe873ea24, 0xa125a3dc, 0x3dee64b6, 0x4232de43, 0x712425cb, 0xd361e9e8, 0x2fb201ac, 0xf8959e84, 0xb585a1bc, 0x9957cfef, 0xb45fdff9, 0x806f3d4e, 0x28941893, 0x3b1203cc, 0x7d66ab4f, 0xeac9fb9e, 0x3430e2b7, +0xdef91929, 0xe2cd03da, 0x9a37a010, 0x6b7cb895, 0xa245cc23, 0x8ad1d4b0, 0xbaa740c7, 0xc93974b6, 0x266c87ad, 0x4cca417d, 0x4bec5842, 0x2e687fe9, 0x645e59ee, 0xc3879d48, 0x0f22e17b, 0x32cc85cd, 0x506ebb59, 0xa39fb266, 0x6aa6c6d0, 0x7e06c4b0, +0xe9a99461, 0x9d11b92f, 0x24d69617, 0x70fe5b8e, 0x9ccbc76a, 0xbee13607, 0x0d98f0c1, 0x2cd26e53, 0xcca57c33, 0x059c0885, 0xa4b9ab59, 0x02ba11ba, 0x9bedde55, 0x86935a34, 0xa7d9c4a6, 0xf94fe0c1, 0x4e7050c7, 0x85f335cb, 0x3316fb88, 0x77d842b1, +0x23f08f28, 0x5ad052a7, 0x161a13da, 0x1b82e31b, 0xc8e30af3, 0x2a2e0929, 0x94cf3f2e, 0xe1ad6c25, 0xdb6511ac, 0xbd8159f8, 0x9515416b, 0xedefe2a1, 0xef55f31b, 0x7fdcbaf5, 0xeb1385db, 0x0ef89f3e, 0x5f4c5a22, 0x3e8e0b49, 0xfe69f9fe, 0xe43164a0, +0xfae2ae95, 0x301afea2, 0x1266fab1, 0xbc7abe6d, 0x658cc756, 0xb892e6dc, 0x75b27af7, 0x89b71e27, 0xff622599, 0xa8fb8e99, 0x55c1ec10, 0x9989a386, 0xdac6ed96, 0x678355a2, 0xed04df28, 0xf9d23a38, 0x2314d7ae, 0x7032f1fb, 0xcc484f96, 0x332a6a0f, +0x66bc53fb, 0x304d2b46, 0x9c09288a, 0x15be36ad, 0x89e0cbc3, 0xae4b9138, 0xa9c488c0, 0x88dfcd9a, 0x42279dad, 0x3242b9b2, 0x211b455a, 0x04e858b1, 0x723d630f, 0x8a878a8a, 0x02584710, 0xfc0564d0, 0xabcb1a34, 0xfbdda8cc, 0xef0b4ddc, 0x222bd1f7, +0x7682ee5a, 0xcf78db3b, 0xf985efdc, 0x34f2a613, 0xe9bb527d, 0x31722d1f, 0x3125f8fb, 0x9aeee2cf, 0x7355b0b2, 0xdf11b37e, 0x47a716a1, 0xaf234285, 0x4140dce4, 0xcf2f0edf, 0xe8845424, 0x636b0d13, 0xfb8a7d28, 0x1359fce8, 0x9c5efd6e, 0x9e06ba7e, +0x710df7a2, 0x98b6a5df, 0x26c38946, 0x5799ab00, 0x7065241f, 0x54a93fad, 0x8c37952b, 0xdf46669a, 0xebb4c089, 0x40280f59, 0xfd3a6289, 0xdd1e218a, 0x98e1703b, 0xba9d7428, 0x5016b2f8, 0xb9fa3561, 0x47f0c345, 0x469810f8, 0x26945ca2, 0x0057d5e4, +0x715a2246, 0x748d7cae, 0xad2cd071, 0x46cfc51c, 0x45ff51b1, 0x605b99be, 0x64e414eb, 0xdbf9ebcf, 0x3795e75a, 0xd9a1acdf, 0x8c6040cf, 0x8ad05f6e, 0x5219200c, 0x17b1a459, 0xde2eb527, 0x62540b4a, 0x61334a03, 0xe9ec8799, 0xfe0af624, 0xce47dd62, +0x35cda04a, 0x56a6ad59, 0x44c057e8, 0x36aae103, 0x14d6e510, 0x73026556, 0x6203deae, 0xfc52b134, 0x43189bf4, 0x17e671bd, 0x67d48046, 0x06b01fa1, 0xfe5d23c0, 0x57ce7ee4, 0xcbc7566e, 0x407fdabd, 0xab9ccfd0, 0xec3bd971, 0x25f31deb, 0xbd45b834, +0x1101bbf8, 0x15e9e349, 0x06e7ca45, 0x41170900, 0x726ab6eb, 0x2343024a, 0x75e5af13, 0x9b863172, 0x9e516f9a, 0x148130f4, 0x9f6e69c3, 0xde7960c3, 0xaaa3c989, 0xebe3156d, 0x05d75ee8, 0x9f39bc27, 0x517e6145, 0x07d8cc1c, 0x9ab9372b, 0xdc2127d3, +0x00000000, 0x4497820c, 0xee344b85, 0x77ea3de7, 0x61649fe7, 0xd8c97f62, 0x207396e7, 0xec6c0c95, 0x65db12b2, 0x9bd1e496, 0xbd126dd0, 0x214c90be, 0x54feea49, 0xc9c8c49a, 0xbbf5a795, 0x8e6fd23b, 0xf8ed3c61, 0xe8d381c0, 0xbacaa1cc, 0xcaf85037, +0x27fc8f1f, 0xee639e61, 0xcb90838a, 0x45a88455, 0x078f19f8, 0xc99f117e, 0x600c4c5a, 0x434f4e10, 0xb8c53338, 0x66eb861f, 0x524ef5e8, 0xa9935d24, 0xbc2d6b89, 0xa8ac5b7d, 0x249bce56, 0x5041671c, 0x633cd8f7, 0x20244303, 0x77bde803, 0x337dbfeb, +0xcaaf85d3, 0x16d977e4, 0x64b3c10f, 0x04bf8d55, 0xc8a01727, 0x8bef5937, 0x25a4c80f, 0x8d5f4696, 0xea8bc6d0, 0xce100886, 0x24cc1bb2, 0x8e3807df, 0x27ab5afb, 0xef5c9838, 0xfab57b71, 0x42704849, 0x03674149, 0x32156c56, 0xf8bae985, 0xaf749761, +0xae1c44dc, 0xbe752c99, 0x9d362ed3, 0xcd7749cf, 0x559639f4, 0xdc76f237, 0xcc1f9a72, 0x99de7662, 0xb9ade085, 0xac13d628, 0x168ea200, 0x36fd34e7, 0x34a573f7, 0xeadc1334, 0x5129b4a1, 0x53262655, 0xdd49f46e, 0x37c232be, 0x74daa94a, 0x56f178bd, +0xff35f07d, 0x9d61fb37, 0xbf1dff24, 0x8f50d462, 0xc8f7c2c3, 0x359a75ae, 0x05808b0c, 0x8888187e, 0x5371f3b1, 0xbf4a2ac0, 0x12312f55, 0x013f0659, 0xd89eaa86, 0xbba27271, 0x227c0413, 0xd9f6793b, 0x033094ad, 0x76d53bbe, 0x8bb88cd3, 0xfd6db76d, +0x020f92f4, 0x130e290c, 0xbe22f97d, 0xcd209c2b, 0xad7b0595, 0xed530acc, 0xda913872, 0x11566e1c, 0xac4403cc, 0x8d089372, 0x103ebda1, 0xaaf41c6d, 0x0168d3bd, 0xdbae3e2b, 0x10696845, 0x8f070186, ] + +d0x6a07e7c0=[ 0x00000000, 0x62e0349a, 0xda00c24c, 0xb8e0f6d6, 0xeea02904, 0x8c401d9e, 0x34a0eb48, 0x5640dfd2, 0x40b495a2, 0x2254a138, 0x9ab457ee, 0xf8546374, 0xae14bca6, 0xccf4883c, 0x74147eea, 0x16f44a70, 0xde9c14a6, 0xbc7c203c, 0x049cd6ea, 0x667ce270, +0x303c3da2, 0x52dc0938, 0xea3cffee, 0x88dccb74, 0x9e288104, 0xfcc8b59e, 0x44284348, 0x26c877d2, 0x7088a800, 0x12689c9a, 0xaa886a4c, 0xc8685ed6, 0x805a2fcb, 0xe2ba1b51, 0x5a5aed87, 0x38bad91d, 0x6efa06cf, 0x0c1a3255, 0xb4fac483, 0xd61af019, +0xc0eeba69, 0xa20e8ef3, 0x1aee7825, 0x780e4cbf, 0x2e4e936d, 0x4caea7f7, 0xf44e5121, 0x96ae65bb, 0x5ec63b6d, 0x3c260ff7, 0x84c6f921, 0xe626cdbb, 0xb0661269, 0xd28626f3, 0x6a66d025, 0x0886e4bf, 0x1e72aecf, 0x7c929a55, 0xc4726c83, 0xa6925819, +0xf0d287cb, 0x9232b351, 0x2ad24587, 0x4832711d, 0xe60696c4, 0x84e6a25e, 0x3c065488, 0x5ee66012, 0x08a6bfc0, 0x6a468b5a, 0xd2a67d8c, 0xb0464916, 0xa6b20366, 0xc45237fc, 0x7cb2c12a, 0x1e52f5b0, 0x48122a62, 0x2af21ef8, 0x9212e82e, 0xf0f2dcb4, +0x389a8262, 0x5a7ab6f8, 0xe29a402e, 0x807a74b4, 0xd63aab66, 0xb4da9ffc, 0x0c3a692a, 0x6eda5db0, 0x782e17c0, 0x1ace235a, 0xa22ed58c, 0xc0cee116, 0x968e3ec4, 0xf46e0a5e, 0x4c8efc88, 0x2e6ec812, 0x665cb90f, 0x04bc8d95, 0xbc5c7b43, 0xdebc4fd9, +0x88fc900b, 0xea1ca491, 0x52fc5247, 0x301c66dd, 0x26e82cad, 0x44081837, 0xfce8eee1, 0x9e08da7b, 0xc84805a9, 0xaaa83133, 0x1248c7e5, 0x70a8f37f, 0xb8c0ada9, 0xda209933, 0x62c06fe5, 0x00205b7f, 0x566084ad, 0x3480b037, 0x8c6046e1, 0xee80727b, +0xf874380b, 0x9a940c91, 0x2274fa47, 0x4094cedd, 0x16d4110f, 0x74342595, 0xccd4d343, 0xae34e7d9, 0x45b21fd9, 0x27522b43, 0x9fb2dd95, 0xfd52e90f, 0xab1236dd, 0xc9f20247, 0x7112f491, 0x13f2c00b, 0x05068a7b, 0x67e6bee1, 0xdf064837, 0xbde67cad, +0xeba6a37f, 0x894697e5, 0x31a66133, 0x534655a9, 0x9b2e0b7f, 0xf9ce3fe5, 0x412ec933, 0x23cefda9, 0x758e227b, 0x176e16e1, 0xaf8ee037, 0xcd6ed4ad, 0xdb9a9edd, 0xb97aaa47, 0x019a5c91, 0x637a680b, 0x353ab7d9, 0x57da8343, 0xef3a7595, 0x8dda410f, +0xc5e83012, 0xa7080488, 0x1fe8f25e, 0x7d08c6c4, 0x2b481916, 0x49a82d8c, 0xf148db5a, 0x93a8efc0, 0x855ca5b0, 0xe7bc912a, 0x5f5c67fc, 0x3dbc5366, 0x6bfc8cb4, 0x091cb82e, 0xb1fc4ef8, 0xd31c7a62, 0x1b7424b4, 0x7994102e, 0xc174e6f8, 0xa394d262, +0xf5d40db0, 0x9734392a, 0x2fd4cffc, 0x4d34fb66, 0x5bc0b116, 0x3920858c, 0x81c0735a, 0xe32047c0, 0xb5609812, 0xd780ac88, 0x6f605a5e, 0x0d806ec4, 0xa3b4891d, 0xc154bd87, 0x79b44b51, 0x1b547fcb, 0x4d14a019, 0x2ff49483, 0x97146255, 0xf5f456cf, +0xe3001cbf, 0x81e02825, 0x3900def3, 0x5be0ea69, 0x0da035bb, 0x6f400121, 0xd7a0f7f7, 0xb540c36d, 0x7d289dbb, 0x1fc8a921, 0xa7285ff7, 0xc5c86b6d, 0x9388b4bf, 0xf1688025, 0x498876f3, 0x2b684269, 0x3d9c0819, 0x5f7c3c83, 0xe79cca55, 0x857cfecf, +0xd33c211d, 0xb1dc1587, 0x093ce351, 0x6bdcd7cb, 0x23eea6d6, 0x410e924c, 0xf9ee649a, 0x9b0e5000, 0xcd4e8fd2, 0xafaebb48, 0x174e4d9e, 0x75ae7904, 0x635a3374, 0x01ba07ee, 0xb95af138, 0xdbbac5a2, 0x8dfa1a70, 0xef1a2eea, 0x57fad83c, 0x351aeca6, +0xfd72b270, 0x9f9286ea, 0x2772703c, 0x459244a6, 0x13d29b74, 0x7132afee, 0xc9d25938, 0xab326da2, 0xbdc627d2, 0xdf261348, 0x67c6e59e, 0x0526d104, 0x53660ed6, 0x31863a4c, 0x8966cc9a, 0xeb86f800, 0x00000000, 0x6bee8196, 0xbe993937, 0xd577b8a1, +0x7ca962f4, 0x1747e362, 0xc2305bc3, 0xa9deda55, 0xc51873bf, 0xaef6f229, 0x7b814a88, 0x106fcb1e, 0xb9b1114b, 0xd25f90dd, 0x0728287c, 0x6cc6a9ea, 0x1b66cefe, 0x70884f68, 0xa5fff7c9, 0xce11765f, 0x67cfac0a, 0x0c212d9c, 0xd956953d, 0xb2b814ab, +0xde7ebd41, 0xb5903cd7, 0x60e78476, 0x0b0905e0, 0xa2d7dfb5, 0xc9395e23, 0x1c4ee682, 0x77a06714, 0xe7c65969, 0x8c28d8ff, 0x595f605e, 0x32b1e1c8, 0x9b6f3b9d, 0xf081ba0b, 0x25f602aa, 0x4e18833c, 0x22de2ad6, 0x4930ab40, 0x9c4713e1, 0xf7a99277, +0x5e774822, 0x3599c9b4, 0xe0ee7115, 0x8b00f083, 0xfca09797, 0x974e1601, 0x4239aea0, 0x29d72f36, 0x8009f563, 0xebe774f5, 0x3e90cc54, 0x557e4dc2, 0x39b8e428, 0x525665be, 0x8721dd1f, 0xeccf5c89, 0x451186dc, 0x2eff074a, 0xfb88bfeb, 0x90663e7d, +0xdbdbe4aa, 0xb035653c, 0x6542dd9d, 0x0eac5c0b, 0xa772865e, 0xcc9c07c8, 0x19ebbf69, 0x72053eff, 0x1ec39715, 0x752d1683, 0xa05aae22, 0xcbb42fb4, 0x626af5e1, 0x09847477, 0xdcf3ccd6, 0xb71d4d40, 0xc0bd2a54, 0xab53abc2, 0x7e241363, 0x15ca92f5, +0xbc1448a0, 0xd7fac936, 0x028d7197, 0x6963f001, 0x05a559eb, 0x6e4bd87d, 0xbb3c60dc, 0xd0d2e14a, 0x790c3b1f, 0x12e2ba89, 0xc7950228, 0xac7b83be, 0x3c1dbdc3, 0x57f33c55, 0x828484f4, 0xe96a0562, 0x40b4df37, 0x2b5a5ea1, 0xfe2de600, 0x95c36796, +0xf905ce7c, 0x92eb4fea, 0x479cf74b, 0x2c7276dd, 0x85acac88, 0xee422d1e, 0x3b3595bf, 0x50db1429, 0x277b733d, 0x4c95f2ab, 0x99e24a0a, 0xf20ccb9c, 0x5bd211c9, 0x303c905f, 0xe54b28fe, 0x8ea5a968, 0xe2630082, 0x898d8114, 0x5cfa39b5, 0x3714b823, +0x9eca6276, 0xf524e3e0, 0x20535b41, 0x4bbddad7, 0x36be41fd, 0x5d50c06b, 0x882778ca, 0xe3c9f95c, 0x4a172309, 0x21f9a29f, 0xf48e1a3e, 0x9f609ba8, 0xf3a63242, 0x9848b3d4, 0x4d3f0b75, 0x26d18ae3, 0x8f0f50b6, 0xe4e1d120, 0x31966981, 0x5a78e817, +0x2dd88f03, 0x46360e95, 0x9341b634, 0xf8af37a2, 0x5171edf7, 0x3a9f6c61, 0xefe8d4c0, 0x84065556, 0xe8c0fcbc, 0x832e7d2a, 0x5659c58b, 0x3db7441d, 0x94699e48, 0xff871fde, 0x2af0a77f, 0x411e26e9, 0xd1781894, 0xba969902, 0x6fe121a3, 0x040fa035, +0xadd17a60, 0xc63ffbf6, 0x13484357, 0x78a6c2c1, 0x14606b2b, 0x7f8eeabd, 0xaaf9521c, 0xc117d38a, 0x68c909df, 0x03278849, 0xd65030e8, 0xbdbeb17e, 0xca1ed66a, 0xa1f057fc, 0x7487ef5d, 0x1f696ecb, 0xb6b7b49e, 0xdd593508, 0x082e8da9, 0x63c00c3f, +0x0f06a5d5, 0x64e82443, 0xb19f9ce2, 0xda711d74, 0x73afc721, 0x184146b7, 0xcd36fe16, 0xa6d87f80, 0xed65a557, 0x868b24c1, 0x53fc9c60, 0x38121df6, 0x91ccc7a3, 0xfa224635, 0x2f55fe94, 0x44bb7f02, 0x287dd6e8, 0x4393577e, 0x96e4efdf, 0xfd0a6e49, +0x54d4b41c, 0x3f3a358a, 0xea4d8d2b, 0x81a30cbd, 0xf6036ba9, 0x9dedea3f, 0x489a529e, 0x2374d308, 0x8aaa095d, 0xe14488cb, 0x3433306a, 0x5fddb1fc, 0x331b1816, 0x58f59980, 0x8d822121, 0xe66ca0b7, 0x4fb27ae2, 0x245cfb74, 0xf12b43d5, 0x9ac5c243, +0x0aa3fc3e, 0x614d7da8, 0xb43ac509, 0xdfd4449f, 0x760a9eca, 0x1de41f5c, 0xc893a7fd, 0xa37d266b, 0xcfbb8f81, 0xa4550e17, 0x7122b6b6, 0x1acc3720, 0xb312ed75, 0xd8fc6ce3, 0x0d8bd442, 0x666555d4, 0x11c532c0, 0x7a2bb356, 0xaf5c0bf7, 0xc4b28a61, +0x6d6c5034, 0x0682d1a2, 0xd3f56903, 0xb81be895, 0xd4dd417f, 0xbf33c0e9, 0x6a447848, 0x01aaf9de, 0xa874238b, 0xc39aa21d, 0x16ed1abc, 0x7d039b2a, 0x00000000, 0x076c5fee, 0xc15a25ae, 0xc6367a40, 0x1b3ab9b8, 0x1c56e656, 0xda609c16, 0xdd0cc3f8, +0xeef68a97, 0xe99ad579, 0x2facaf39, 0x28c0f0d7, 0xf5cc332f, 0xf2a06cc1, 0x34961681, 0x33fa496f, 0x8908074a, 0x8e6458a4, 0x485222e4, 0x4f3e7d0a, 0x9232bef2, 0x955ee11c, 0x53689b5c, 0x5404c4b2, 0x67fe8ddd, 0x6092d233, 0xa6a4a873, 0xa1c8f79d, +0x7cc43465, 0x7ba86b8b, 0xbd9e11cb, 0xbaf24e25, 0x3993f6f8, 0x3effa916, 0xf8c9d356, 0xffa58cb8, 0x22a94f40, 0x25c510ae, 0xe3f36aee, 0xe49f3500, 0xd7657c6f, 0xd0092381, 0x163f59c1, 0x1153062f, 0xcc5fc5d7, 0xcb339a39, 0x0d05e079, 0x0a69bf97, +0xb09bf1b2, 0xb7f7ae5c, 0x71c1d41c, 0x76ad8bf2, 0xaba1480a, 0xaccd17e4, 0x6afb6da4, 0x6d97324a, 0x5e6d7b25, 0x590124cb, 0x9f375e8b, 0x985b0165, 0x4557c29d, 0x423b9d73, 0x840de733, 0x8361b8dd, 0x0e5d0e50, 0x093151be, 0xcf072bfe, 0xc86b7410, +0x1567b7e8, 0x120be806, 0xd43d9246, 0xd351cda8, 0xe0ab84c7, 0xe7c7db29, 0x21f1a169, 0x269dfe87, 0xfb913d7f, 0xfcfd6291, 0x3acb18d1, 0x3da7473f, 0x8755091a, 0x803956f4, 0x460f2cb4, 0x4163735a, 0x9c6fb0a2, 0x9b03ef4c, 0x5d35950c, 0x5a59cae2, +0x69a3838d, 0x6ecfdc63, 0xa8f9a623, 0xaf95f9cd, 0x72993a35, 0x75f565db, 0xb3c31f9b, 0xb4af4075, 0x37cef8a8, 0x30a2a746, 0xf694dd06, 0xf1f882e8, 0x2cf44110, 0x2b981efe, 0xedae64be, 0xeac23b50, 0xd938723f, 0xde542dd1, 0x18625791, 0x1f0e087f, +0xc202cb87, 0xc56e9469, 0x0358ee29, 0x0434b1c7, 0xbec6ffe2, 0xb9aaa00c, 0x7f9cda4c, 0x78f085a2, 0xa5fc465a, 0xa29019b4, 0x64a663f4, 0x63ca3c1a, 0x50307575, 0x575c2a9b, 0x916a50db, 0x96060f35, 0x4b0acccd, 0x4c669323, 0x8a50e963, 0x8d3cb68d, +0xb85421a9, 0xbf387e47, 0x790e0407, 0x7e625be9, 0xa36e9811, 0xa402c7ff, 0x6234bdbf, 0x6558e251, 0x56a2ab3e, 0x51cef4d0, 0x97f88e90, 0x9094d17e, 0x4d981286, 0x4af44d68, 0x8cc23728, 0x8bae68c6, 0x315c26e3, 0x3630790d, 0xf006034d, 0xf76a5ca3, +0x2a669f5b, 0x2d0ac0b5, 0xeb3cbaf5, 0xec50e51b, 0xdfaaac74, 0xd8c6f39a, 0x1ef089da, 0x199cd634, 0xc49015cc, 0xc3fc4a22, 0x05ca3062, 0x02a66f8c, 0x81c7d751, 0x86ab88bf, 0x409df2ff, 0x47f1ad11, 0x9afd6ee9, 0x9d913107, 0x5ba74b47, 0x5ccb14a9, +0x6f315dc6, 0x685d0228, 0xae6b7868, 0xa9072786, 0x740be47e, 0x7367bb90, 0xb551c1d0, 0xb23d9e3e, 0x08cfd01b, 0x0fa38ff5, 0xc995f5b5, 0xcef9aa5b, 0x13f569a3, 0x1499364d, 0xd2af4c0d, 0xd5c313e3, 0xe6395a8c, 0xe1550562, 0x27637f22, 0x200f20cc, +0xfd03e334, 0xfa6fbcda, 0x3c59c69a, 0x3b359974, 0xb6092ff9, 0xb1657017, 0x77530a57, 0x703f55b9, 0xad339641, 0xaa5fc9af, 0x6c69b3ef, 0x6b05ec01, 0x58ffa56e, 0x5f93fa80, 0x99a580c0, 0x9ec9df2e, 0x43c51cd6, 0x44a94338, 0x829f3978, 0x85f36696, +0x3f0128b3, 0x386d775d, 0xfe5b0d1d, 0xf93752f3, 0x243b910b, 0x2357cee5, 0xe561b4a5, 0xe20deb4b, 0xd1f7a224, 0xd69bfdca, 0x10ad878a, 0x17c1d864, 0xcacd1b9c, 0xcda14472, 0x0b973e32, 0x0cfb61dc, 0x8f9ad901, 0x88f686ef, 0x4ec0fcaf, 0x49aca341, +0x94a060b9, 0x93cc3f57, 0x55fa4517, 0x52961af9, 0x616c5396, 0x66000c78, 0xa0367638, 0xa75a29d6, 0x7a56ea2e, 0x7d3ab5c0, 0xbb0ccf80, 0xbc60906e, 0x0692de4b, 0x01fe81a5, 0xc7c8fbe5, 0xc0a4a40b, 0x1da867f3, 0x1ac4381d, 0xdcf2425d, 0xdb9e1db3, +0xe86454dc, 0xef080b32, 0x293e7172, 0x2e522e9c, 0xf35eed64, 0xf432b28a, 0x3204c8ca, 0x35689724, 0x00000000, 0x43e5c9ee, 0x2bfceedd, 0x68192733, 0xd858924e, 0x9bbd5ba0, 0xf3a47c93, 0xb041b57d, 0x88b2872a, 0xcb574ec4, 0xa34e69f7, 0xe0aba019, +0x50ea1564, 0x130fdc8a, 0x7b16fbb9, 0x38f33257, 0x1cbf780c, 0x5f5ab1e2, 0x374396d1, 0x74a65f3f, 0xc4e7ea42, 0x870223ac, 0xef1b049f, 0xacfecd71, 0x940dff26, 0xd7e836c8, 0xbff111fb, 0xfc14d815, 0x4c556d68, 0x0fb0a486, 0x67a983b5, 0x244c4a5b, +0xb8669421, 0xfb835dcf, 0x939a7afc, 0xd07fb312, 0x603e066f, 0x23dbcf81, 0x4bc2e8b2, 0x0827215c, 0x30d4130b, 0x7331dae5, 0x1b28fdd6, 0x58cd3438, 0xe88c8145, 0xab6948ab, 0xc3706f98, 0x8095a676, 0xa4d9ec2d, 0xe73c25c3, 0x8f2502f0, 0xccc0cb1e, +0x7c817e63, 0x3f64b78d, 0x577d90be, 0x14985950, 0x2c6b6b07, 0x6f8ea2e9, 0x079785da, 0x44724c34, 0xf433f949, 0xb7d630a7, 0xdfcf1794, 0x9c2ade7a, 0x07a74284, 0x44428b6a, 0x2c5bac59, 0x6fbe65b7, 0xdfffd0ca, 0x9c1a1924, 0xf4033e17, 0xb7e6f7f9, +0x8f15c5ae, 0xccf00c40, 0xa4e92b73, 0xe70ce29d, 0x574d57e0, 0x14a89e0e, 0x7cb1b93d, 0x3f5470d3, 0x1b183a88, 0x58fdf366, 0x30e4d455, 0x73011dbb, 0xc340a8c6, 0x80a56128, 0xe8bc461b, 0xab598ff5, 0x93aabda2, 0xd04f744c, 0xb856537f, 0xfbb39a91, +0x4bf22fec, 0x0817e602, 0x600ec131, 0x23eb08df, 0xbfc1d6a5, 0xfc241f4b, 0x943d3878, 0xd7d8f196, 0x679944eb, 0x247c8d05, 0x4c65aa36, 0x0f8063d8, 0x3773518f, 0x74969861, 0x1c8fbf52, 0x5f6a76bc, 0xef2bc3c1, 0xacce0a2f, 0xc4d72d1c, 0x8732e4f2, +0xa37eaea9, 0xe09b6747, 0x88824074, 0xcb67899a, 0x7b263ce7, 0x38c3f509, 0x50dad23a, 0x133f1bd4, 0x2bcc2983, 0x6829e06d, 0x0030c75e, 0x43d50eb0, 0xf394bbcd, 0xb0717223, 0xd8685510, 0x9b8d9cfe, 0xf85fda0c, 0xbbba13e2, 0xd3a334d1, 0x9046fd3f, +0x20074842, 0x63e281ac, 0x0bfba69f, 0x481e6f71, 0x70ed5d26, 0x330894c8, 0x5b11b3fb, 0x18f47a15, 0xa8b5cf68, 0xeb500686, 0x834921b5, 0xc0ace85b, 0xe4e0a200, 0xa7056bee, 0xcf1c4cdd, 0x8cf98533, 0x3cb8304e, 0x7f5df9a0, 0x1744de93, 0x54a1177d, +0x6c52252a, 0x2fb7ecc4, 0x47aecbf7, 0x044b0219, 0xb40ab764, 0xf7ef7e8a, 0x9ff659b9, 0xdc139057, 0x40394e2d, 0x03dc87c3, 0x6bc5a0f0, 0x2820691e, 0x9861dc63, 0xdb84158d, 0xb39d32be, 0xf078fb50, 0xc88bc907, 0x8b6e00e9, 0xe37727da, 0xa092ee34, +0x10d35b49, 0x533692a7, 0x3b2fb594, 0x78ca7c7a, 0x5c863621, 0x1f63ffcf, 0x777ad8fc, 0x349f1112, 0x84dea46f, 0xc73b6d81, 0xaf224ab2, 0xecc7835c, 0xd434b10b, 0x97d178e5, 0xffc85fd6, 0xbc2d9638, 0x0c6c2345, 0x4f89eaab, 0x2790cd98, 0x64750476, +0xfff89888, 0xbc1d5166, 0xd4047655, 0x97e1bfbb, 0x27a00ac6, 0x6445c328, 0x0c5ce41b, 0x4fb92df5, 0x774a1fa2, 0x34afd64c, 0x5cb6f17f, 0x1f533891, 0xaf128dec, 0xecf74402, 0x84ee6331, 0xc70baadf, 0xe347e084, 0xa0a2296a, 0xc8bb0e59, 0x8b5ec7b7, +0x3b1f72ca, 0x78fabb24, 0x10e39c17, 0x530655f9, 0x6bf567ae, 0x2810ae40, 0x40098973, 0x03ec409d, 0xb3adf5e0, 0xf0483c0e, 0x98511b3d, 0xdbb4d2d3, 0x479e0ca9, 0x047bc547, 0x6c62e274, 0x2f872b9a, 0x9fc69ee7, 0xdc235709, 0xb43a703a, 0xf7dfb9d4, +0xcf2c8b83, 0x8cc9426d, 0xe4d0655e, 0xa735acb0, 0x177419cd, 0x5491d023, 0x3c88f710, 0x7f6d3efe, 0x5b2174a5, 0x18c4bd4b, 0x70dd9a78, 0x33385396, 0x8379e6eb, 0xc09c2f05, 0xa8850836, 0xeb60c1d8, 0xd393f38f, 0x90763a61, 0xf86f1d52, 0xbb8ad4bc, +0x0bcb61c1, 0x482ea82f, 0x20378f1c, 0x63d246f2, 0x00000000, 0x7cd347c2, 0xe9a84b80, 0x957b0c42, 0x933b0b46, 0xefe84c84, 0x7a9340c6, 0x06400704, 0xd63097b2, 0xaae3d070, 0x3f98dc32, 0x434b9bf0, 0x450b9cf4, 0x39d8db36, 0xaca3d774, 0xd07090b6, +0xf1287367, 0x8dfb34a5, 0x188038e7, 0x64537f25, 0x62137821, 0x1ec03fe3, 0x8bbb33a1, 0xf7687463, 0x2718e4d5, 0x5bcba317, 0xceb0af55, 0xb263e897, 0xb423ef93, 0xc8f0a851, 0x5d8ba413, 0x2158e3d1, 0x1aa81caf, 0x667b5b6d, 0xf300572f, 0x8fd310ed, +0x899317e9, 0xf540502b, 0x603b5c69, 0x1ce81bab, 0xcc988b1d, 0xb04bccdf, 0x2530c09d, 0x59e3875f, 0x5fa3805b, 0x2370c799, 0xb60bcbdb, 0xcad88c19, 0xeb806fc8, 0x9753280a, 0x02282448, 0x7efb638a, 0x78bb648e, 0x0468234c, 0x91132f0e, 0xedc068cc, +0x3db0f87a, 0x4163bfb8, 0xd418b3fa, 0xa8cbf438, 0xae8bf33c, 0xd258b4fe, 0x4723b8bc, 0x3bf0ff7e, 0x7b6a846b, 0x07b9c3a9, 0x92c2cfeb, 0xee118829, 0xe8518f2d, 0x9482c8ef, 0x01f9c4ad, 0x7d2a836f, 0xad5a13d9, 0xd189541b, 0x44f25859, 0x38211f9b, +0x3e61189f, 0x42b25f5d, 0xd7c9531f, 0xab1a14dd, 0x8a42f70c, 0xf691b0ce, 0x63eabc8c, 0x1f39fb4e, 0x1979fc4a, 0x65aabb88, 0xf0d1b7ca, 0x8c02f008, 0x5c7260be, 0x20a1277c, 0xb5da2b3e, 0xc9096cfc, 0xcf496bf8, 0xb39a2c3a, 0x26e12078, 0x5a3267ba, +0x61c298c4, 0x1d11df06, 0x886ad344, 0xf4b99486, 0xf2f99382, 0x8e2ad440, 0x1b51d802, 0x67829fc0, 0xb7f20f76, 0xcb2148b4, 0x5e5a44f6, 0x22890334, 0x24c90430, 0x581a43f2, 0xcd614fb0, 0xb1b20872, 0x90eaeba3, 0xec39ac61, 0x7942a023, 0x0591e7e1, +0x03d1e0e5, 0x7f02a727, 0xea79ab65, 0x96aaeca7, 0x46da7c11, 0x3a093bd3, 0xaf723791, 0xd3a17053, 0xd5e17757, 0xa9323095, 0x3c493cd7, 0x409a7b15, 0x54c97cc8, 0x281a3b0a, 0xbd613748, 0xc1b2708a, 0xc7f2778e, 0xbb21304c, 0x2e5a3c0e, 0x52897bcc, +0x82f9eb7a, 0xfe2aacb8, 0x6b51a0fa, 0x1782e738, 0x11c2e03c, 0x6d11a7fe, 0xf86aabbc, 0x84b9ec7e, 0xa5e10faf, 0xd932486d, 0x4c49442f, 0x309a03ed, 0x36da04e9, 0x4a09432b, 0xdf724f69, 0xa3a108ab, 0x73d1981d, 0x0f02dfdf, 0x9a79d39d, 0xe6aa945f, +0xe0ea935b, 0x9c39d499, 0x0942d8db, 0x75919f19, 0x4e616067, 0x32b227a5, 0xa7c92be7, 0xdb1a6c25, 0xdd5a6b21, 0xa1892ce3, 0x34f220a1, 0x48216763, 0x9851f7d5, 0xe482b017, 0x71f9bc55, 0x0d2afb97, 0x0b6afc93, 0x77b9bb51, 0xe2c2b713, 0x9e11f0d1, +0xbf491300, 0xc39a54c2, 0x56e15880, 0x2a321f42, 0x2c721846, 0x50a15f84, 0xc5da53c6, 0xb9091404, 0x697984b2, 0x15aac370, 0x80d1cf32, 0xfc0288f0, 0xfa428ff4, 0x8691c836, 0x13eac474, 0x6f3983b6, 0x2fa3f8a3, 0x5370bf61, 0xc60bb323, 0xbad8f4e1, +0xbc98f3e5, 0xc04bb427, 0x5530b865, 0x29e3ffa7, 0xf9936f11, 0x854028d3, 0x103b2491, 0x6ce86353, 0x6aa86457, 0x167b2395, 0x83002fd7, 0xffd36815, 0xde8b8bc4, 0xa258cc06, 0x3723c044, 0x4bf08786, 0x4db08082, 0x3163c740, 0xa418cb02, 0xd8cb8cc0, +0x08bb1c76, 0x74685bb4, 0xe11357f6, 0x9dc01034, 0x9b801730, 0xe75350f2, 0x72285cb0, 0x0efb1b72, 0x350be40c, 0x49d8a3ce, 0xdca3af8c, 0xa070e84e, 0xa630ef4a, 0xdae3a888, 0x4f98a4ca, 0x334be308, 0xe33b73be, 0x9fe8347c, 0x0a93383e, 0x76407ffc, +0x700078f8, 0x0cd33f3a, 0x99a83378, 0xe57b74ba, 0xc423976b, 0xb8f0d0a9, 0x2d8bdceb, 0x51589b29, 0x57189c2d, 0x2bcbdbef, 0xbeb0d7ad, 0xc263906f, 0x121300d9, 0x6ec0471b, 0xfbbb4b59, 0x87680c9b, 0x81280b9f, 0xfdfb4c5d, 0x6880401f, 0x145307dd, +0x00000000, 0x32d8591a, 0x51734408, 0x63ab1d12, 0xccb968b6, 0xfe6131ac, 0x9dca2cbe, 0xaf1275a4, 0x65b8d08d, 0x57608997, 0x34cb9485, 0x0613cd9f, 0xa901b83b, 0x9bd9e121, 0xf872fc33, 0xcaaaa529, 0x26e89b3c, 0x1430c226, 0x779bdf34, 0x4543862e, +0xea51f38a, 0xd889aa90, 0xbb22b782, 0x89faee98, 0x43504bb1, 0x718812ab, 0x12230fb9, 0x20fb56a3, 0x8fe92307, 0xbd317a1d, 0xde9a670f, 0xec423e15, 0x12468476, 0x209edd6c, 0x4335c07e, 0x71ed9964, 0xdeffecc0, 0xec27b5da, 0x8f8ca8c8, 0xbd54f1d2, +0x77fe54fb, 0x45260de1, 0x268d10f3, 0x145549e9, 0xbb473c4d, 0x899f6557, 0xea347845, 0xd8ec215f, 0x34ae1f4a, 0x06764650, 0x65dd5b42, 0x57050258, 0xf81777fc, 0xcacf2ee6, 0xa96433f4, 0x9bbc6aee, 0x5116cfc7, 0x63ce96dd, 0x00658bcf, 0x32bdd2d5, +0x9dafa771, 0xaf77fe6b, 0xccdce379, 0xfe04ba63, 0x9d16f92b, 0xafcea031, 0xcc65bd23, 0xfebde439, 0x51af919d, 0x6377c887, 0x00dcd595, 0x32048c8f, 0xf8ae29a6, 0xca7670bc, 0xa9dd6dae, 0x9b0534b4, 0x34174110, 0x06cf180a, 0x65640518, 0x57bc5c02, +0xbbfe6217, 0x89263b0d, 0xea8d261f, 0xd8557f05, 0x77470aa1, 0x459f53bb, 0x26344ea9, 0x14ec17b3, 0xde46b29a, 0xec9eeb80, 0x8f35f692, 0xbdedaf88, 0x12ffda2c, 0x20278336, 0x438c9e24, 0x7154c73e, 0x8f507d5d, 0xbd882447, 0xde233955, 0xecfb604f, +0x43e915eb, 0x71314cf1, 0x129a51e3, 0x204208f9, 0xeae8add0, 0xd830f4ca, 0xbb9be9d8, 0x8943b0c2, 0x2651c566, 0x14899c7c, 0x7722816e, 0x45fad874, 0xa9b8e661, 0x9b60bf7b, 0xf8cba269, 0xca13fb73, 0x65018ed7, 0x57d9d7cd, 0x3472cadf, 0x06aa93c5, +0xcc0036ec, 0xfed86ff6, 0x9d7372e4, 0xafab2bfe, 0x00b95e5a, 0x32610740, 0x51ca1a52, 0x63124348, 0xb621eafc, 0x84f9b3e6, 0xe752aef4, 0xd58af7ee, 0x7a98824a, 0x4840db50, 0x2bebc642, 0x19339f58, 0xd3993a71, 0xe141636b, 0x82ea7e79, 0xb0322763, +0x1f2052c7, 0x2df80bdd, 0x4e5316cf, 0x7c8b4fd5, 0x90c971c0, 0xa21128da, 0xc1ba35c8, 0xf3626cd2, 0x5c701976, 0x6ea8406c, 0x0d035d7e, 0x3fdb0464, 0xf571a14d, 0xc7a9f857, 0xa402e545, 0x96dabc5f, 0x39c8c9fb, 0x0b1090e1, 0x68bb8df3, 0x5a63d4e9, +0xa4676e8a, 0x96bf3790, 0xf5142a82, 0xc7cc7398, 0x68de063c, 0x5a065f26, 0x39ad4234, 0x0b751b2e, 0xc1dfbe07, 0xf307e71d, 0x90acfa0f, 0xa274a315, 0x0d66d6b1, 0x3fbe8fab, 0x5c1592b9, 0x6ecdcba3, 0x828ff5b6, 0xb057acac, 0xd3fcb1be, 0xe124e8a4, +0x4e369d00, 0x7ceec41a, 0x1f45d908, 0x2d9d8012, 0xe737253b, 0xd5ef7c21, 0xb6446133, 0x849c3829, 0x2b8e4d8d, 0x19561497, 0x7afd0985, 0x4825509f, 0x2b3713d7, 0x19ef4acd, 0x7a4457df, 0x489c0ec5, 0xe78e7b61, 0xd556227b, 0xb6fd3f69, 0x84256673, +0x4e8fc35a, 0x7c579a40, 0x1ffc8752, 0x2d24de48, 0x8236abec, 0xb0eef2f6, 0xd345efe4, 0xe19db6fe, 0x0ddf88eb, 0x3f07d1f1, 0x5caccce3, 0x6e7495f9, 0xc166e05d, 0xf3beb947, 0x9015a455, 0xa2cdfd4f, 0x68675866, 0x5abf017c, 0x39141c6e, 0x0bcc4574, +0xa4de30d0, 0x960669ca, 0xf5ad74d8, 0xc7752dc2, 0x397197a1, 0x0ba9cebb, 0x6802d3a9, 0x5ada8ab3, 0xf5c8ff17, 0xc710a60d, 0xa4bbbb1f, 0x9663e205, 0x5cc9472c, 0x6e111e36, 0x0dba0324, 0x3f625a3e, 0x90702f9a, 0xa2a87680, 0xc1036b92, 0xf3db3288, +0x1f990c9d, 0x2d415587, 0x4eea4895, 0x7c32118f, 0xd320642b, 0xe1f83d31, 0x82532023, 0xb08b7939, 0x7a21dc10, 0x48f9850a, 0x2b529818, 0x198ac102, 0xb698b4a6, 0x8440edbc, 0xe7ebf0ae, 0xd533a9b4, 0x00000000, 0x48c28de9, 0x5c9f7ebb, 0x145df352, +0x193fd1a5, 0x51fd5c4c, 0x45a0af1e, 0x0d6222f7, 0xf67f1e4c, 0xbebd93a5, 0xaae060f7, 0xe222ed1e, 0xef40cfe9, 0xa7824200, 0xb3dfb152, 0xfb1d3cbb, 0xc14860cc, 0x898aed25, 0x9dd71e77, 0xd515939e, 0xd877b169, 0x90b53c80, 0x84e8cfd2, 0xcc2a423b, +0x37377e80, 0x7ff5f369, 0x6ba8003b, 0x236a8dd2, 0x2e08af25, 0x66ca22cc, 0x7297d19e, 0x3a555c77, 0x82086598, 0xcacae871, 0xde971b23, 0x965596ca, 0x9b37b43d, 0xd3f539d4, 0xc7a8ca86, 0x8f6a476f, 0x74777bd4, 0x3cb5f63d, 0x28e8056f, 0x602a8886, +0x6d48aa71, 0x258a2798, 0x31d7d4ca, 0x79155923, 0x43400554, 0x0b8288bd, 0x1fdf7bef, 0x571df606, 0x5a7fd4f1, 0x12bd5918, 0x06e0aa4a, 0x4e2227a3, 0xb53f1b18, 0xfdfd96f1, 0xe9a065a3, 0xa162e84a, 0xac00cabd, 0xe4c24754, 0xf09fb406, 0xb85d39ef, +0x64b16bfd, 0x2c73e614, 0x382e1546, 0x70ec98af, 0x7d8eba58, 0x354c37b1, 0x2111c4e3, 0x69d3490a, 0x92ce75b1, 0xda0cf858, 0xce510b0a, 0x869386e3, 0x8bf1a414, 0xc33329fd, 0xd76edaaf, 0x9fac5746, 0xa5f90b31, 0xed3b86d8, 0xf966758a, 0xb1a4f863, +0xbcc6da94, 0xf404577d, 0xe059a42f, 0xa89b29c6, 0x5386157d, 0x1b449894, 0x0f196bc6, 0x47dbe62f, 0x4ab9c4d8, 0x027b4931, 0x1626ba63, 0x5ee4378a, 0xe6b90e65, 0xae7b838c, 0xba2670de, 0xf2e4fd37, 0xff86dfc0, 0xb7445229, 0xa319a17b, 0xebdb2c92, +0x10c61029, 0x58049dc0, 0x4c596e92, 0x049be37b, 0x09f9c18c, 0x413b4c65, 0x5566bf37, 0x1da432de, 0x27f16ea9, 0x6f33e340, 0x7b6e1012, 0x33ac9dfb, 0x3ecebf0c, 0x760c32e5, 0x6251c1b7, 0x2a934c5e, 0xd18e70e5, 0x994cfd0c, 0x8d110e5e, 0xc5d383b7, +0xc8b1a140, 0x80732ca9, 0x942edffb, 0xdcec5212, 0xb7ee92e8, 0xff2c1f01, 0xeb71ec53, 0xa3b361ba, 0xaed1434d, 0xe613cea4, 0xf24e3df6, 0xba8cb01f, 0x41918ca4, 0x0953014d, 0x1d0ef21f, 0x55cc7ff6, 0x58ae5d01, 0x106cd0e8, 0x043123ba, 0x4cf3ae53, +0x76a6f224, 0x3e647fcd, 0x2a398c9f, 0x62fb0176, 0x6f992381, 0x275bae68, 0x33065d3a, 0x7bc4d0d3, 0x80d9ec68, 0xc81b6181, 0xdc4692d3, 0x94841f3a, 0x99e63dcd, 0xd124b024, 0xc5794376, 0x8dbbce9f, 0x35e6f770, 0x7d247a99, 0x697989cb, 0x21bb0422, +0x2cd926d5, 0x641bab3c, 0x7046586e, 0x3884d587, 0xc399e93c, 0x8b5b64d5, 0x9f069787, 0xd7c41a6e, 0xdaa63899, 0x9264b570, 0x86394622, 0xcefbcbcb, 0xf4ae97bc, 0xbc6c1a55, 0xa831e907, 0xe0f364ee, 0xed914619, 0xa553cbf0, 0xb10e38a2, 0xf9ccb54b, +0x02d189f0, 0x4a130419, 0x5e4ef74b, 0x168c7aa2, 0x1bee5855, 0x532cd5bc, 0x477126ee, 0x0fb3ab07, 0xd35ff915, 0x9b9d74fc, 0x8fc087ae, 0xc7020a47, 0xca6028b0, 0x82a2a559, 0x96ff560b, 0xde3ddbe2, 0x2520e759, 0x6de26ab0, 0x79bf99e2, 0x317d140b, +0x3c1f36fc, 0x74ddbb15, 0x60804847, 0x2842c5ae, 0x121799d9, 0x5ad51430, 0x4e88e762, 0x064a6a8b, 0x0b28487c, 0x43eac595, 0x57b736c7, 0x1f75bb2e, 0xe4688795, 0xacaa0a7c, 0xb8f7f92e, 0xf03574c7, 0xfd575630, 0xb595dbd9, 0xa1c8288b, 0xe90aa562, +0x51579c8d, 0x19951164, 0x0dc8e236, 0x450a6fdf, 0x48684d28, 0x00aac0c1, 0x14f73393, 0x5c35be7a, 0xa72882c1, 0xefea0f28, 0xfbb7fc7a, 0xb3757193, 0xbe175364, 0xf6d5de8d, 0xe2882ddf, 0xaa4aa036, 0x901ffc41, 0xd8dd71a8, 0xcc8082fa, 0x84420f13, +0x89202de4, 0xc1e2a00d, 0xd5bf535f, 0x9d7ddeb6, 0x6660e20d, 0x2ea26fe4, 0x3aff9cb6, 0x723d115f, 0x7f5f33a8, 0x379dbe41, 0x23c04d13, 0x6b02c0fa, 0x00000000, 0xd54e878e, 0x91d4e87c, 0x449a6ff2, 0x8ef1e4f6, 0x5bbf6378, 0x1f250c8a, 0xca6b8b04, +0x8e672d0e, 0x5b29aa80, 0x1fb3c572, 0xcafd42fc, 0x0096c9f8, 0xd5d84e76, 0x91422184, 0x440ca60a, 0x7a1efa9d, 0xaf507d13, 0xebca12e1, 0x3e84956f, 0xf4ef1e6b, 0x21a199e5, 0x653bf617, 0xb0757199, 0xf479d793, 0x2137501d, 0x65ad3fef, 0xb0e3b861, +0x7a883365, 0xafc6b4eb, 0xeb5cdb19, 0x3e125c97, 0xbfeb1bcf, 0x6aa59c41, 0x2e3ff3b3, 0xfb71743d, 0x311aff39, 0xe45478b7, 0xa0ce1745, 0x758090cb, 0x318c36c1, 0xe4c2b14f, 0xa058debd, 0x75165933, 0xbf7dd237, 0x6a3355b9, 0x2ea93a4b, 0xfbe7bdc5, +0xc5f5e152, 0x10bb66dc, 0x5421092e, 0x816f8ea0, 0x4b0405a4, 0x9e4a822a, 0xdad0edd8, 0x0f9e6a56, 0x4b92cc5c, 0x9edc4bd2, 0xda462420, 0x0f08a3ae, 0xc56328aa, 0x102daf24, 0x54b7c0d6, 0x81f94758, 0xe1ef60ce, 0x34a1e740, 0x703b88b2, 0xa5750f3c, +0x6f1e8438, 0xba5003b6, 0xfeca6c44, 0x2b84ebca, 0x6f884dc0, 0xbac6ca4e, 0xfe5ca5bc, 0x2b122232, 0xe179a936, 0x34372eb8, 0x70ad414a, 0xa5e3c6c4, 0x9bf19a53, 0x4ebf1ddd, 0x0a25722f, 0xdf6bf5a1, 0x15007ea5, 0xc04ef92b, 0x84d496d9, 0x519a1157, +0x1596b75d, 0xc0d830d3, 0x84425f21, 0x510cd8af, 0x9b6753ab, 0x4e29d425, 0x0ab3bbd7, 0xdffd3c59, 0x5e047b01, 0x8b4afc8f, 0xcfd0937d, 0x1a9e14f3, 0xd0f59ff7, 0x05bb1879, 0x4121778b, 0x946ff005, 0xd063560f, 0x052dd181, 0x41b7be73, 0x94f939fd, +0x5e92b2f9, 0x8bdc3577, 0xcf465a85, 0x1a08dd0b, 0x241a819c, 0xf1540612, 0xb5ce69e0, 0x6080ee6e, 0xaaeb656a, 0x7fa5e2e4, 0x3b3f8d16, 0xee710a98, 0xaa7dac92, 0x7f332b1c, 0x3ba944ee, 0xeee7c360, 0x248c4864, 0xf1c2cfea, 0xb558a018, 0x60162796, +0xf3f617ae, 0x26b89020, 0x6222ffd2, 0xb76c785c, 0x7d07f358, 0xa84974d6, 0xecd31b24, 0x399d9caa, 0x7d913aa0, 0xa8dfbd2e, 0xec45d2dc, 0x390b5552, 0xf360de56, 0x262e59d8, 0x62b4362a, 0xb7fab1a4, 0x89e8ed33, 0x5ca66abd, 0x183c054f, 0xcd7282c1, +0x071909c5, 0xd2578e4b, 0x96cde1b9, 0x43836637, 0x078fc03d, 0xd2c147b3, 0x965b2841, 0x4315afcf, 0x897e24cb, 0x5c30a345, 0x18aaccb7, 0xcde44b39, 0x4c1d0c61, 0x99538bef, 0xddc9e41d, 0x08876393, 0xc2ece897, 0x17a26f19, 0x533800eb, 0x86768765, +0xc27a216f, 0x1734a6e1, 0x53aec913, 0x86e04e9d, 0x4c8bc599, 0x99c54217, 0xdd5f2de5, 0x0811aa6b, 0x3603f6fc, 0xe34d7172, 0xa7d71e80, 0x7299990e, 0xb8f2120a, 0x6dbc9584, 0x2926fa76, 0xfc687df8, 0xb864dbf2, 0x6d2a5c7c, 0x29b0338e, 0xfcfeb400, +0x36953f04, 0xe3dbb88a, 0xa741d778, 0x720f50f6, 0x12197760, 0xc757f0ee, 0x83cd9f1c, 0x56831892, 0x9ce89396, 0x49a61418, 0x0d3c7bea, 0xd872fc64, 0x9c7e5a6e, 0x4930dde0, 0x0daab212, 0xd8e4359c, 0x128fbe98, 0xc7c13916, 0x835b56e4, 0x5615d16a, +0x68078dfd, 0xbd490a73, 0xf9d36581, 0x2c9de20f, 0xe6f6690b, 0x33b8ee85, 0x77228177, 0xa26c06f9, 0xe660a0f3, 0x332e277d, 0x77b4488f, 0xa2facf01, 0x68914405, 0xbddfc38b, 0xf945ac79, 0x2c0b2bf7, 0xadf26caf, 0x78bceb21, 0x3c2684d3, 0xe968035d, +0x23038859, 0xf64d0fd7, 0xb2d76025, 0x6799e7ab, 0x239541a1, 0xf6dbc62f, 0xb241a9dd, 0x670f2e53, 0xad64a557, 0x782a22d9, 0x3cb04d2b, 0xe9fecaa5, 0xd7ec9632, 0x02a211bc, 0x46387e4e, 0x9376f9c0, 0x591d72c4, 0x8c53f54a, 0xc8c99ab8, 0x1d871d36, +0x598bbb3c, 0x8cc53cb2, 0xc85f5340, 0x1d11d4ce, 0xd77a5fca, 0x0234d844, 0x46aeb7b6, 0x93e03038, 0x00000000, 0x07911640, 0x5068ea44, 0x57f9fc04, 0x70a77130, 0x77366770, 0x20cf9b74, 0x275e8d34, 0xfa9f5e2d, 0xfd0e486d, 0xaaf7b469, 0xad66a229, +0x8a382f1d, 0x8da9395d, 0xda50c559, 0xddc1d319, 0x2b92cc50, 0x2c03da10, 0x7bfa2614, 0x7c6b3054, 0x5b35bd60, 0x5ca4ab20, 0x0b5d5724, 0x0ccc4164, 0xd10d927d, 0xd69c843d, 0x81657839, 0x86f46e79, 0xa1aae34d, 0xa63bf50d, 0xf1c20909, 0xf6531f49, +0x99c36aa9, 0x9e527ce9, 0xc9ab80ed, 0xce3a96ad, 0xe9641b99, 0xeef50dd9, 0xb90cf1dd, 0xbe9de79d, 0x635c3484, 0x64cd22c4, 0x3334dec0, 0x34a5c880, 0x13fb45b4, 0x146a53f4, 0x4393aff0, 0x4402b9b0, 0xb251a6f9, 0xb5c0b0b9, 0xe2394cbd, 0xe5a85afd, +0xc2f6d7c9, 0xc567c189, 0x929e3d8d, 0x950f2bcd, 0x48cef8d4, 0x4f5fee94, 0x18a61290, 0x1f3704d0, 0x386989e4, 0x3ff89fa4, 0x680163a0, 0x6f9075e0, 0x6ec1636e, 0x6950752e, 0x3ea9892a, 0x39389f6a, 0x1e66125e, 0x19f7041e, 0x4e0ef81a, 0x499fee5a, +0x945e3d43, 0x93cf2b03, 0xc436d707, 0xc3a7c147, 0xe4f94c73, 0xe3685a33, 0xb491a637, 0xb300b077, 0x4553af3e, 0x42c2b97e, 0x153b457a, 0x12aa533a, 0x35f4de0e, 0x3265c84e, 0x659c344a, 0x620d220a, 0xbfccf113, 0xb85de753, 0xefa41b57, 0xe8350d17, +0xcf6b8023, 0xc8fa9663, 0x9f036a67, 0x98927c27, 0xf70209c7, 0xf0931f87, 0xa76ae383, 0xa0fbf5c3, 0x87a578f7, 0x80346eb7, 0xd7cd92b3, 0xd05c84f3, 0x0d9d57ea, 0x0a0c41aa, 0x5df5bdae, 0x5a64abee, 0x7d3a26da, 0x7aab309a, 0x2d52cc9e, 0x2ac3dade, +0xdc90c597, 0xdb01d3d7, 0x8cf82fd3, 0x8b693993, 0xac37b4a7, 0xaba6a2e7, 0xfc5f5ee3, 0xfbce48a3, 0x260f9bba, 0x219e8dfa, 0x766771fe, 0x71f667be, 0x56a8ea8a, 0x5139fcca, 0x06c000ce, 0x0151168e, 0x16d3e3bd, 0x1142f5fd, 0x46bb09f9, 0x412a1fb9, +0x6674928d, 0x61e584cd, 0x361c78c9, 0x318d6e89, 0xec4cbd90, 0xebddabd0, 0xbc2457d4, 0xbbb54194, 0x9cebcca0, 0x9b7adae0, 0xcc8326e4, 0xcb1230a4, 0x3d412fed, 0x3ad039ad, 0x6d29c5a9, 0x6ab8d3e9, 0x4de65edd, 0x4a77489d, 0x1d8eb499, 0x1a1fa2d9, +0xc7de71c0, 0xc04f6780, 0x97b69b84, 0x90278dc4, 0xb77900f0, 0xb0e816b0, 0xe711eab4, 0xe080fcf4, 0x8f108914, 0x88819f54, 0xdf786350, 0xd8e97510, 0xffb7f824, 0xf826ee64, 0xafdf1260, 0xa84e0420, 0x758fd739, 0x721ec179, 0x25e73d7d, 0x22762b3d, +0x0528a609, 0x02b9b049, 0x55404c4d, 0x52d15a0d, 0xa4824544, 0xa3135304, 0xf4eaaf00, 0xf37bb940, 0xd4253474, 0xd3b42234, 0x844dde30, 0x83dcc870, 0x5e1d1b69, 0x598c0d29, 0x0e75f12d, 0x09e4e76d, 0x2eba6a59, 0x292b7c19, 0x7ed2801d, 0x7943965d, +0x781280d3, 0x7f839693, 0x287a6a97, 0x2feb7cd7, 0x08b5f1e3, 0x0f24e7a3, 0x58dd1ba7, 0x5f4c0de7, 0x828ddefe, 0x851cc8be, 0xd2e534ba, 0xd57422fa, 0xf22aafce, 0xf5bbb98e, 0xa242458a, 0xa5d353ca, 0x53804c83, 0x54115ac3, 0x03e8a6c7, 0x0479b087, +0x23273db3, 0x24b62bf3, 0x734fd7f7, 0x74dec1b7, 0xa91f12ae, 0xae8e04ee, 0xf977f8ea, 0xfee6eeaa, 0xd9b8639e, 0xde2975de, 0x89d089da, 0x8e419f9a, 0xe1d1ea7a, 0xe640fc3a, 0xb1b9003e, 0xb628167e, 0x91769b4a, 0x96e78d0a, 0xc11e710e, 0xc68f674e, +0x1b4eb457, 0x1cdfa217, 0x4b265e13, 0x4cb74853, 0x6be9c567, 0x6c78d327, 0x3b812f23, 0x3c103963, 0xca43262a, 0xcdd2306a, 0x9a2bcc6e, 0x9dbada2e, 0xbae4571a, 0xbd75415a, 0xea8cbd5e, 0xed1dab1e, 0x30dc7807, 0x374d6e47, 0x60b49243, 0x67258403, +0x407b0937, 0x47ea1f77, 0x1013e373, 0x1782f533, 0x00000000, 0xdd1ad8ab, 0xff4d772b, 0x2257af80, 0xa7f1edc3, 0x7aeb3568, 0x58bc9ae8, 0x85a64243, 0xac7d6fb8, 0x7167b713, 0x53301893, 0x8e2ac038, 0x0b8c827b, 0xd6965ad0, 0xf4c1f550, 0x29db2dfb, +0xdd341906, 0x002ec1ad, 0x22796e2d, 0xff63b686, 0x7ac5f4c5, 0xa7df2c6e, 0x858883ee, 0x58925b45, 0x714976be, 0xac53ae15, 0x8e040195, 0x531ed93e, 0xd6b89b7d, 0x0ba243d6, 0x29f5ec56, 0xf4ef34fd, 0xc611ae36, 0x1b0b769d, 0x395cd91d, 0xe44601b6, +0x61e043f5, 0xbcfa9b5e, 0x9ead34de, 0x43b7ec75, 0x6a6cc18e, 0xb7761925, 0x9521b6a5, 0x483b6e0e, 0xcd9d2c4d, 0x1087f4e6, 0x32d05b66, 0xefca83cd, 0x1b25b730, 0xc63f6f9b, 0xe468c01b, 0x397218b0, 0xbcd45af3, 0x61ce8258, 0x43992dd8, 0x9e83f573, +0xb758d888, 0x6a420023, 0x4815afa3, 0x950f7708, 0x10a9354b, 0xcdb3ede0, 0xefe44260, 0x32fe9acb, 0xe210b90f, 0x3f0a61a4, 0x1d5dce24, 0xc047168f, 0x45e154cc, 0x98fb8c67, 0xbaac23e7, 0x67b6fb4c, 0x4e6dd6b7, 0x93770e1c, 0xb120a19c, 0x6c3a7937, +0xe99c3b74, 0x3486e3df, 0x16d14c5f, 0xcbcb94f4, 0x3f24a009, 0xe23e78a2, 0xc069d722, 0x1d730f89, 0x98d54dca, 0x45cf9561, 0x67983ae1, 0xba82e24a, 0x9359cfb1, 0x4e43171a, 0x6c14b89a, 0xb10e6031, 0x34a82272, 0xe9b2fad9, 0xcbe55559, 0x16ff8df2, +0x24011739, 0xf91bcf92, 0xdb4c6012, 0x0656b8b9, 0x83f0fafa, 0x5eea2251, 0x7cbd8dd1, 0xa1a7557a, 0x887c7881, 0x5566a02a, 0x77310faa, 0xaa2bd701, 0x2f8d9542, 0xf2974de9, 0xd0c0e269, 0x0dda3ac2, 0xf9350e3f, 0x242fd694, 0x06787914, 0xdb62a1bf, +0x5ec4e3fc, 0x83de3b57, 0xa18994d7, 0x7c934c7c, 0x55486187, 0x8852b92c, 0xaa0516ac, 0x771fce07, 0xf2b98c44, 0x2fa354ef, 0x0df4fb6f, 0xd0ee23c4, 0x675c917b, 0xba4649d0, 0x9811e650, 0x450b3efb, 0xc0ad7cb8, 0x1db7a413, 0x3fe00b93, 0xe2fad338, +0xcb21fec3, 0x163b2668, 0x346c89e8, 0xe9765143, 0x6cd01300, 0xb1cacbab, 0x939d642b, 0x4e87bc80, 0xba68887d, 0x677250d6, 0x4525ff56, 0x983f27fd, 0x1d9965be, 0xc083bd15, 0xe2d41295, 0x3fceca3e, 0x1615e7c5, 0xcb0f3f6e, 0xe95890ee, 0x34424845, +0xb1e40a06, 0x6cfed2ad, 0x4ea97d2d, 0x93b3a586, 0xa14d3f4d, 0x7c57e7e6, 0x5e004866, 0x831a90cd, 0x06bcd28e, 0xdba60a25, 0xf9f1a5a5, 0x24eb7d0e, 0x0d3050f5, 0xd02a885e, 0xf27d27de, 0x2f67ff75, 0xaac1bd36, 0x77db659d, 0x558cca1d, 0x889612b6, +0x7c79264b, 0xa163fee0, 0x83345160, 0x5e2e89cb, 0xdb88cb88, 0x06921323, 0x24c5bca3, 0xf9df6408, 0xd00449f3, 0x0d1e9158, 0x2f493ed8, 0xf253e673, 0x77f5a430, 0xaaef7c9b, 0x88b8d31b, 0x55a20bb0, 0x854c2874, 0x5856f0df, 0x7a015f5f, 0xa71b87f4, +0x22bdc5b7, 0xffa71d1c, 0xddf0b29c, 0x00ea6a37, 0x293147cc, 0xf42b9f67, 0xd67c30e7, 0x0b66e84c, 0x8ec0aa0f, 0x53da72a4, 0x718ddd24, 0xac97058f, 0x58783172, 0x8562e9d9, 0xa7354659, 0x7a2f9ef2, 0xff89dcb1, 0x2293041a, 0x00c4ab9a, 0xddde7331, +0xf4055eca, 0x291f8661, 0x0b4829e1, 0xd652f14a, 0x53f4b309, 0x8eee6ba2, 0xacb9c422, 0x71a31c89, 0x435d8642, 0x9e475ee9, 0xbc10f169, 0x610a29c2, 0xe4ac6b81, 0x39b6b32a, 0x1be11caa, 0xc6fbc401, 0xef20e9fa, 0x323a3151, 0x106d9ed1, 0xcd77467a, +0x48d10439, 0x95cbdc92, 0xb79c7312, 0x6a86abb9, 0x9e699f44, 0x437347ef, 0x6124e86f, 0xbc3e30c4, 0x39987287, 0xe482aa2c, 0xc6d505ac, 0x1bcfdd07, 0x3214f0fc, 0xef0e2857, 0xcd5987d7, 0x10435f7c, 0x95e51d3f, 0x48ffc594, 0x6aa86a14, 0xb7b2b2bf, +0x00000000, 0xfdc1ad88, 0xf5f61eef, 0x0837b367, 0xc7c3ea13, 0x3a02479b, 0x3235f4fc, 0xcff45974, 0x20fec0d4, 0xdd3f6d5c, 0xd508de3b, 0x28c973b3, 0xe73d2ac7, 0x1afc874f, 0x12cb3428, 0xef0a99a0, 0x09a86497, 0xf469c91f, 0xfc5e7a78, 0x019fd7f0, +0xce6b8e84, 0x33aa230c, 0x3b9d906b, 0xc65c3de3, 0x2956a443, 0xd49709cb, 0xdca0baac, 0x21611724, 0xee954e50, 0x1354e3d8, 0x1b6350bf, 0xe6a2fd37, 0x4d5ef89d, 0xb09f5515, 0xb8a8e672, 0x45694bfa, 0x8a9d128e, 0x775cbf06, 0x7f6b0c61, 0x82aaa1e9, +0x6da03849, 0x906195c1, 0x985626a6, 0x65978b2e, 0xaa63d25a, 0x57a27fd2, 0x5f95ccb5, 0xa254613d, 0x44f69c0a, 0xb9373182, 0xb10082e5, 0x4cc12f6d, 0x83357619, 0x7ef4db91, 0x76c368f6, 0x8b02c57e, 0x64085cde, 0x99c9f156, 0x91fe4231, 0x6c3fefb9, +0xa3cbb6cd, 0x5e0a1b45, 0x563da822, 0xabfc05aa, 0x9c209b05, 0x61e1368d, 0x69d685ea, 0x94172862, 0x5be37116, 0xa622dc9e, 0xae156ff9, 0x53d4c271, 0xbcde5bd1, 0x411ff659, 0x4928453e, 0xb4e9e8b6, 0x7b1db1c2, 0x86dc1c4a, 0x8eebaf2d, 0x732a02a5, +0x9588ff92, 0x6849521a, 0x607ee17d, 0x9dbf4cf5, 0x524b1581, 0xaf8ab809, 0xa7bd0b6e, 0x5a7ca6e6, 0xb5763f46, 0x48b792ce, 0x408021a9, 0xbd418c21, 0x72b5d555, 0x8f7478dd, 0x8743cbba, 0x7a826632, 0xd17e6398, 0x2cbfce10, 0x24887d77, 0xd949d0ff, +0x16bd898b, 0xeb7c2403, 0xe34b9764, 0x1e8a3aec, 0xf180a34c, 0x0c410ec4, 0x0476bda3, 0xf9b7102b, 0x3643495f, 0xcb82e4d7, 0xc3b557b0, 0x3e74fa38, 0xd8d6070f, 0x2517aa87, 0x2d2019e0, 0xd0e1b468, 0x1f15ed1c, 0xe2d44094, 0xeae3f3f3, 0x17225e7b, +0xf828c7db, 0x05e96a53, 0x0dded934, 0xf01f74bc, 0x3feb2dc8, 0xc22a8040, 0xca1d3327, 0x37dc9eaf, 0x3392cd76, 0xce5360fe, 0xc664d399, 0x3ba57e11, 0xf4512765, 0x09908aed, 0x01a7398a, 0xfc669402, 0x136c0da2, 0xeeada02a, 0xe69a134d, 0x1b5bbec5, +0xd4afe7b1, 0x296e4a39, 0x2159f95e, 0xdc9854d6, 0x3a3aa9e1, 0xc7fb0469, 0xcfccb70e, 0x320d1a86, 0xfdf943f2, 0x0038ee7a, 0x080f5d1d, 0xf5cef095, 0x1ac46935, 0xe705c4bd, 0xef3277da, 0x12f3da52, 0xdd078326, 0x20c62eae, 0x28f19dc9, 0xd5303041, +0x7ecc35eb, 0x830d9863, 0x8b3a2b04, 0x76fb868c, 0xb90fdff8, 0x44ce7270, 0x4cf9c117, 0xb1386c9f, 0x5e32f53f, 0xa3f358b7, 0xabc4ebd0, 0x56054658, 0x99f11f2c, 0x6430b2a4, 0x6c0701c3, 0x91c6ac4b, 0x7764517c, 0x8aa5fcf4, 0x82924f93, 0x7f53e21b, +0xb0a7bb6f, 0x4d6616e7, 0x4551a580, 0xb8900808, 0x579a91a8, 0xaa5b3c20, 0xa26c8f47, 0x5fad22cf, 0x90597bbb, 0x6d98d633, 0x65af6554, 0x986ec8dc, 0xafb25673, 0x5273fbfb, 0x5a44489c, 0xa785e514, 0x6871bc60, 0x95b011e8, 0x9d87a28f, 0x60460f07, +0x8f4c96a7, 0x728d3b2f, 0x7aba8848, 0x877b25c0, 0x488f7cb4, 0xb54ed13c, 0xbd79625b, 0x40b8cfd3, 0xa61a32e4, 0x5bdb9f6c, 0x53ec2c0b, 0xae2d8183, 0x61d9d8f7, 0x9c18757f, 0x942fc618, 0x69ee6b90, 0x86e4f230, 0x7b255fb8, 0x7312ecdf, 0x8ed34157, +0x41271823, 0xbce6b5ab, 0xb4d106cc, 0x4910ab44, 0xe2ecaeee, 0x1f2d0366, 0x171ab001, 0xeadb1d89, 0x252f44fd, 0xd8eee975, 0xd0d95a12, 0x2d18f79a, 0xc2126e3a, 0x3fd3c3b2, 0x37e470d5, 0xca25dd5d, 0x05d18429, 0xf81029a1, 0xf0279ac6, 0x0de6374e, +0xeb44ca79, 0x168567f1, 0x1eb2d496, 0xe373791e, 0x2c87206a, 0xd1468de2, 0xd9713e85, 0x24b0930d, 0xcbba0aad, 0x367ba725, 0x3e4c1442, 0xc38db9ca, 0x0c79e0be, 0xf1b84d36, 0xf98ffe51, 0x044e53d9, 0x00000000, 0xda31c406, 0x28c32abe, 0xf2f2eeb8, +0x8de69498, 0x57d7509e, 0xa525be26, 0x7f147a20, 0xd73c1c6f, 0x0d0dd869, 0xffff36d1, 0x25cef2d7, 0x5ada88f7, 0x80eb4cf1, 0x7219a249, 0xa828664f, 0xf2a94958, 0x28988d5e, 0xda6a63e6, 0x005ba7e0, 0x7f4fddc0, 0xa57e19c6, 0x578cf77e, 0x8dbd3378, +0x25955537, 0xffa49131, 0x0d567f89, 0xd767bb8f, 0xa873c1af, 0x724205a9, 0x80b0eb11, 0x5a812f17, 0xdd47e77f, 0x07762379, 0xf584cdc1, 0x2fb509c7, 0x50a173e7, 0x8a90b7e1, 0x78625959, 0xa2539d5f, 0x0a7bfb10, 0xd04a3f16, 0x22b8d1ae, 0xf88915a8, +0x879d6f88, 0x5dacab8e, 0xaf5e4536, 0x756f8130, 0x2feeae27, 0xf5df6a21, 0x072d8499, 0xdd1c409f, 0xa2083abf, 0x7839feb9, 0x8acb1001, 0x50fad407, 0xf8d2b248, 0x22e3764e, 0xd01198f6, 0x0a205cf0, 0x753426d0, 0xaf05e2d6, 0x5df70c6e, 0x87c6c868, +0x445b2751, 0x9e6ae357, 0x6c980def, 0xb6a9c9e9, 0xc9bdb3c9, 0x138c77cf, 0xe17e9977, 0x3b4f5d71, 0x93673b3e, 0x4956ff38, 0xbba41180, 0x6195d586, 0x1e81afa6, 0xc4b06ba0, 0x36428518, 0xec73411e, 0xb6f26e09, 0x6cc3aa0f, 0x9e3144b7, 0x440080b1, +0x3b14fa91, 0xe1253e97, 0x13d7d02f, 0xc9e61429, 0x61ce7266, 0xbbffb660, 0x490d58d8, 0x933c9cde, 0xec28e6fe, 0x361922f8, 0xc4ebcc40, 0x1eda0846, 0x991cc02e, 0x432d0428, 0xb1dfea90, 0x6bee2e96, 0x14fa54b6, 0xcecb90b0, 0x3c397e08, 0xe608ba0e, +0x4e20dc41, 0x94111847, 0x66e3f6ff, 0xbcd232f9, 0xc3c648d9, 0x19f78cdf, 0xeb056267, 0x3134a661, 0x6bb58976, 0xb1844d70, 0x4376a3c8, 0x994767ce, 0xe6531dee, 0x3c62d9e8, 0xce903750, 0x14a1f356, 0xbc899519, 0x66b8511f, 0x944abfa7, 0x4e7b7ba1, +0x316f0181, 0xeb5ec587, 0x19ac2b3f, 0xc39def39, 0x6276801d, 0xb847441b, 0x4ab5aaa3, 0x90846ea5, 0xef901485, 0x35a1d083, 0xc7533e3b, 0x1d62fa3d, 0xb54a9c72, 0x6f7b5874, 0x9d89b6cc, 0x47b872ca, 0x38ac08ea, 0xe29dccec, 0x106f2254, 0xca5ee652, +0x90dfc945, 0x4aee0d43, 0xb81ce3fb, 0x622d27fd, 0x1d395ddd, 0xc70899db, 0x35fa7763, 0xefcbb365, 0x47e3d52a, 0x9dd2112c, 0x6f20ff94, 0xb5113b92, 0xca0541b2, 0x103485b4, 0xe2c66b0c, 0x38f7af0a, 0xbf316762, 0x6500a364, 0x97f24ddc, 0x4dc389da, +0x32d7f3fa, 0xe8e637fc, 0x1a14d944, 0xc0251d42, 0x680d7b0d, 0xb23cbf0b, 0x40ce51b3, 0x9aff95b5, 0xe5ebef95, 0x3fda2b93, 0xcd28c52b, 0x1719012d, 0x4d982e3a, 0x97a9ea3c, 0x655b0484, 0xbf6ac082, 0xc07ebaa2, 0x1a4f7ea4, 0xe8bd901c, 0x328c541a, +0x9aa43255, 0x4095f653, 0xb26718eb, 0x6856dced, 0x1742a6cd, 0xcd7362cb, 0x3f818c73, 0xe5b04875, 0x262da74c, 0xfc1c634a, 0x0eee8df2, 0xd4df49f4, 0xabcb33d4, 0x71faf7d2, 0x8308196a, 0x5939dd6c, 0xf111bb23, 0x2b207f25, 0xd9d2919d, 0x03e3559b, +0x7cf72fbb, 0xa6c6ebbd, 0x54340505, 0x8e05c103, 0xd484ee14, 0x0eb52a12, 0xfc47c4aa, 0x267600ac, 0x59627a8c, 0x8353be8a, 0x71a15032, 0xab909434, 0x03b8f27b, 0xd989367d, 0x2b7bd8c5, 0xf14a1cc3, 0x8e5e66e3, 0x546fa2e5, 0xa69d4c5d, 0x7cac885b, +0xfb6a4033, 0x215b8435, 0xd3a96a8d, 0x0998ae8b, 0x768cd4ab, 0xacbd10ad, 0x5e4ffe15, 0x847e3a13, 0x2c565c5c, 0xf667985a, 0x049576e2, 0xdea4b2e4, 0xa1b0c8c4, 0x7b810cc2, 0x8973e27a, 0x5342267c, 0x09c3096b, 0xd3f2cd6d, 0x210023d5, 0xfb31e7d3, +0x84259df3, 0x5e1459f5, 0xace6b74d, 0x76d7734b, 0xdeff1504, 0x04ced102, 0xf63c3fba, 0x2c0dfbbc, 0x5319819c, 0x8928459a, 0x7bdaab22, 0xa1eb6f24, 0x00000000, 0x829d1b68, 0xfea8e910, 0x7c35f278, 0xe69ca5fb, 0x6401be93, 0x18344ceb, 0x9aa95783, +0x0ce8b1e4, 0x8e75aa8c, 0xf24058f4, 0x70dd439c, 0xea74141f, 0x68e90f77, 0x14dcfd0f, 0x9641e667, 0x1213d3f9, 0x908ec891, 0xecbb3ae9, 0x6e262181, 0xf48f7602, 0x76126d6a, 0x0a279f12, 0x88ba847a, 0x1efb621d, 0x9c667975, 0xe0538b0d, 0x62ce9065, +0xf867c7e6, 0x7afadc8e, 0x06cf2ef6, 0x8452359e, 0xe5bda1b3, 0x6720badb, 0x1b1548a3, 0x998853cb, 0x03210448, 0x81bc1f20, 0xfd89ed58, 0x7f14f630, 0xe9551057, 0x6bc80b3f, 0x17fdf947, 0x9560e22f, 0x0fc9b5ac, 0x8d54aec4, 0xf1615cbc, 0x73fc47d4, +0xf7ae724a, 0x75336922, 0x09069b5a, 0x8b9b8032, 0x1132d7b1, 0x93afccd9, 0xef9a3ea1, 0x6d0725c9, 0xfb46c3ae, 0x79dbd8c6, 0x05ee2abe, 0x877331d6, 0x1dda6655, 0x9f477d3d, 0xe3728f45, 0x61ef942d, 0x964b2cd6, 0x14d637be, 0x68e3c5c6, 0xea7edeae, +0x70d7892d, 0xf24a9245, 0x8e7f603d, 0x0ce27b55, 0x9aa39d32, 0x183e865a, 0x640b7422, 0xe6966f4a, 0x7c3f38c9, 0xfea223a1, 0x8297d1d9, 0x000acab1, 0x8458ff2f, 0x06c5e447, 0x7af0163f, 0xf86d0d57, 0x62c45ad4, 0xe05941bc, 0x9c6cb3c4, 0x1ef1a8ac, +0x88b04ecb, 0x0a2d55a3, 0x7618a7db, 0xf485bcb3, 0x6e2ceb30, 0xecb1f058, 0x90840220, 0x12191948, 0x73f68d65, 0xf16b960d, 0x8d5e6475, 0x0fc37f1d, 0x956a289e, 0x17f733f6, 0x6bc2c18e, 0xe95fdae6, 0x7f1e3c81, 0xfd8327e9, 0x81b6d591, 0x032bcef9, +0x9982997a, 0x1b1f8212, 0x672a706a, 0xe5b76b02, 0x61e55e9c, 0xe37845f4, 0x9f4db78c, 0x1dd0ace4, 0x8779fb67, 0x05e4e00f, 0x79d11277, 0xfb4c091f, 0x6d0def78, 0xef90f410, 0x93a50668, 0x11381d00, 0x8b914a83, 0x090c51eb, 0x7539a393, 0xf7a4b8fb, +0x2923aaa0, 0xabbeb1c8, 0xd78b43b0, 0x551658d8, 0xcfbf0f5b, 0x4d221433, 0x3117e64b, 0xb38afd23, 0x25cb1b44, 0xa756002c, 0xdb63f254, 0x59fee93c, 0xc357bebf, 0x41caa5d7, 0x3dff57af, 0xbf624cc7, 0x3b307959, 0xb9ad6231, 0xc5989049, 0x47058b21, +0xddacdca2, 0x5f31c7ca, 0x230435b2, 0xa1992eda, 0x37d8c8bd, 0xb545d3d5, 0xc97021ad, 0x4bed3ac5, 0xd1446d46, 0x53d9762e, 0x2fec8456, 0xad719f3e, 0xcc9e0b13, 0x4e03107b, 0x3236e203, 0xb0abf96b, 0x2a02aee8, 0xa89fb580, 0xd4aa47f8, 0x56375c90, +0xc076baf7, 0x42eba19f, 0x3ede53e7, 0xbc43488f, 0x26ea1f0c, 0xa4770464, 0xd842f61c, 0x5adfed74, 0xde8dd8ea, 0x5c10c382, 0x202531fa, 0xa2b82a92, 0x38117d11, 0xba8c6679, 0xc6b99401, 0x44248f69, 0xd265690e, 0x50f87266, 0x2ccd801e, 0xae509b76, +0x34f9ccf5, 0xb664d79d, 0xca5125e5, 0x48cc3e8d, 0xbf688676, 0x3df59d1e, 0x41c06f66, 0xc35d740e, 0x59f4238d, 0xdb6938e5, 0xa75cca9d, 0x25c1d1f5, 0xb3803792, 0x311d2cfa, 0x4d28de82, 0xcfb5c5ea, 0x551c9269, 0xd7818901, 0xabb47b79, 0x29296011, +0xad7b558f, 0x2fe64ee7, 0x53d3bc9f, 0xd14ea7f7, 0x4be7f074, 0xc97aeb1c, 0xb54f1964, 0x37d2020c, 0xa193e46b, 0x230eff03, 0x5f3b0d7b, 0xdda61613, 0x470f4190, 0xc5925af8, 0xb9a7a880, 0x3b3ab3e8, 0x5ad527c5, 0xd8483cad, 0xa47dced5, 0x26e0d5bd, +0xbc49823e, 0x3ed49956, 0x42e16b2e, 0xc07c7046, 0x563d9621, 0xd4a08d49, 0xa8957f31, 0x2a086459, 0xb0a133da, 0x323c28b2, 0x4e09daca, 0xcc94c1a2, 0x48c6f43c, 0xca5bef54, 0xb66e1d2c, 0x34f30644, 0xae5a51c7, 0x2cc74aaf, 0x50f2b8d7, 0xd26fa3bf, +0x442e45d8, 0xc6b35eb0, 0xba86acc8, 0x381bb7a0, 0xa2b2e023, 0x202ffb4b, 0x5c1a0933, 0xde87125b, 0x00000000, 0xbdbe53ee, 0xd2fc960f, 0x6f42c5e1, 0x95c29b0d, 0x287cc8e3, 0x473e0d02, 0xfa805eec, 0x76ff0825, 0xcb415bcb, 0xa4039e2a, 0x19bdcdc4, +0xe33d9328, 0x5e83c0c6, 0x31c10527, 0x8c7f56c9, 0x0d097c4a, 0xb0b72fa4, 0xdff5ea45, 0x624bb9ab, 0x98cbe747, 0x2575b4a9, 0x4a377148, 0xf78922a6, 0x7bf6746f, 0xc6482781, 0xa90ae260, 0x14b4b18e, 0xee34ef62, 0x538abc8c, 0x3cc8796d, 0x81762a83, +0x86dc32bd, 0x3b626153, 0x5420a4b2, 0xe99ef75c, 0x131ea9b0, 0xaea0fa5e, 0xc1e23fbf, 0x7c5c6c51, 0xf0233a98, 0x4d9d6976, 0x22dfac97, 0x9f61ff79, 0x65e1a195, 0xd85ff27b, 0xb71d379a, 0x0aa36474, 0x8bd54ef7, 0x366b1d19, 0x5929d8f8, 0xe4978b16, +0x1e17d5fa, 0xa3a98614, 0xcceb43f5, 0x7155101b, 0xfd2a46d2, 0x4094153c, 0x2fd6d0dd, 0x92688333, 0x68e8dddf, 0xd5568e31, 0xba144bd0, 0x07aa183e, 0x3815ea83, 0x85abb96d, 0xeae97c8c, 0x57572f62, 0xadd7718e, 0x10692260, 0x7f2be781, 0xc295b46f, +0x4eeae2a6, 0xf354b148, 0x9c1674a9, 0x21a82747, 0xdb2879ab, 0x66962a45, 0x09d4efa4, 0xb46abc4a, 0x351c96c9, 0x88a2c527, 0xe7e000c6, 0x5a5e5328, 0xa0de0dc4, 0x1d605e2a, 0x72229bcb, 0xcf9cc825, 0x43e39eec, 0xfe5dcd02, 0x911f08e3, 0x2ca15b0d, +0xd62105e1, 0x6b9f560f, 0x04dd93ee, 0xb963c000, 0xbec9d83e, 0x03778bd0, 0x6c354e31, 0xd18b1ddf, 0x2b0b4333, 0x96b510dd, 0xf9f7d53c, 0x444986d2, 0xc836d01b, 0x758883f5, 0x1aca4614, 0xa77415fa, 0x5df44b16, 0xe04a18f8, 0x8f08dd19, 0x32b68ef7, +0xb3c0a474, 0x0e7ef79a, 0x613c327b, 0xdc826195, 0x26023f79, 0x9bbc6c97, 0xf4fea976, 0x4940fa98, 0xc53fac51, 0x7881ffbf, 0x17c33a5e, 0xaa7d69b0, 0x50fd375c, 0xed4364b2, 0x8201a153, 0x3fbff2bd, 0x84eace19, 0x39549df7, 0x56165816, 0xeba80bf8, +0x11285514, 0xac9606fa, 0xc3d4c31b, 0x7e6a90f5, 0xf215c63c, 0x4fab95d2, 0x20e95033, 0x9d5703dd, 0x67d75d31, 0xda690edf, 0xb52bcb3e, 0x089598d0, 0x89e3b253, 0x345de1bd, 0x5b1f245c, 0xe6a177b2, 0x1c21295e, 0xa19f7ab0, 0xceddbf51, 0x7363ecbf, +0xff1cba76, 0x42a2e998, 0x2de02c79, 0x905e7f97, 0x6ade217b, 0xd7607295, 0xb822b774, 0x059ce49a, 0x0236fca4, 0xbf88af4a, 0xd0ca6aab, 0x6d743945, 0x97f467a9, 0x2a4a3447, 0x4508f1a6, 0xf8b6a248, 0x74c9f481, 0xc977a76f, 0xa635628e, 0x1b8b3160, +0xe10b6f8c, 0x5cb53c62, 0x33f7f983, 0x8e49aa6d, 0x0f3f80ee, 0xb281d300, 0xddc316e1, 0x607d450f, 0x9afd1be3, 0x2743480d, 0x48018dec, 0xf5bfde02, 0x79c088cb, 0xc47edb25, 0xab3c1ec4, 0x16824d2a, 0xec0213c6, 0x51bc4028, 0x3efe85c9, 0x8340d627, +0xbcff249a, 0x01417774, 0x6e03b295, 0xd3bde17b, 0x293dbf97, 0x9483ec79, 0xfbc12998, 0x467f7a76, 0xca002cbf, 0x77be7f51, 0x18fcbab0, 0xa542e95e, 0x5fc2b7b2, 0xe27ce45c, 0x8d3e21bd, 0x30807253, 0xb1f658d0, 0x0c480b3e, 0x630acedf, 0xdeb49d31, +0x2434c3dd, 0x998a9033, 0xf6c855d2, 0x4b76063c, 0xc70950f5, 0x7ab7031b, 0x15f5c6fa, 0xa84b9514, 0x52cbcbf8, 0xef759816, 0x80375df7, 0x3d890e19, 0x3a231627, 0x879d45c9, 0xe8df8028, 0x5561d3c6, 0xafe18d2a, 0x125fdec4, 0x7d1d1b25, 0xc0a348cb, +0x4cdc1e02, 0xf1624dec, 0x9e20880d, 0x239edbe3, 0xd91e850f, 0x64a0d6e1, 0x0be21300, 0xb65c40ee, 0x372a6a6d, 0x8a943983, 0xe5d6fc62, 0x5868af8c, 0xa2e8f160, 0x1f56a28e, 0x7014676f, 0xcdaa3481, 0x41d56248, 0xfc6b31a6, 0x9329f447, 0x2e97a7a9, +0xd417f945, 0x69a9aaab, 0x06eb6f4a, 0xbb553ca4, 0x00000000, 0x63ebab33, 0x53dc7742, 0x3037dc71, 0xb7876021, 0xd46ccb12, 0xe45b1763, 0x87b0bc50, 0xafc03a5c, 0xcc2b916f, 0xfc1c4d1e, 0x9ff7e62d, 0x18475a7d, 0x7bacf14e, 0x4b9b2d3f, 0x2870860c, +0xd355cda7, 0xb0be6694, 0x8089bae5, 0xe36211d6, 0x64d2ad86, 0x073906b5, 0x370edac4, 0x54e571f7, 0x7c95f7fb, 0x1f7e5cc8, 0x2f4980b9, 0x4ca22b8a, 0xcb1297da, 0xa8f93ce9, 0x98cee098, 0xfb254bab, 0xc0837a69, 0xa368d15a, 0x935f0d2b, 0xf0b4a618, +0x77041a48, 0x14efb17b, 0x24d86d0a, 0x4733c639, 0x6f434035, 0x0ca8eb06, 0x3c9f3777, 0x5f749c44, 0xd8c42014, 0xbb2f8b27, 0x8b185756, 0xe8f3fc65, 0x13d6b7ce, 0x703d1cfd, 0x400ac08c, 0x23e16bbf, 0xa451d7ef, 0xc7ba7cdc, 0xf78da0ad, 0x94660b9e, +0xbc168d92, 0xdffd26a1, 0xefcafad0, 0x8c2151e3, 0x0b91edb3, 0x687a4680, 0x584d9af1, 0x3ba631c2, 0xcd5e17cb, 0xaeb5bcf8, 0x9e826089, 0xfd69cbba, 0x7ad977ea, 0x1932dcd9, 0x290500a8, 0x4aeeab9b, 0x629e2d97, 0x017586a4, 0x31425ad5, 0x52a9f1e6, +0xd5194db6, 0xb6f2e685, 0x86c53af4, 0xe52e91c7, 0x1e0bda6c, 0x7de0715f, 0x4dd7ad2e, 0x2e3c061d, 0xa98cba4d, 0xca67117e, 0xfa50cd0f, 0x99bb663c, 0xb1cbe030, 0xd2204b03, 0xe2179772, 0x81fc3c41, 0x064c8011, 0x65a72b22, 0x5590f753, 0x367b5c60, +0x0ddd6da2, 0x6e36c691, 0x5e011ae0, 0x3deab1d3, 0xba5a0d83, 0xd9b1a6b0, 0xe9867ac1, 0x8a6dd1f2, 0xa21d57fe, 0xc1f6fccd, 0xf1c120bc, 0x922a8b8f, 0x159a37df, 0x76719cec, 0x4646409d, 0x25adebae, 0xde88a005, 0xbd630b36, 0x8d54d747, 0xeebf7c74, +0x690fc024, 0x0ae46b17, 0x3ad3b766, 0x59381c55, 0x71489a59, 0x12a3316a, 0x2294ed1b, 0x417f4628, 0xc6cffa78, 0xa524514b, 0x95138d3a, 0xf6f82609, 0x3c864e25, 0x5f6de516, 0x6f5a3967, 0x0cb19254, 0x8b012e04, 0xe8ea8537, 0xd8dd5946, 0xbb36f275, +0x93467479, 0xf0addf4a, 0xc09a033b, 0xa371a808, 0x24c11458, 0x472abf6b, 0x771d631a, 0x14f6c829, 0xefd38382, 0x8c3828b1, 0xbc0ff4c0, 0xdfe45ff3, 0x5854e3a3, 0x3bbf4890, 0x0b8894e1, 0x68633fd2, 0x4013b9de, 0x23f812ed, 0x13cfce9c, 0x702465af, +0xf794d9ff, 0x947f72cc, 0xa448aebd, 0xc7a3058e, 0xfc05344c, 0x9fee9f7f, 0xafd9430e, 0xcc32e83d, 0x4b82546d, 0x2869ff5e, 0x185e232f, 0x7bb5881c, 0x53c50e10, 0x302ea523, 0x00197952, 0x63f2d261, 0xe4426e31, 0x87a9c502, 0xb79e1973, 0xd475b240, +0x2f50f9eb, 0x4cbb52d8, 0x7c8c8ea9, 0x1f67259a, 0x98d799ca, 0xfb3c32f9, 0xcb0bee88, 0xa8e045bb, 0x8090c3b7, 0xe37b6884, 0xd34cb4f5, 0xb0a71fc6, 0x3717a396, 0x54fc08a5, 0x64cbd4d4, 0x07207fe7, 0xf1d859ee, 0x9233f2dd, 0xa2042eac, 0xc1ef859f, +0x465f39cf, 0x25b492fc, 0x15834e8d, 0x7668e5be, 0x5e1863b2, 0x3df3c881, 0x0dc414f0, 0x6e2fbfc3, 0xe99f0393, 0x8a74a8a0, 0xba4374d1, 0xd9a8dfe2, 0x228d9449, 0x41663f7a, 0x7151e30b, 0x12ba4838, 0x950af468, 0xf6e15f5b, 0xc6d6832a, 0xa53d2819, +0x8d4dae15, 0xeea60526, 0xde91d957, 0xbd7a7264, 0x3acace34, 0x59216507, 0x6916b976, 0x0afd1245, 0x315b2387, 0x52b088b4, 0x628754c5, 0x016cfff6, 0x86dc43a6, 0xe537e895, 0xd50034e4, 0xb6eb9fd7, 0x9e9b19db, 0xfd70b2e8, 0xcd476e99, 0xaeacc5aa, +0x291c79fa, 0x4af7d2c9, 0x7ac00eb8, 0x192ba58b, 0xe20eee20, 0x81e54513, 0xb1d29962, 0xd2393251, 0x55898e01, 0x36622532, 0x0655f943, 0x65be5270, 0x4dced47c, 0x2e257f4f, 0x1e12a33e, 0x7df9080d, 0xfa49b45d, 0x99a21f6e, 0xa995c31f, 0xca7e682c, +0x00000000, 0x384727cc, 0x7e4bcb30, 0x460cecfc, 0x73e127d3, 0x4ba6001f, 0x0daaece3, 0x35edcb2f, 0x03b92864, 0x3bfe0fa8, 0x7df2e354, 0x45b5c498, 0x70580fb7, 0x481f287b, 0x0e13c487, 0x3654e34b, 0x428d2294, 0x7aca0558, 0x3cc6e9a4, 0x0481ce68, +0x316c0547, 0x092b228b, 0x4f27ce77, 0x7760e9bb, 0x41340af0, 0x79732d3c, 0x3f7fc1c0, 0x0738e60c, 0x32d52d23, 0x0a920aef, 0x4c9ee613, 0x74d9c1df, 0x988c1464, 0xa0cb33a8, 0xe6c7df54, 0xde80f898, 0xeb6d33b7, 0xd32a147b, 0x9526f887, 0xad61df4b, +0x9b353c00, 0xa3721bcc, 0xe57ef730, 0xdd39d0fc, 0xe8d41bd3, 0xd0933c1f, 0x969fd0e3, 0xaed8f72f, 0xda0136f0, 0xe246113c, 0xa44afdc0, 0x9c0dda0c, 0xa9e01123, 0x91a736ef, 0xd7abda13, 0xefecfddf, 0xd9b81e94, 0xe1ff3958, 0xa7f3d5a4, 0x9fb4f268, +0xaa593947, 0x921e1e8b, 0xd412f277, 0xec55d5bb, 0x058ec836, 0x3dc9effa, 0x7bc50306, 0x438224ca, 0x766fefe5, 0x4e28c829, 0x082424d5, 0x30630319, 0x0637e052, 0x3e70c79e, 0x787c2b62, 0x403b0cae, 0x75d6c781, 0x4d91e04d, 0x0b9d0cb1, 0x33da2b7d, +0x4703eaa2, 0x7f44cd6e, 0x39482192, 0x010f065e, 0x34e2cd71, 0x0ca5eabd, 0x4aa90641, 0x72ee218d, 0x44bac2c6, 0x7cfde50a, 0x3af109f6, 0x02b62e3a, 0x375be515, 0x0f1cc2d9, 0x49102e25, 0x715709e9, 0x9d02dc52, 0xa545fb9e, 0xe3491762, 0xdb0e30ae, +0xeee3fb81, 0xd6a4dc4d, 0x90a830b1, 0xa8ef177d, 0x9ebbf436, 0xa6fcd3fa, 0xe0f03f06, 0xd8b718ca, 0xed5ad3e5, 0xd51df429, 0x931118d5, 0xab563f19, 0xdf8ffec6, 0xe7c8d90a, 0xa1c435f6, 0x9983123a, 0xac6ed915, 0x9429fed9, 0xd2251225, 0xea6235e9, +0xdc36d6a2, 0xe471f16e, 0xa27d1d92, 0x9a3a3a5e, 0xafd7f171, 0x9790d6bd, 0xd19c3a41, 0xe9db1d8d, 0x4bc305bc, 0x73842270, 0x3588ce8c, 0x0dcfe940, 0x3822226f, 0x006505a3, 0x4669e95f, 0x7e2ece93, 0x487a2dd8, 0x703d0a14, 0x3631e6e8, 0x0e76c124, +0x3b9b0a0b, 0x03dc2dc7, 0x45d0c13b, 0x7d97e6f7, 0x094e2728, 0x310900e4, 0x7705ec18, 0x4f42cbd4, 0x7aaf00fb, 0x42e82737, 0x04e4cbcb, 0x3ca3ec07, 0x0af70f4c, 0x32b02880, 0x74bcc47c, 0x4cfbe3b0, 0x7916289f, 0x41510f53, 0x075de3af, 0x3f1ac463, +0xd34f11d8, 0xeb083614, 0xad04dae8, 0x9543fd24, 0xa0ae360b, 0x98e911c7, 0xdee5fd3b, 0xe6a2daf7, 0xd0f639bc, 0xe8b11e70, 0xaebdf28c, 0x96fad540, 0xa3171e6f, 0x9b5039a3, 0xdd5cd55f, 0xe51bf293, 0x91c2334c, 0xa9851480, 0xef89f87c, 0xd7cedfb0, +0xe223149f, 0xda643353, 0x9c68dfaf, 0xa42ff863, 0x927b1b28, 0xaa3c3ce4, 0xec30d018, 0xd477f7d4, 0xe19a3cfb, 0xd9dd1b37, 0x9fd1f7cb, 0xa796d007, 0x4e4dcd8a, 0x760aea46, 0x300606ba, 0x08412176, 0x3dacea59, 0x05ebcd95, 0x43e72169, 0x7ba006a5, +0x4df4e5ee, 0x75b3c222, 0x33bf2ede, 0x0bf80912, 0x3e15c23d, 0x0652e5f1, 0x405e090d, 0x78192ec1, 0x0cc0ef1e, 0x3487c8d2, 0x728b242e, 0x4acc03e2, 0x7f21c8cd, 0x4766ef01, 0x016a03fd, 0x392d2431, 0x0f79c77a, 0x373ee0b6, 0x71320c4a, 0x49752b86, +0x7c98e0a9, 0x44dfc765, 0x02d32b99, 0x3a940c55, 0xd6c1d9ee, 0xee86fe22, 0xa88a12de, 0x90cd3512, 0xa520fe3d, 0x9d67d9f1, 0xdb6b350d, 0xe32c12c1, 0xd578f18a, 0xed3fd646, 0xab333aba, 0x93741d76, 0xa699d659, 0x9edef195, 0xd8d21d69, 0xe0953aa5, +0x944cfb7a, 0xac0bdcb6, 0xea07304a, 0xd2401786, 0xe7addca9, 0xdfeafb65, 0x99e61799, 0xa1a13055, 0x97f5d31e, 0xafb2f4d2, 0xe9be182e, 0xd1f93fe2, 0xe414f4cd, 0xdc53d301, 0x9a5f3ffd, 0xa2181831, ] + +d0x6a07d7c0=[ 0x0f, 0xc0, 0x68, 0xf8, 0xf6, 0x1e, 0xde, 0x1f, 0xdd, 0x80, 0x50, 0x58, 0xd9, 0x6f, 0xf7, 0x7b, 0x08, 0x18, 0x33, 0x69, 0x13, 0x99, 0x4a, 0x5c, 0x61, 0xbd, 0x6a, 0xbe, 0xb2, 0xb1, 0xfa, 0x82, 0xe5, 0x94, 0xd4, 0xe2, 0x38, 0x17, 0xd6, 0x12, +0x43, 0x0c, 0xd8, 0x2b, 0xa5, 0x31, 0x62, 0x88, 0xd3, 0x2c, 0x47, 0xcc, 0x21, 0xfe, 0x15, 0xe7, 0x39, 0xdf, 0x29, 0x27, 0xdb, 0xc3, 0x37, 0x5a, 0xfb, 0x10, 0x93, 0xea, 0xe1, 0x8f, 0x28, 0x87, 0x3d, 0x90, 0xc4, 0xa0, 0x11, 0xb6, 0x6d, 0x44, +0x6e, 0x3a, 0x81, 0xd1, 0xc6, 0x53, 0x5b, 0x4f, 0x8b, 0x35, 0x23, 0xe4, 0xab, 0x5d, 0xce, 0x1b, 0x3f, 0xae, 0xd2, 0xc1, 0x79, 0xca, 0xb8, 0x56, 0xe0, 0x51, 0x07, 0x06, 0x95, 0x59, 0x9b, 0x72, 0xf5, 0x6b, 0x52, 0xd7, 0x8e, 0x83, 0x7f, 0x9d, +0xcb, 0x16, 0x55, 0x2f, 0xa9, 0x78, 0x0b, 0xef, 0x7a, 0xf2, 0x57, 0xaf, 0x2d, 0x24, 0x98, 0x9f, 0x01, 0xc2, 0xa2, 0x1d, 0x3b, 0x7e, 0x49, 0x42, 0x67, 0xd0, 0x65, 0xbb, 0x19, 0x85, 0x4c, 0xfc, 0x7c, 0xb5, 0xbc, 0x91, 0x0e, 0x02, 0x30, 0xe6, +0x00, 0x1a, 0xe8, 0xaa, 0x0d, 0x71, 0x4d, 0xee, 0x2e, 0x05, 0xc8, 0x8d, 0xf1, 0x75, 0x86, 0xa6, 0x8a, 0x97, 0x09, 0x32, 0x84, 0xcf, 0xad, 0x4e, 0x89, 0x4b, 0xeb, 0xb7, 0xf3, 0xba, 0x76, 0x96, 0xda, 0xc5, 0x14, 0x74, 0x5e, 0x70, 0x54, 0xff, +0x0a, 0xb3, 0xa1, 0x26, 0x34, 0x25, 0xb4, 0xa3, 0xc9, 0x9c, 0x92, 0x7d, 0xf0, 0x9a, 0xed, 0xac, 0x04, 0xa8, 0xf9, 0xa7, 0x46, 0xc7, 0x03, 0xbf, 0x5f, 0x73, 0xec, 0xd5, 0xfd, 0xdc, 0x40, 0xb0, 0x9e, 0xe3, 0x20, 0x64, 0x1c, 0x22, 0xe9, 0x41, +0xf4, 0x3e, 0x3c, 0xa4, 0x66, 0x63, 0x8c, 0x2a, 0x48, 0x60, 0x77, 0xb9, 0x6c, 0xcd, 0x36, 0x45, 0xe7, 0xbf, 0x8b, 0xd4, 0xcd, 0xf1, 0xcf, 0x4c, 0x21, 0x83, 0xa5, 0x5f, 0xc8, 0x61, 0x77, 0x0c, 0x41, 0x0f, 0xc0, 0xbe, 0x3c, 0xc5, 0xf2, 0xec, +0xee, 0x12, 0xdc, 0x69, 0x9e, 0xf7, 0x10, 0x64, 0xbc, 0xa4, 0xe2, 0x4d, 0xd7, 0x3f, 0x76, 0x92, 0xf3, 0x18, 0x2a, 0x24, 0xd8, 0x05, 0xaa, 0x3a, 0xc4, 0x40, 0x14, 0x55, 0x2e, 0xb2, 0x08, 0xa0, 0x8e, 0xdb, 0xd0, 0xa3, 0x03, 0x7e, 0x46, 0x98, +0xcb, 0xc9, 0x65, 0xb6, 0xfd, 0xc7, 0x94, 0x30, 0xe1, 0xab, 0x9d, 0xbb, 0xc6, 0xa9, 0x3e, 0x5b, 0xb4, 0xa8, 0xde, 0x39, 0x37, 0x70, 0xaf, 0xdf, 0x7b, 0x0e, 0x33, 0xe9, 0x07, 0x47, 0x50, 0x74, 0x75, 0x59, 0x9a, 0xb7, 0x54, 0xf8, 0x51, 0x13, +0x9c, 0x90, 0x15, 0xe5, 0xa1, 0xdd, 0x84, 0x38, 0x01, 0x9f, 0x66, 0x6e, 0x88, 0x25, 0x96, 0x1d, 0x1a, 0xac, 0x58, 0xba, 0x09, 0xd6, 0x00, 0x29, 0x35, 0x53, 0xe8, 0x42, 0xd1, 0xbd, 0x04, 0xf9, 0x4f, 0x16, 0xae, 0x89, 0x20, 0xeb, 0x60, 0xb0, +0x8c, 0x78, 0x57, 0x06, 0xb3, 0x82, 0x86, 0xb5, 0x22, 0xc3, 0x7f, 0x8a, 0x0a, 0xef, 0xe0, 0xc2, 0xe4, 0x97, 0x62, 0x6b, 0x26, 0x8d, 0x44, 0x0d, 0x5e, 0xa6, 0xd2, 0xfa, 0x85, 0xd9, 0xca, 0xd5, 0x95, 0x7c, 0x71, 0xfb, 0x93, 0x87, 0x2d, 0xb9, +0x1f, 0x45, 0x4e, 0xff, 0x72, 0x81, 0x02, 0x56, 0x52, 0x6d, 0xcc, 0x43, 0x3b, 0x5a, 0x2f, 0x63, 0x4a, 0xea, 0x2b, 0xb8, 0xc1, 0x19, 0x99, 0xad, 0x67, 0xfe, 0xfc, 0x9b, 0x2c, 0x7a, 0x6a, 0x5d, 0xd3, 0x7d, 0x1c, 0x36, 0x27, 0xa7, 0xe3, 0x79, +0x3d, 0x0b, 0x8f, 0x31, 0x32, 0xe6, 0x11, 0x80, 0x1b, 0xce, 0xda, 0xf5, 0x1e, 0xf0, 0x6f, 0x6c, 0x73, 0x48, 0x91, 0x28, 0xf6, 0x49, 0xa2, 0x68, 0x23, 0x34, 0x17, 0x5c, 0x4b, 0xed, 0xb1, 0xf4, 0x6f, 0xd3, 0x12, 0x3f, 0xa7, 0x05, 0x4a, 0x76, +0x89, 0x07, 0x2c, 0x28, 0xeb, 0x67, 0x60, 0x04, 0x33, 0x01, 0x5d, 0x9b, 0x0c, 0x43, 0xdf, 0x13, 0xf4, 0xdc, 0x56, 0x1f, 0x77, 0xaf, 0xa1, 0x9e, 0xb6, 0x5c, 0x7f, 0x7e, 0x92, 0x4b, 0xcd, 0x40, 0xd0, 0x9c, 0x9a, 0x09, 0x31, 0x42, 0x48, 0x14, +0xc9, 0x96, 0x16, 0x6d, 0xa2, 0x0e, 0x34, 0x38, 0x83, 0xde, 0x51, 0xf6, 0x8c, 0xfe, 0x24, 0xb3, 0xe6, 0x74, 0x5b, 0x78, 0xae, 0x19, 0x11, 0x7b, 0x3d, 0xd6, 0x69, 0x81, 0xa0, 0xc5, 0xb9, 0x6a, 0xc4, 0x2a, 0xe3, 0xd5, 0x9d, 0xba, 0x59, 0xa4, +0x46, 0x15, 0xe7, 0x55, 0x23, 0xc0, 0x1c, 0x84, 0xf2, 0x94, 0x61, 0xaa, 0xec, 0x7d, 0x22, 0x0d, 0x8e, 0x93, 0xff, 0xfa, 0x17, 0x18, 0x71, 0xea, 0x45, 0xf5, 0xf1, 0x1e, 0xd2, 0xa5, 0xc6, 0x80, 0xee, 0xd4, 0xab, 0xe1, 0xf7, 0x58, 0xe5, 0x75, +0x27, 0x1a, 0xfc, 0x54, 0xc2, 0x82, 0x8b, 0x97, 0xe4, 0xe2, 0x0a, 0xb0, 0x3e, 0x44, 0xb7, 0xda, 0xcb, 0x73, 0x65, 0xb2, 0x35, 0xc3, 0x25, 0xf9, 0x8f, 0xca, 0x08, 0xb1, 0xac, 0x4d, 0xfd, 0xcc, 0x5e, 0x99, 0xbf, 0xc7, 0x21, 0x57, 0x30, 0x6b, +0x7a, 0x2b, 0x6c, 0x4e, 0x37, 0x88, 0x50, 0x47, 0x72, 0x02, 0x3a, 0xe0, 0x2d, 0xa9, 0xbc, 0xc1, 0x41, 0x90, 0x1d, 0xfb, 0x20, 0xbd, 0xa6, 0x39, 0x87, 0xf8, 0x3b, 0x06, 0xd1, 0xf0, 0x53, 0x49, 0x10, 0xcf, 0x0b, 0x95, 0x6e, 0xdb, 0x86, 0x98, +0x00, 0x5a, 0x85, 0x91, 0x32, 0xa8, 0x7c, 0x1b, 0xd9, 0x2e, 0x03, 0xce, 0x4f, 0x2f, 0x64, 0x63, 0xe8, 0xbe, 0xc8, 0x66, 0xf3, 0x79, 0xef, 0xbb, 0x62, 0x4c, 0xd7, 0x5f, 0xb5, 0x8d, 0xb8, 0x70, 0x0f, 0x36, 0x9f, 0x3c, 0x29, 0xd8, 0xe9, 0x52, +0xed, 0xa3, 0xdd, 0xb4, 0x26, 0xad, 0x8a, 0x68, 0xa9, 0xb5, 0x9c, 0x52, 0x1e, 0xc9, 0xa5, 0x13, 0x4b, 0x49, 0x45, 0x44, 0xca, 0x34, 0x65, 0x69, 0x1a, 0x56, 0x89, 0xcd, 0xf0, 0x82, 0x7f, 0x7c, 0xa0, 0x97, 0x67, 0x1d, 0xb3, 0x83, 0x77, 0x32, +0xf2, 0x90, 0x02, 0xbb, 0x2e, 0x04, 0x03, 0x6e, 0x29, 0xbe, 0x7e, 0xc0, 0xbc, 0x2f, 0xba, 0x9a, 0x92, 0x80, 0x95, 0x39, 0x31, 0x5e, 0xff, 0x15, 0xd9, 0x61, 0xfe, 0x53, 0x9d, 0xdd, 0x37, 0xd7, 0xb8, 0x7b, 0x4d, 0x36, 0xb4, 0x50, 0xe5, 0x68, +0x09, 0xd5, 0x1f, 0x6b, 0x5c, 0xf4, 0x5d, 0xdb, 0x0e, 0xc7, 0x79, 0x98, 0x38, 0xd1, 0x2d, 0x2b, 0x46, 0x1b, 0xa4, 0xfd, 0xaf, 0xdc, 0xa7, 0xb2, 0x0d, 0x51, 0x8a, 0x58, 0x87, 0x20, 0x64, 0x08, 0xfc, 0x0f, 0xd6, 0x6c, 0x42, 0xc3, 0x25, 0x14, +0x8e, 0x8c, 0x41, 0xad, 0xac, 0x5a, 0xed, 0x93, 0xf7, 0xf9, 0xf3, 0x2a, 0x07, 0x16, 0x6f, 0x30, 0xec, 0xd3, 0xe7, 0xcc, 0x4c, 0x48, 0xd4, 0x01, 0x3b, 0xa2, 0x0c, 0xea, 0xda, 0xef, 0x40, 0x57, 0x3e, 0x4e, 0x96, 0x54, 0x3c, 0x4a, 0xe2, 0xcb, +0x6a, 0xce, 0xe4, 0xab, 0x24, 0x99, 0x81, 0x3d, 0xf6, 0x33, 0xc5, 0xe8, 0x88, 0xae, 0xaa, 0x66, 0x28, 0x73, 0x78, 0x70, 0xfb, 0x21, 0x11, 0xb0, 0x84, 0x06, 0xc2, 0x7d, 0x71, 0xf1, 0xa3, 0x72, 0xb1, 0x3f, 0x3a, 0xee, 0x22, 0xfa, 0x0b, 0x35, +0x47, 0x19, 0x05, 0x27, 0x55, 0xc1, 0xe9, 0x76, 0x10, 0x74, 0xd0, 0x00, 0xd8, 0x91, 0x62, 0x8f, 0xc8, 0x4f, 0xa8, 0x0a, 0x6d, 0x75, 0x8d, 0xbf, 0xe1, 0x26, 0x1c, 0xe0, 0x5b, 0xdf, 0x8b, 0xc6, 0xf8, 0x85, 0x7a, 0xa1, 0xe3, 0x9b, 0x12, 0xeb, +0xbd, 0x60, 0x59, 0x9f, 0xcf, 0xc4, 0x5f, 0x63, 0x9e, 0xb6, 0xd2, 0xb9, 0x18, 0x94, 0x2c, 0x86, 0xa6, 0x17, 0xde, 0x43, 0xf5, 0x23, 0xe6, 0xb7, 0x26, 0x9b, 0x35, 0x3e, 0xe4, 0x45, 0xa3, 0xee, 0xba, 0xf4, 0xd2, 0x30, 0x44, 0xac, 0xbc, 0xd9, +0xd6, 0x86, 0x9a, 0x2e, 0xea, 0x89, 0x8e, 0xff, 0xef, 0x55, 0xda, 0xc6, 0xa6, 0xdd, 0xfd, 0x51, 0x33, 0x0e, 0x6f, 0x4e, 0x63, 0xd3, 0xed, 0xab, 0xbb, 0xd7, 0xa7, 0xa4, 0x40, 0xa9, 0x87, 0xad, 0xfc, 0x1a, 0x75, 0xe8, 0xe2, 0x6c, 0x3c, 0x58, +0x1c, 0x03, 0x99, 0xf8, 0xf7, 0x02, 0x78, 0x43, 0x11, 0xec, 0xc7, 0x29, 0x6d, 0xe7, 0x47, 0xe9, 0x4f, 0x7a, 0xf2, 0x24, 0xa8, 0x96, 0x4c, 0xa1, 0x5d, 0x01, 0x17, 0x5b, 0x90, 0x71, 0x73, 0xca, 0x7c, 0x05, 0x68, 0x3f, 0x9f, 0x09, 0x6e, 0x91, +0x9d, 0xe3, 0x32, 0x84, 0xb4, 0x50, 0x06, 0x69, 0x8a, 0x85, 0x10, 0x15, 0x88, 0x8f, 0x2b, 0xdc, 0x4a, 0x1f, 0x7f, 0x98, 0x8c, 0x25, 0x65, 0x27, 0x80, 0xcf, 0x8b, 0x4d, 0x76, 0x2d, 0x19, 0xde, 0x7b, 0xa2, 0x57, 0x56, 0xe1, 0x3d, 0xeb, 0x53, +0x5c, 0x1b, 0xb9, 0x67, 0x6a, 0x46, 0xa5, 0x5f, 0xfb, 0x18, 0x66, 0xd4, 0x04, 0xcc, 0xbd, 0x93, 0x97, 0xbe, 0xd8, 0x21, 0xb2, 0x94, 0xc9, 0xd1, 0x6b, 0x70, 0x8d, 0x42, 0xb3, 0x36, 0x52, 0x3a, 0xce, 0xf1, 0x08, 0x20, 0x77, 0xc8, 0xdb, 0xf9, +0xae, 0x2f, 0x54, 0x64, 0xf0, 0xe5, 0xe0, 0xc0, 0x39, 0x16, 0xf3, 0x95, 0x2c, 0xb6, 0x37, 0x23, 0x4b, 0xc4, 0x48, 0xb0, 0xc5, 0x0f, 0x28, 0xcd, 0x79, 0xc3, 0x07, 0x7d, 0x14, 0x49, 0xb5, 0x22, 0xd5, 0x00, 0x1d, 0xb7, 0x41, 0xc1, 0x9e, 0x0a, +0x61, 0xc2, 0x0b, 0xfa, 0x38, 0xaa, 0x5e, 0x34, 0xd0, 0xa0, 0xfe, 0x83, 0xaf, 0x82, 0xb1, 0x13, 0x74, 0x7e, 0xe6, 0xf6, 0x1e, 0x0d, 0x31, 0xb8, 0x60, 0xbf, 0x0c, 0x12, 0xcb, 0x81, 0xf5, 0x5a, 0x2a, 0x3b, 0x9c, 0x62, 0xdf, 0x59, 0x92, 0x72, +0x81, 0xa9, 0x94, 0x64, 0x11, 0x31, 0x7c, 0x61, 0x5f, 0xb0, 0xfa, 0xeb, 0x49, 0x40, 0xea, 0xc7, 0x74, 0xad, 0x59, 0x0b, 0xf8, 0xde, 0x04, 0x23, 0x3c, 0xef, 0xac, 0x06, 0xe8, 0xab, 0xaf, 0x38, 0xf0, 0x9b, 0x9c, 0x2e, 0x42, 0xd1, 0x07, 0xfd, +0xc0, 0x4f, 0x60, 0x3f, 0x69, 0xfb, 0xe3, 0x26, 0x12, 0x1c, 0x5d, 0x72, 0x5e, 0x92, 0x85, 0x00, 0xe1, 0xf1, 0xfc, 0x70, 0xf4, 0x5b, 0x97, 0x29, 0xae, 0xca, 0xd9, 0x4c, 0x6f, 0x6c, 0x16, 0x86, 0xd2, 0x43, 0x5c, 0xb8, 0x88, 0x7a, 0xd6, 0x99, +0x02, 0x79, 0xf2, 0xc6, 0x0a, 0xb7, 0x44, 0x67, 0xb6, 0xe5, 0x52, 0xbf, 0xce, 0x4d, 0x8e, 0xc2, 0x48, 0x98, 0x83, 0xe6, 0xbd, 0xcf, 0x77, 0xc3, 0x9a, 0x0c, 0xa5, 0x28, 0x6b, 0x96, 0xda, 0x7e, 0x24, 0xe7, 0xb1, 0x01, 0xa2, 0x1e, 0x6a, 0x75, +0x27, 0x65, 0x36, 0x7f, 0x3b, 0x3e, 0xec, 0xa8, 0xe9, 0x7d, 0xdf, 0x54, 0x4e, 0x34, 0xbb, 0x08, 0xd8, 0x19, 0x84, 0x58, 0x66, 0x32, 0x51, 0x78, 0xdc, 0x5a, 0x9f, 0xe0, 0x37, 0x47, 0x30, 0x03, 0xa6, 0x82, 0x1b, 0x39, 0x33, 0xfe, 0x4b, 0x7b, +0x2a, 0xb5, 0x9d, 0x14, 0x15, 0x22, 0x0e, 0x10, 0x4a, 0xd0, 0x17, 0x63, 0xa7, 0xbc, 0xc5, 0xb3, 0xed, 0x45, 0x6e, 0xa4, 0xe2, 0x20, 0x3d, 0x9e, 0xf3, 0xdd, 0xd5, 0x8b, 0x09, 0xd7, 0x8d, 0xc8, 0x76, 0xa0, 0xa3, 0x2b, 0xdb, 0x62, 0x8a, 0xcb, +0x3a, 0x71, 0x91, 0x2d, 0xcc, 0xf5, 0x56, 0xf7, 0x73, 0x0d, 0xaa, 0xcd, 0x1d, 0x46, 0xd3, 0xf6, 0xd4, 0x2f, 0x87, 0x1a, 0x80, 0x35, 0x93, 0xb9, 0xc1, 0x90, 0xff, 0x18, 0x8c, 0xee, 0x13, 0xe4, 0xc4, 0xf9, 0xc9, 0x25, 0xb4, 0x41, 0x89, 0x53, +0x57, 0xa1, 0x2c, 0x55, 0xb2, 0xba, 0x1f, 0x95, 0x6d, 0x8f, 0xbe, 0x0f, 0x50, 0x21, 0x05, 0x68, 0x66, 0xf6, 0x58, 0x97, 0xa9, 0x27, 0x99, 0xed, 0x28, 0xe6, 0xea, 0xc2, 0xa2, 0x57, 0xb0, 0x2b, 0x40, 0xd4, 0x3b, 0xd1, 0x50, 0x18, 0x2d, 0xd0, +0x7c, 0x16, 0x4d, 0x0c, 0x94, 0xcb, 0xdd, 0xe8, 0x6c, 0x05, 0x2e, 0xb8, 0xa4, 0xde, 0xe3, 0x3e, 0xd5, 0x10, 0x73, 0x92, 0x32, 0xca, 0x06, 0x8e, 0xbb, 0xd7, 0xfd, 0x8b, 0x29, 0xbc, 0x8a, 0x9e, 0x2a, 0x17, 0xe7, 0xbf, 0x4b, 0xcf, 0xd3, 0xf3, +0x7b, 0x07, 0x23, 0x80, 0x54, 0xb9, 0x15, 0x55, 0xb3, 0x45, 0x46, 0x93, 0x4c, 0xe2, 0xb4, 0xf7, 0x36, 0x89, 0xd9, 0x1a, 0xe9, 0x24, 0x52, 0x33, 0x04, 0x81, 0x03, 0x9d, 0x75, 0x77, 0xc7, 0x5a, 0x85, 0xa1, 0xee, 0xa8, 0x7f, 0xfe, 0xb6, 0x0a, +0xff, 0xcd, 0xb2, 0x98, 0xf0, 0xdf, 0xe1, 0x25, 0xda, 0x96, 0xd6, 0x0d, 0x3f, 0xa7, 0xe5, 0x2f, 0x35, 0x62, 0x8c, 0x5f, 0x08, 0x00, 0x37, 0x6a, 0x3d, 0x6d, 0x4a, 0x1e, 0x5d, 0x8d, 0x64, 0xdc, 0xc3, 0x53, 0x34, 0x1f, 0x82, 0x39, 0x61, 0x9b, +0x88, 0x59, 0x78, 0x9c, 0x67, 0x79, 0x12, 0xb7, 0xc0, 0xc9, 0xfb, 0xfc, 0x6b, 0x95, 0xe4, 0xb5, 0x65, 0xec, 0x3a, 0xf1, 0xa5, 0x56, 0x21, 0x6e, 0xe0, 0x42, 0x01, 0x63, 0x87, 0x68, 0xaf, 0xfa, 0x6f, 0x1d, 0x44, 0xbd, 0x2c, 0xc4, 0x4e, 0x8f, +0x31, 0xc5, 0x90, 0x22, 0x0b, 0xaa, 0xf5, 0x86, 0x74, 0x71, 0xd8, 0x7e, 0x84, 0x5c, 0xf4, 0x72, 0x1b, 0xad, 0x5e, 0xd2, 0x83, 0xa6, 0x5b, 0x11, 0xef, 0xb1, 0x02, 0xae, 0x49, 0x0e, 0xc8, 0xeb, 0x9a, 0xac, 0x41, 0x30, 0xa3, 0x7a, 0x60, 0xf9, +0x76, 0xbe, 0xc6, 0xf2, 0x51, 0x14, 0xa0, 0xab, 0x69, 0x4f, 0x09, 0x0f, 0xcc, 0xc1, 0x9f, 0x7d, 0x91, 0x43, 0x38, 0x48, 0xf8, 0xba, 0x26, 0x3c, 0x20, 0x47, 0x13, 0x19, 0xdb, 0x1c, 0x70, 0xce, 0x96, 0x50, 0xe5, 0x59, 0xf3, 0xa7, 0xa2, 0x53, +0xf7, 0xb5, 0x6f, 0x76, 0xca, 0x48, 0x07, 0x93, 0xba, 0xff, 0xd2, 0x68, 0x06, 0x09, 0x7f, 0xef, 0x60, 0xa0, 0x0f, 0xc5, 0x0d, 0xe9, 0x24, 0x36, 0xfe, 0xe4, 0x6a, 0xf0, 0xcd, 0xb6, 0xa1, 0x4b, 0x8b, 0xbc, 0xfa, 0x7b, 0xc8, 0x98, 0xc2, 0x41, +0x1b, 0x7e, 0x64, 0xfc, 0x8f, 0x5e, 0x38, 0x1a, 0x57, 0x5c, 0x8d, 0x29, 0x46, 0x75, 0x4a, 0x85, 0xe0, 0xd8, 0xf6, 0x14, 0xb8, 0x90, 0x43, 0x47, 0x1f, 0x17, 0xcb, 0x86, 0xdf, 0xb7, 0xe8, 0xe1, 0x6b, 0x44, 0xc9, 0xbe, 0x73, 0xa4, 0x3e, 0xf1, +0x9d, 0x88, 0xdb, 0x65, 0x1c, 0x5d, 0xbf, 0xdc, 0x84, 0xd9, 0xaa, 0x39, 0x2a, 0x9f, 0x25, 0x22, 0x40, 0xcf, 0xf9, 0xf4, 0x4f, 0x81, 0x70, 0x0e, 0xa3, 0x79, 0xd7, 0x10, 0xb4, 0xde, 0x69, 0x4e, 0xc7, 0x03, 0xe2, 0x05, 0x2d, 0x87, 0x20, 0x0b, +0x11, 0x35, 0x56, 0x45, 0xa9, 0x97, 0xeb, 0x3b, 0x6e, 0x16, 0x5b, 0x2b, 0x51, 0xac, 0x71, 0xc6, 0xd0, 0x2f, 0xa8, 0x9c, 0xb0, 0xc4, 0x3d, 0xdd, 0x2e, 0x62, 0x74, 0xd3, 0x18, 0x78, 0x3f, 0x21, 0xc0, 0xc3, 0x13, 0xc1, 0x12, 0x5a, 0x8c, 0x52, +0x72, 0x34, 0x00, 0x91, 0x8e, 0x26, 0x5f, 0xe7, 0x83, 0x58, 0x92, 0xbb, 0x7c, 0x63, 0x31, 0x94, 0x01, 0x8a, 0x1e, 0xd6, 0x54, 0xda, 0xb1, 0xf8, 0x80, 0xa6, 0x3a, 0xbd, 0x6c, 0x02, 0x08, 0xfd, 0xd4, 0x37, 0x9a, 0x49, 0x04, 0x55, 0xab, 0x4d, +0xea, 0x23, 0x4c, 0x66, 0x9b, 0x61, 0xaf, 0xb9, 0xf2, 0x95, 0x3c, 0x1d, 0xed, 0xec, 0x28, 0x77, 0xa5, 0xee, 0xce, 0x99, 0x32, 0xcc, 0xfb, 0xf5, 0x0a, 0x0c, 0x89, 0x30, 0x7a, 0xd5, 0xe6, 0x7d, 0x6d, 0x67, 0x42, 0xb2, 0x82, 0x33, 0x2c, 0x19, +0x9e, 0xb3, 0xd1, 0xe3, 0x15, 0xae, 0xad, 0x27, 0x61, 0xa9, 0xd9, 0x34, 0xda, 0x5b, 0x76, 0x73, 0xf9, 0xcb, 0x3c, 0x19, 0xbf, 0xb2, 0xb7, 0x41, 0xea, 0x8f, 0xd1, 0x51, 0xef, 0xec, 0x87, 0x58, 0x93, 0x49, 0x02, 0xa2, 0x1b, 0x50, 0x64, 0x68, +0x5d, 0x39, 0xc5, 0xd6, 0x14, 0xa0, 0x7d, 0xc7, 0xa3, 0x9a, 0xd2, 0x55, 0x1a, 0xf6, 0xe0, 0x97, 0x29, 0x96, 0x70, 0x32, 0x35, 0x72, 0xfc, 0xb0, 0xb6, 0x80, 0x94, 0x9c, 0x8a, 0x88, 0xee, 0x89, 0xd5, 0x33, 0x37, 0x27, 0x84, 0xe7, 0x36, 0xa1, +0x12, 0xa5, 0x6e, 0xac, 0x5e, 0x4c, 0x16, 0x69, 0x8e, 0xa6, 0xbe, 0xeb, 0x22, 0xd8, 0x21, 0xc0, 0xca, 0x9e, 0xce, 0x13, 0x4e, 0x3a, 0x59, 0x92, 0xf2, 0x40, 0xad, 0x98, 0x45, 0x65, 0xb3, 0xb4, 0xba, 0xcc, 0x43, 0xe6, 0x9b, 0x5a, 0x90, 0x7a, +0x83, 0xcd, 0x71, 0xdb, 0x74, 0x9d, 0x47, 0xe8, 0x11, 0x2d, 0x30, 0x03, 0x42, 0xe9, 0x24, 0x8c, 0xdc, 0xb5, 0x07, 0xd7, 0x66, 0x95, 0xbb, 0x2b, 0x09, 0xab, 0xd0, 0x25, 0x0d, 0xf5, 0x2c, 0x4a, 0xa7, 0xf4, 0xfd, 0x7f, 0x6b, 0x2f, 0x1c, 0x7c, +0x0f, 0x54, 0x10, 0x78, 0xd3, 0xaa, 0xc8, 0xc9, 0x2e, 0x67, 0x7e, 0xe2, 0x01, 0x82, 0x46, 0x77, 0xe5, 0x6f, 0x6d, 0x75, 0xb1, 0xcf, 0x62, 0x04, 0x6c, 0xbd, 0x53, 0xc6, 0x05, 0x4d, 0xe3, 0x91, 0x8b, 0xe1, 0xbc, 0x1d, 0xc1, 0x3f, 0x85, 0xb8, +0xb9, 0xae, 0xf8, 0x08, 0x23, 0x56, 0x60, 0xf3, 0x1f, 0xf1, 0xf7, 0xde, 0x38, 0x57, 0xf0, 0x6a, 0xa4, 0x28, 0x3b, 0xff, 0x4f, 0x0c, 0x06, 0x00, 0x0b, 0xa8, 0x1e, 0x15, 0xd4, 0x52, 0x3d, 0x7b, 0x3e, 0xed, 0x18, 0x81, 0x63, 0xdd, 0xc2, 0x5c, +0xdf, 0xaf, 0x9f, 0xfe, 0x0e, 0xc4, 0xe4, 0x48, 0xfb, 0xc3, 0x4b, 0x20, 0x8d, 0x44, 0x17, 0x0a, 0x5f, 0x99, 0x31, 0x2a, 0x86, 0x79, 0x26, 0xfa, 0x1d, 0x5f, 0x7b, 0xb9, 0x34, 0xf7, 0xbe, 0x60, 0xea, 0x31, 0xe5, 0x4c, 0xa6, 0xe1, 0x88, 0x9a, +0x03, 0xba, 0xf0, 0x1f, 0xcb, 0xf2, 0x1b, 0x33, 0xa8, 0xdf, 0x66, 0x87, 0x57, 0x68, 0x92, 0x29, 0x77, 0x78, 0x76, 0x36, 0x71, 0x4d, 0x2a, 0xe2, 0xd6, 0x7e, 0x8a, 0x8f, 0x51, 0x7f, 0x73, 0xcf, 0x6e, 0x5b, 0x26, 0x86, 0x25, 0xd1, 0xb0, 0xa5, +0xb6, 0xbf, 0x42, 0x94, 0x65, 0x45, 0x6c, 0x27, 0x20, 0xc5, 0x79, 0xab, 0x2d, 0xaf, 0x9c, 0xfd, 0x5a, 0x1e, 0x48, 0x82, 0x62, 0x7d, 0xa0, 0xfe, 0x81, 0x23, 0x95, 0xad, 0x12, 0x89, 0xef, 0xf3, 0x83, 0x0b, 0x84, 0xa9, 0x8b, 0x72, 0x39, 0x24, +0x01, 0xa2, 0x17, 0x5e, 0x64, 0x21, 0x9f, 0x2f, 0x1a, 0xc2, 0xb1, 0x40, 0xd0, 0x96, 0xe3, 0xd2, 0x0d, 0x1c, 0xb5, 0xf4, 0x06, 0xf6, 0x49, 0xe8, 0xe6, 0x93, 0x07, 0xf9, 0x5c, 0x11, 0x74, 0x2c, 0x8d, 0xe0, 0xb7, 0x98, 0xde, 0x54, 0x55, 0xd9, +0xaa, 0xcc, 0xdd, 0xdb, 0x6b, 0x6f, 0x52, 0xfc, 0x58, 0xcd, 0xee, 0xc7, 0x85, 0x61, 0xa3, 0x10, 0x4b, 0xb2, 0xca, 0xd3, 0x7a, 0x32, 0x97, 0xf8, 0x3e, 0xa7, 0x99, 0xf1, 0xc6, 0x91, 0x59, 0x00, 0x80, 0x05, 0x8c, 0x3d, 0xce, 0x70, 0x14, 0x6d, +0x53, 0x69, 0x04, 0xbc, 0xc4, 0x02, 0x41, 0x28, 0xeb, 0x37, 0xac, 0x3c, 0x4a, 0xc1, 0x08, 0x47, 0x7c, 0x4e, 0x13, 0x5d, 0x9d, 0xd7, 0xb4, 0x63, 0xc0, 0x22, 0xd5, 0x19, 0xd8, 0x2e, 0x0e, 0xa1, 0x3a, 0xfa, 0xa4, 0xc8, 0x43, 0xc3, 0x90, 0x35, +0x0f, 0x0c, 0x15, 0xd4, 0xbd, 0x4f, 0x9e, 0x0a, 0xe9, 0xe7, 0x16, 0x67, 0x2b, 0x3b, 0x30, 0x38, 0x6a, 0x09, 0x46, 0x44, 0x18, 0xe4, 0xff, 0xf5, 0xda, 0x8e, 0xdc, 0xb8, 0xb3, 0xc9, 0x3f, 0xae, 0xfb, 0x75, 0xbb, 0xed, 0x50, 0x9b, 0xec, 0x56, +0xe8, 0x2a, 0x4f, 0x17, 0xfe, 0xdd, 0x6a, 0x7d, 0xa3, 0xb6, 0xc7, 0x0d, 0xad, 0xaa, 0x5e, 0x25, 0xc4, 0x68, 0x21, 0xd6, 0x92, 0x77, 0xb1, 0x91, 0x60, 0x31, 0x53, 0xe4, 0xff, 0x0f, 0xb9, 0x62, 0x66, 0x2f, 0x28, 0x93, 0x86, 0xa2, 0xc5, 0x42, +0xec, 0xf0, 0x59, 0x5c, 0x32, 0xca, 0x38, 0x08, 0x35, 0xb4, 0xb2, 0x3d, 0x0a, 0x05, 0xac, 0x3f, 0x4e, 0x8b, 0x5f, 0xc3, 0xdc, 0xe5, 0x58, 0x80, 0x2e, 0xa7, 0x5b, 0x43, 0xc2, 0xa6, 0x70, 0xde, 0x82, 0x8f, 0x65, 0x52, 0xf7, 0x20, 0x6c, 0xfc, +0xd5, 0xef, 0xd4, 0x22, 0x9c, 0x6f, 0x94, 0xc6, 0x7b, 0xf1, 0xb7, 0x39, 0xcc, 0xea, 0x7a, 0x69, 0xcd, 0x30, 0xf3, 0x15, 0x79, 0x50, 0x3c, 0x36, 0x10, 0x8e, 0x54, 0xd9, 0x7f, 0x26, 0xc0, 0x01, 0x12, 0xd2, 0x44, 0xfa, 0x98, 0x72, 0x0e, 0xbb, +0xe6, 0xf6, 0x7c, 0x85, 0x00, 0x9d, 0xa5, 0x4b, 0x5d, 0x34, 0x40, 0x8c, 0x4a, 0x9e, 0x1f, 0x3a, 0x6e, 0x41, 0x8d, 0x37, 0x57, 0x29, 0x16, 0x46, 0xc1, 0x75, 0xbf, 0x09, 0xd3, 0xa9, 0xe1, 0x87, 0xcf, 0xa1, 0x33, 0xe3, 0x4c, 0x7e, 0x95, 0x1e, +0x74, 0xd1, 0x56, 0xe7, 0x9a, 0xe2, 0x48, 0x9b, 0xee, 0x9f, 0xdf, 0xb0, 0x8a, 0x1d, 0x67, 0x73, 0x83, 0x19, 0x71, 0x2c, 0xe0, 0x04, 0xf4, 0x97, 0xae, 0x45, 0x51, 0x27, 0xd0, 0x49, 0x84, 0x76, 0x1c, 0x61, 0x2b, 0x99, 0x3b, 0x5a, 0xb5, 0x63, +0xbe, 0x2d, 0x3e, 0x24, 0xba, 0xfb, 0xc8, 0xda, 0xa8, 0x6b, 0x18, 0x6d, 0x1b, 0x64, 0xbd, 0xce, 0xbc, 0x89, 0x0b, 0x14, 0x11, 0xf2, 0xdb, 0xab, 0xe9, 0xd7, 0xf9, 0x0c, 0xcb, 0x03, 0x55, 0x78, 0xeb, 0x07, 0xfd, 0x81, 0x1a, 0xf5, 0xf8, 0xc9, +0x02, 0x47, 0xd8, 0xaf, 0x13, 0x90, 0xed, 0x23, 0xa4, 0x06, 0xb8, 0x96, 0x88, 0xb3, 0x4d, 0xa0, 0xd4, 0xb6, 0x12, 0xa2, 0xea, 0x10, 0x02, 0xaa, 0x58, 0x86, 0xb8, 0xe7, 0x60, 0x24, 0x27, 0x1a, 0x4a, 0x8f, 0x70, 0x5e, 0x1e, 0xeb, 0xf4, 0xbd, +0x91, 0x8e, 0x0d, 0x5c, 0xb7, 0x75, 0x6c, 0xde, 0x2e, 0x32, 0x6a, 0x16, 0x0e, 0x79, 0x3a, 0xbb, 0x4c, 0x56, 0xd3, 0xc6, 0x81, 0x2d, 0xd5, 0xa0, 0x4b, 0x74, 0x54, 0xf2, 0x11, 0x29, 0xfc, 0xf7, 0xa1, 0x39, 0x3b, 0x76, 0xce, 0x71, 0xb4, 0x14, +0x3e, 0x05, 0x34, 0xec, 0x17, 0x90, 0x0f, 0xc7, 0x69, 0xb2, 0x6e, 0x8d, 0x4e, 0x2f, 0x52, 0x45, 0xfd, 0xd1, 0xff, 0xbf, 0x65, 0xac, 0x73, 0x35, 0xf8, 0x2a, 0x7c, 0x5d, 0xcd, 0x8a, 0xf5, 0xf9, 0x6d, 0xe5, 0x82, 0x3f, 0xdb, 0xf3, 0x48, 0x7b, +0x07, 0x25, 0x22, 0x2b, 0xcc, 0x9f, 0x7d, 0xdc, 0x20, 0xcf, 0x08, 0x38, 0x3d, 0x50, 0xaf, 0x2c, 0xa9, 0xd2, 0x83, 0xc2, 0x99, 0xe6, 0xe0, 0xc0, 0x94, 0x6b, 0x1f, 0x19, 0xb5, 0x18, 0xc3, 0x89, 0xd8, 0xda, 0x5b, 0x84, 0xca, 0x9d, 0x09, 0xae, +0xa3, 0xb0, 0x7f, 0x4d, 0x1d, 0xc9, 0x03, 0xad, 0x15, 0x8c, 0xa8, 0x46, 0x0b, 0x01, 0x49, 0x31, 0xa7, 0x37, 0x42, 0x3c, 0x04, 0x7e, 0x85, 0xd7, 0x33, 0xa4, 0xdd, 0x1c, 0xf6, 0x43, 0x78, 0x9c, 0x72, 0x26, 0xf0, 0x5a, 0xa6, 0xe9, 0x00, 0xfb, +0xd0, 0x8b, 0x77, 0xe2, 0x9e, 0xb9, 0x55, 0xc1, 0x47, 0x97, 0x4f, 0xc5, 0xe8, 0x61, 0x13, 0xdf, 0xe1, 0xf1, 0xbe, 0xc8, 0xd6, 0x67, 0xcb, 0x36, 0x30, 0x44, 0x41, 0xee, 0xfe, 0x68, 0x80, 0xed, 0xe3, 0x9a, 0x51, 0x23, 0xa5, 0xab, 0x88, 0x96, +0x7a, 0xbc, 0x9b, 0x5f, 0x92, 0xc4, 0xb3, 0x66, 0xb1, 0x87, 0x64, 0xe4, 0x28, 0xef, 0x40, 0x59, 0xd9, 0x63, 0x62, 0x6f, 0x1b, 0x21, 0x0c, 0xba, 0x98, 0x06, 0x95, 0xfa, 0x0a, 0x57, 0x53, 0x93, 0x3d, 0x9b, 0xa3, 0x8b, 0xb3, 0xc5, 0x28, 0x22, +0x41, 0xa6, 0x11, 0x2d, 0x8a, 0x6c, 0xcd, 0x3f, 0x8e, 0x4f, 0xf6, 0xab, 0xc3, 0x83, 0xff, 0x05, 0x0d, 0x6e, 0x15, 0x98, 0x78, 0xc1, 0x35, 0x9e, 0x5b, 0x44, 0xf8, 0xef, 0x26, 0xe0, 0xdb, 0x20, 0xb9, 0xe1, 0xb0, 0xc0, 0xd9, 0x55, 0xfc, 0x33, +0x85, 0x7a, 0x3c, 0x51, 0x50, 0x2b, 0xc7, 0xb2, 0xcb, 0x88, 0x8f, 0x37, 0xc6, 0xb5, 0xf1, 0x3b, 0x9a, 0x76, 0xb7, 0xb8, 0x07, 0x5d, 0x5c, 0x5f, 0x6f, 0xee, 0xad, 0x42, 0x08, 0x16, 0xac, 0xae, 0x99, 0x65, 0x9c, 0xf9, 0x24, 0x1d, 0x3a, 0x04, +0xa2, 0x36, 0xe3, 0xd5, 0x21, 0xe9, 0x62, 0xa7, 0x6b, 0x95, 0xcc, 0x01, 0x46, 0x69, 0x77, 0x84, 0xa0, 0xe4, 0x49, 0x68, 0xbd, 0x87, 0xa8, 0xd6, 0x2f, 0x09, 0x19, 0x70, 0xbb, 0xd1, 0x00, 0x5e, 0xbe, 0x6a, 0x71, 0xfb, 0x7f, 0x2c, 0x1e, 0x53, +0x25, 0x75, 0x10, 0xe6, 0x02, 0x4e, 0xd7, 0x23, 0x48, 0x1a, 0x90, 0x2a, 0xdf, 0xd3, 0x0e, 0xd0, 0xa9, 0xeb, 0x4c, 0xc8, 0x8d, 0x03, 0x72, 0x57, 0xaf, 0x0f, 0xd8, 0xfa, 0x29, 0xe5, 0x73, 0x60, 0xf4, 0x47, 0x80, 0x81, 0x7c, 0x4d, 0xbf, 0x30, +0xca, 0x9d, 0x13, 0x61, 0xea, 0x9f, 0x64, 0x18, 0xdc, 0x40, 0x27, 0x0a, 0x2e, 0xb1, 0xde, 0xb6, 0x31, 0xc4, 0x54, 0x8c, 0x32, 0xf5, 0x1c, 0x89, 0xa1, 0x0b, 0xf3, 0xa5, 0xf7, 0x14, 0xbc, 0x7e, 0x67, 0xba, 0xfd, 0x1f, 0xdd, 0xfe, 0x6d, 0x58, +0x43, 0x56, 0x93, 0xec, 0x1b, 0xb4, 0x45, 0xe8, 0x0c, 0xcf, 0x91, 0x96, 0xf2, 0x39, 0xda, 0xf0, 0xd2, 0x4b, 0x7b, 0x86, 0x4a, 0xc2, 0x59, 0x52, 0x3e, 0x17, 0x06, 0xed, 0x92, 0x63, 0x79, 0x12, 0x5a, 0x38, 0xa4, 0xe2, 0x34, 0xaa, 0x82, 0x66, +0x94, 0x74, 0xd4, 0xc9, 0x7d, 0xe7, 0x97, 0xce, 0x49, 0xd8, 0x4d, 0xd1, 0x0d, 0x8b, 0x5b, 0xd5, 0x1d, 0x07, 0xd6, 0x43, 0xa6, 0xc9, 0xa0, 0x82, 0xba, 0xd9, 0xc6, 0x54, 0xfb, 0x88, 0x35, 0x3d, 0x8c, 0x76, 0x0b, 0xa5, 0xb0, 0xdd, 0x2c, 0xab, +0x71, 0xae, 0xdb, 0xc4, 0xc1, 0x13, 0xda, 0xac, 0x58, 0x5d, 0xce, 0x01, 0x6d, 0x5a, 0x47, 0x7b, 0xf0, 0xa2, 0xf5, 0xcd, 0xf3, 0x57, 0xe1, 0x34, 0xe8, 0x1c, 0xc5, 0x16, 0x41, 0x40, 0x6f, 0xb9, 0xef, 0x2e, 0x30, 0xa8, 0x9f, 0xe4, 0x9e, 0x1e, +0x10, 0xbb, 0xd7, 0x5c, 0x3c, 0x84, 0xd4, 0x39, 0x3f, 0x75, 0x0a, 0xff, 0xad, 0x64, 0xcc, 0x00, 0x46, 0xb1, 0xa3, 0xcb, 0xc7, 0x79, 0xd2, 0x56, 0x0f, 0x5f, 0xbc, 0x1f, 0x2b, 0x1a, 0x25, 0x81, 0xe5, 0x3b, 0xed, 0x03, 0xe9, 0x9b, 0x7c, 0xa7, +0xe2, 0x85, 0xb3, 0xeb, 0x89, 0x98, 0xaa, 0x4c, 0x14, 0x63, 0x6b, 0x90, 0x0e, 0xb8, 0x9d, 0xb5, 0x77, 0x9c, 0x4e, 0x05, 0x27, 0x12, 0x6e, 0xb7, 0x68, 0xe0, 0x2d, 0x20, 0x33, 0x99, 0xdc, 0xc0, 0x2a, 0x31, 0x5e, 0x51, 0xc3, 0x7f, 0x80, 0x73, +0x11, 0x70, 0xea, 0xf4, 0xec, 0x94, 0x48, 0x0c, 0x45, 0xcf, 0x7e, 0x52, 0xaf, 0x6a, 0x91, 0x97, 0xf9, 0x93, 0x78, 0x09, 0x02, 0xfe, 0xfa, 0x69, 0x36, 0x2f, 0x8e, 0xf1, 0x6c, 0xd3, 0x26, 0xc2, 0xb2, 0x96, 0xfc, 0x37, 0x62, 0x06, 0xa4, 0x44, +0x22, 0xe6, 0x59, 0xb6, 0x74, 0x4b, 0x83, 0xfd, 0x38, 0xc8, 0x8a, 0xd0, 0x86, 0x1b, 0xf6, 0x08, 0xbf, 0x42, 0x3a, 0x7d, 0x8d, 0x4f, 0x19, 0xbe, 0x50, 0xa1, 0x53, 0xe7, 0xe3, 0x3e, 0x9a, 0xdf, 0x72, 0xf7, 0x60, 0x67, 0xf2, 0x28, 0x87, 0xde, +0x92, 0xa9, 0xca, 0x65, 0xbd, 0x8f, 0x66, 0x04, 0x23, 0x4a, 0x15, 0x21, 0x29, 0x17, 0xf8, 0x24, 0x32, 0x61, 0x95, 0x55, 0xee, 0x7a, 0xb4, 0x18, 0x4d, 0x66, 0xd2, 0x42, 0x4a, 0x1c, 0x64, 0x88, 0x38, 0x9a, 0xee, 0x78, 0x39, 0x2a, 0xc2, 0x7b, +0xa8, 0xa5, 0x9e, 0x22, 0x1a, 0x2b, 0xb8, 0x43, 0x8d, 0xc7, 0xec, 0x01, 0xd6, 0x36, 0x0b, 0x81, 0x72, 0x1d, 0x35, 0xa7, 0x8c, 0x8b, 0x7f, 0xeb, 0xfc, 0x5b, 0x62, 0x92, 0x9f, 0x6b, 0x7e, 0x08, 0xaf, 0x06, 0xbe, 0x29, 0x0e, 0xc9, 0x5c, 0x96, +0xd4, 0x63, 0x59, 0x57, 0xc4, 0x5d, 0x74, 0xb9, 0x2f, 0xc1, 0xf5, 0xe4, 0xb1, 0x84, 0x3b, 0x25, 0xf1, 0xe8, 0xd8, 0x4b, 0xfd, 0x79, 0xce, 0x0f, 0xcc, 0x90, 0x54, 0x44, 0x1f, 0x48, 0x91, 0xe1, 0x03, 0x11, 0x09, 0x2e, 0xd9, 0x47, 0xf2, 0xac, +0x26, 0xbd, 0x71, 0xa1, 0x24, 0x89, 0xea, 0xd3, 0xaa, 0x52, 0xb0, 0xff, 0xdf, 0x65, 0x67, 0x80, 0x20, 0x12, 0x23, 0x17, 0x28, 0xb4, 0xab, 0xc6, 0x2c, 0xf9, 0xbf, 0xba, 0xdc, 0x2d, 0x73, 0x0d, 0x8a, 0xa6, 0x0a, 0x6e, 0xd5, 0x6d, 0x49, 0xbc, +0xda, 0xad, 0xcd, 0x69, 0x6f, 0x9c, 0x21, 0xa9, 0xbb, 0xa3, 0x3e, 0x8e, 0x3f, 0xf7, 0xfa, 0xd0, 0xa4, 0xa0, 0x87, 0x04, 0x4f, 0xe9, 0x00, 0xf6, 0x07, 0xa2, 0xca, 0x95, 0x46, 0x51, 0x3c, 0x8f, 0x10, 0xf8, 0x61, 0x41, 0x1e, 0x53, 0x7c, 0xe6, +0xef, 0x3d, 0xe3, 0x30, 0xb7, 0xed, 0xd1, 0x13, 0x19, 0xb5, 0x76, 0xf3, 0xe5, 0x86, 0x4e, 0x6c, 0x77, 0x9d, 0x3a, 0x33, 0xae, 0xdb, 0xc0, 0x5f, 0x34, 0x58, 0x4c, 0xfe, 0xc3, 0xe2, 0x32, 0x1b, 0xf0, 0x68, 0xb2, 0x0c, 0x37, 0xcb, 0xe7, 0x98, +0x50, 0x31, 0x83, 0x5a, 0xb3, 0x55, 0x9b, 0x45, 0x27, 0x18, 0x40, 0xf4, 0x56, 0x99, 0x15, 0xe0, 0x05, 0x82, 0xcf, 0x5e, 0x14, 0x7d, 0x60, 0x02, 0x70, 0x16, 0xd7, 0x6a, 0x7a, 0xfb, 0x75, 0x97, 0xc8, 0xde, 0xdd, 0x94, 0x85, 0xc5, 0x93, 0xb6, +0x2a, 0xe8, 0x53, 0xf2, 0x46, 0xeb, 0x6c, 0xda, 0xa5, 0x6e, 0x21, 0x47, 0xe5, 0xc6, 0xdd, 0x4f, 0x44, 0x5d, 0x52, 0x58, 0x57, 0xd4, 0x55, 0xaf, 0xa7, 0xe2, 0x8f, 0x36, 0x10, 0xc1, 0x82, 0x64, 0xfb, 0x49, 0x6d, 0x3e, 0x91, 0xdb, 0x92, 0xa8, +0xfc, 0x15, 0xc0, 0x33, 0x38, 0xee, 0xa0, 0xfe, 0xb8, 0x7f, 0xf0, 0x88, 0xa4, 0xd6, 0x09, 0xa1, 0x4d, 0xc2, 0x6f, 0x5b, 0x14, 0x7c, 0xb7, 0x12, 0x62, 0x9d, 0x25, 0x28, 0x11, 0x0e, 0xf1, 0xf8, 0x75, 0x05, 0xea, 0x30, 0xc3, 0x7b, 0x97, 0x40, +0xe7, 0xd7, 0xd3, 0xb1, 0xdf, 0x5f, 0x9b, 0x02, 0x0b, 0xe3, 0xcd, 0x26, 0x63, 0x66, 0x8b, 0x96, 0xb6, 0xb0, 0x9a, 0x20, 0x13, 0x42, 0xed, 0xcf, 0x73, 0x83, 0xff, 0xbd, 0xbb, 0xad, 0x9c, 0xcc, 0xd5, 0x3a, 0x9e, 0x2e, 0x78, 0x4e, 0x1a, 0xf4, +0xa6, 0x5a, 0x61, 0x98, 0xfa, 0x16, 0xb4, 0x32, 0x65, 0x59, 0xba, 0x18, 0xe4, 0x69, 0x5c, 0x85, 0xf5, 0x34, 0xab, 0xd2, 0x1f, 0xb9, 0x2c, 0x17, 0x8a, 0x01, 0x1b, 0xf9, 0x23, 0x43, 0x51, 0x56, 0x2f, 0xfd, 0x24, 0x31, 0x79, 0xa9, 0xd0, 0x7a, +0xd9, 0x8c, 0x93, 0x0f, 0x77, 0x06, 0x76, 0xc5, 0x19, 0x8e, 0x72, 0x00, 0x41, 0x7e, 0x48, 0x90, 0xe1, 0xc7, 0x86, 0x22, 0xe0, 0x1e, 0x8d, 0x9f, 0x6a, 0x4b, 0x27, 0x3d, 0xa3, 0x29, 0xf6, 0xa2, 0xce, 0x54, 0xf3, 0x94, 0xc8, 0x39, 0x71, 0xca, +0x37, 0x3c, 0xcb, 0x4c, 0xc9, 0x2d, 0x0d, 0x03, 0xef, 0xb3, 0x74, 0x07, 0x04, 0x60, 0x08, 0x84, 0x95, 0x1c, 0x3f, 0xc4, 0xae, 0xe9, 0x2b, 0x5e, 0x0c, 0xb2, 0xbc, 0xbf, 0xaa, 0x81, 0xe6, 0xd8, 0x68, 0x50, 0xb5, 0x7d, 0x80, 0x35, 0x99, 0x87, +0xbe, 0x4a, 0xde, 0x3b, 0xac, 0x89, 0xec, 0xf7, 0xd1, 0x1d, 0x45, 0x0a, 0x6b, 0x67, 0x70, 0xdc, ] + +d0x6a084498=[ 0x47707917, 0x93c0a348, 0xf3579f7e, 0x7a774077, 0x6c42cb50, 0x5ef9aeb9, 0x60e5ea25, 0xd3b8fb13, 0xe1039efa, 0x51372423, 0x9c7cffc1, 0xd3ca2d00, 0xeade48d0, 0x400a8e48, 0xbce14dbf, 0x04618aa3, 0x63fe97d9, 0xb034bad9, 0xf744c3ce, 0xeebfc273, +0x24fc38dd, 0x48bef38d, 0x828fdf30, 0x4311f3b4, 0xe26a3515, 0x638c41ca, 0xa5689a11, 0x1d9a8b1e, 0x27959332, 0x81e674df, 0xedd6699c, 0x6b4aea1c, 0x32bb65e9, 0x1e81f6e2, 0xfcebc3f7, 0x981d7562, 0x114f7c78, 0x2f5338e4, 0x8587fe7c, 0x0cd5f766, +0xd4c20c4c, 0x9b06089e, 0x209db27e, 0xce50a61e, 0x0072d613, 0x0ca72175, 0x7d7f613b, 0x16475d34, 0x2b406454, 0xc2f7876b, 0xdc04a79a, 0x16358b27, 0x9b74de8d, 0xe9b7e33f, 0x5145f230, 0x8a3ba2f5, 0x27e74521, 0x3966b3c3, 0x6c301d43, 0xf45fbe32, +0x4fb6d2c1, 0x36daef4a, 0x1ef320f1, 0x08b47dc5, 0xaddce7d4, 0xc5ffa627, 0xdf1fda66, 0x869c8380, 0xb35d1136, 0xcd4bdbe2, 0x04135cb0, 0x791eeb98, 0xeecd1460, 0x8952091a, 0x0fbc5c89, 0x6f2b60bf, 0x71d8404e, 0x4702af04, 0x3d073960, 0xb32fc725, +0x4cdf792e, 0x4419d2f8, 0xa10910b2, 0x796c3d8b, 0xfb9134a8, 0x5d900556, 0x0bddd62a, 0xdc767189, 0x8d3383b9, 0xb427e669, 0xe510c24a, 0x35b344a5, 0x64846086, 0x23f41991, 0x4ba58e71, 0xe60bbfb6, 0xdf6d0c75, 0x5de2d345, 0x679f1d7a, 0x85f5286f, +0xca43faae, 0x2386cf82, 0xb0466cca, 0x2b32b247, 0x436325a7, 0x155c20c8, 0x67edcb69, 0xaad4c698, 0x391465d0, 0xcd390df1, 0x3a7dce3f, 0x94ba5417, 0x75cb1cfe, 0x76d06102, 0x3e6e928f, 0x2c3a930b, 0xb880c71c, 0xa673e7ed, 0xbffa3043, 0x7d0db728, +0xfbe3e2bb, 0x48cc259e, 0x55247893, 0x72b1eba1, 0x8e5a2856, 0x2f21eef7, 0x9f67823d, 0xe9c5352c, 0x522c59df, 0xa9cfbb64, 0xdb0c86d6, 0x563f056f, 0xd817fb2a, 0xd8652d39, 0x08c6abd6, 0x82fd0923, 0x4cadaf3d, 0x71aa965d, 0xb73c9b95, 0x077af75f, +0x4078585b, 0xd0a386ef, 0x525e8fcc, 0x00000000, 0xce22700d, 0x0fce8a9a, 0x6b383c0f, 0xf42d6821, 0xf03e3491, 0xc9588752, 0xff826818, 0xa260bb5d, 0xdb7e50c5, 0x8194a2cc, 0x1989d7ae, 0xaec79a28, 0x8920df09, 0x7e641cc7, 0x986fa371, 0x152ef6db, +0xadae31c7, 0x0708214c, 0xa17bc6a1, 0xc92a5141, 0xe5621459, 0x7a059664, 0x685197e0, 0xc6e4dbdb, 0x12540184, 0x97d3fff8, 0x32c9b3fa, 0x113daa6b, 0xf88a4954, 0x285b19a8, 0xeda4bf8f, 0x36a83959, 0x1226d797, 0x31a01815, 0x7e16cad4, 0xeaac9ec3, +0x564dd37c, 0x2c484518, 0xc58d7034, 0xf8f89f47, 0x4bd75862, 0xd7aba7a3, 0x72c33db2, 0x97a129eb, 0xaaa6108b, 0x598359e6, 0xaeb54c3b, 0x86ee5593, 0x1a92aa52, 0x0baf0039, 0x5e8b78aa, 0xb8f2110f, 0x5a98241a, 0x64f6b695, 0x9c0e29d2, 0xe17148e9, +0x4fc404d2, 0xb74e4d86, 0x2829cfbb, 0xd4b0da5f, 0x90dbdeb4, 0xc1ecfa97, 0x3d75ef73, 0x20ef646d, 0xbb9bbae0, 0xb455307a, 0xbbe96cf3, 0x9f15542e, 0x19fb01bd, 0x76a2b711, 0xf73615dd, 0xa51a4c02, 0xc19e2c84, 0xd0d150fc, 0x446b04eb, 0xc2855178, +0x248eeece, 0xa60131fe, 0xc6960dc8, 0xa2126d4e, 0x93b2755b, 0xa9bd6d77, 0x5aeaf209, 0xe67969a5, 0xfff0be0b, 0xe218e306, 0xd7d971b0, 0x682341f3, 0x94c88204, 0x60973c36, 0xf04ce282, 0x1ae07c41, 0xbc939bac, 0x031b7dfc, 0xbf88e650, 0x90a908a7, +0x3e1c449c, 0x59f18ff5, 0x1de85d0d, 0x6f59b6ac, 0x0369abef, 0x75b9caed, 0x31d2ce06, 0x35c192b6, 0xf325496d, 0x8d4155aa, 0x3a0f182c, 0xca312cbd, 0x5556ae80, 0xfc9915e4, 0x8a4974e6, 0x8e28fe45, 0xd14cfcab, 0x24bba40f, 0x0e89f239, 0xbf6a713f, +0xef149a39, 0x555bffa5, 0x6cfafe00, 0xff13496b, 0x907d33aa, 0xf346c8c6, 0xee5c6d6c, 0x7cfd2d52, 0x76193c9d, 0x47805f63, 0x9ef4c193, 0xf72b2b30, 0x813217ad, 0x2dcb3101, 0x92a1403e, 0x02dc7394, 0xc9734da2, 0x0148f755, 0x3dcce253, 0xc2dfab38, +0xdae01a31, 0x9410d05c, 0x7db5da07, 0x541308f0, 0xa1e45054, 0xa9dc320f, 0x29a6d2f7, 0xea318e9a, 0x855ff45b, 0xd9749ef0, 0x8d679600, 0x93e9b76b, 0xd5211f5d, 0x5fbfee6a, 0x366004c9, 0x0fc1056c, 0x4a9d299b, 0xb4c697a5, 0xd2d8786a, 0xce8a2a95, +0x51361c53, 0x8fbbe594, 0xaa48b6ce, 0x7f69a993, 0x2e5fb5c0, 0x12dba0c6, 0xe0d59f55, 0x3f1091c7, 0xa270d495, 0x9135c4ff, 0xdfc50e92, 0xadb1d1f9, 0x7a4cbd30, 0x807ae0f8, 0x183fb109, 0x95582709, 0xa33823c0, 0xf20e3f93, 0xe5f08bf6, 0x633bfb6c, +0x0838625b, 0x455c2cf7, 0xbe22866a, 0x3728f39c, 0xf9a2d909, 0x0970950e, 0x1d1aa5aa, 0xba4f659c, 0xd7fd6cc9, 0xfdcf3aff, 0x8a9ef137, 0xfe5bbe3e, 0xc526cc0f, 0x6e268d94, 0xc003d8ac, 0x25f3535a, 0x86cb709a, 0xe209ecc1, 0x9784549d, 0x4bd5dece, +0x6db20955, 0x8bd60662, 0x4414dba2, 0xf8ea2e5c, 0xcd1eae54, 0x758db85c, 0x9bd1d530, 0xfc87cdaa, 0x220a346d, 0x6a4b6e62, 0x9c28b207, 0x2342c338, 0x20d647f9, 0x74c54f09, 0x3b7d7231, 0x3a358564, 0x40793854, 0xedc8e9ad, 0xe3411b94, 0x43edbc95, +0x69dfeaa3, 0x0bace69a, 0x06b19062, 0xb61ae431, 0x2f174295, 0x4fb83d38, 0x62730c39, 0x6756189a, 0x1e8e216b, 0x46c8a836, 0x7b044a65, 0x2c83c654, 0xf0d24c07, 0x1007d352, 0xc3975c6d, 0x319963fe, 0x0d1d76f8, 0xe72cf862, 0x42a54bc0, 0x878387cf, +0xa0aca701, 0xa4c144f7, 0x4909ad5a, 0xd469e808, 0xb0ab7453, 0x4c2cb9f9, 0x3e586692, 0xb9dbe15d, 0x7e215ec6, 0xdc518a53, 0x64c29c5b, 0x1bab35c8, 0x219eb0ac, 0xcc565901, 0x5a9afac9, 0x34bc775d, 0x00000000, 0xc6b248ce, 0xb8931608, 0xe19d6800, +0x052514a3, 0xde8df9c7, 0x82a6936c, 0x35f48008, 0xcae7c963, 0xf19abb52, 0x146a30a4, 0x0c5581ad, 0x60af7fad, 0xd3908f3f, 0x56cf7b64, 0x3345106a, 0x79d839f1, 0xfa365dc8, 0xd83c69a5, 0xf5f758a4, 0x6b039937, 0x9d604552, 0x5ef7193f, 0x48415a0f, +0xe9a50a5b, 0xf663dc65, 0xae255538, 0x0ae411cf, 0x70a8acff, 0xec801ef8, 0x07f96737, 0x5846895d, 0x9a992265, 0xd6b59b9c, 0x68971df6, 0xaf6da26d, 0x884282a3, 0xa755c036, 0xc46e3b5a, 0x272f20ce, 0xd0040bfe, 0xc14b2ff9, 0x61e788f8, 0xcfc2ddc0, +0x7890cea4, 0x7274df6b, 0xe6640f37, 0x1522c7f1, 0x7751cbc8, 0x1fc6d63e, 0x4d644eac, 0x16b64330, 0x4ef0ca6d, 0x13935793, 0xf4bfaff1, 0x8417030e, 0x039484c1, 0x8c2f6155, 0x5c2b6aab, 0x1ae3c29d, 0xb1e38306, 0x17feb465, 0xb33ff092, 0x1c5252ff, +0xcbaf3e36, 0x114f2407, 0xb7521364, 0x590e7e08, 0xdba8ed64, 0x1977465c, 0xe4b87ca3, 0x661eefcf, 0xeb7979cf, 0x52a29892, 0x046de3f6, 0xacf926ac, 0x9fbc36c6, 0xe8edfd0e, 0xc7fabf9b, 0xc83bbaf7, 0xb58e60f0, 0x96cca3c8, 0xbcfef5fe, 0xbdb602ab, +0x5d639dfe, 0x658a6b0e, 0x4131cf01, 0x71e05baa, 0x890a75f6, 0x990da6a4, 0x2b7aa163, 0x8ef312c1, 0xfb7eaa9d, 0x733c283e, 0x2a325636, 0x507eeb06, 0x2667d79b, 0x6f6e7ac1, 0x57878c31, 0x38e9f6f0, 0xa894c55a, 0xa589b3a2, 0x320de73f, 0x39a101a5, +0xb27707c7, 0xbb0792c9, 0x53ea6fc7, 0x28ee25a2, 0x3c841506, 0x30d194ab, 0x83ee6439, 0x5bd20d9c, 0xab00419b, 0xdd197d06, 0xa61d3763, 0x984551f1, 0xfca5df23, 0xce16bea3, 0x1c4fe7da, 0x9343e75c, 0x96c13714, 0x60f9c3d0, 0xa1f086dc, 0xe9fdba67, +0xb7224ae1, 0xa4fa6698, 0x6aecd83b, 0x4b8795c2, 0xbd37510a, 0xec7f6a2f, 0xfa25961e, 0x2efc865a, 0xdd46a2d6, 0x8311625c, 0x41928e29, 0x7c3e1406, 0x70ab46d0, 0xf0b8bdf9, 0x1a479eeb, 0xd7db8931, 0xeff5c356, 0x3eae035a, 0x69ee414e, 0x890479b7, +0xffa74656, 0x3b2cd312, 0x6f6e0873, 0x37b981c4, 0x90417e29, 0x19cd3792, 0x65f32394, 0x954b9e6d, 0xc403a548, 0x2269d48c, 0x1fc54ea3, 0x3731b1c8, 0x7321efa9, 0xab6dad3b, 0xe5e0d8bd, 0x79bcc44e, 0x2e74b656, 0xc48b9544, 0xd2595979, 0x4b0fa5ce, +0xa27a2fa5, 0x0a151beb, 0xb7aa7aed, 0xbbb71837, 0x8c86a9ff, 0x7934f442, 0x8f0c0086, 0xa86f344e, 0x3dac9a2f, 0x3d24aa23, 0x702376dc, 0xb12a33d0, 0xf3321480, 0xc896f79e, 0x5442db61, 0x762b0fed, 0xd753b93d, 0x9adc55ce, 0x0088300c, 0xc20bdc79, +0xddce92da, 0xe3609180, 0x898c49bb, 0xc283ec75, 0x24e99db1, 0xde443ba3, 0x5ddd69f3, 0x6ce4a10a, 0xc109450c, 0x287ccf67, 0x8a06e0c2, 0x0a9d2be7, 0x585fb9bb, 0x3139c8f9, 0x03029975, 0x6fe6387f, 0xb228aaa5, 0x6071f3dc, 0xbe35c87f, 0xb420d394, +0xdb4edbe7, 0x38a67a6b, 0x480d3cbb, 0x85191b6d, 0xc1817500, 0xaeef7d73, 0x809bcb25, 0x2d762f23, 0x1f4d7eaf, 0xb8b58142, 0x165afc31, 0x10dab50c, 0x9956fcb7, 0xbebdf873, 0x69667142, 0xcd9c17da, 0x73a9dfa5, 0xb83db14e, 0x57404214, 0xeaff2312, +0xf0308df5, 0x7fb4bd7f, 0x3ba4e31e, 0xbdbf6106, 0xea77131e, 0xabe59d37, 0x52c2925c, 0xa4725694, 0x5b5d20ce, 0x27eb04c4, 0x9fd6b58a, 0x411abe25, 0x06087931, 0x382e4a67, 0xadede406, 0x0680493d, 0xa2f21fa9, 0xdecc0baf, 0x44105e61, 0xa8e70442, +0xd4512048, 0x75299698, 0xe9758a6b, 0xad65d40a, 0x8a8ed0ce, 0x2b7e5612, 0x15d05548, 0xd4d91044, 0xd1d3f000, 0x5bd510c2, 0x4e05458a, 0x0c9552d6, 0xbb3f283b, 0x48850cb7, 0xfaada612, 0xe66a71c4, 0x54caeb6d, 0xcd1427d6, 0xf6b0c4c8, 0x90c94e25, +0xef7df35a, 0x75a1a694, 0x1945079e, 0x76a33fe1, 0xb2a09aa9, 0x4d8fecf3, 0xf9270f6b, 0x22e1e480, 0xc7890c31, 0x9cd42cff, 0x4d07dcff, 0x3e263356, 0x13501c75, 0xcb946eeb, 0x44986e6d, 0x83995250, 0xe06208f5, 0x8013fb29, 0x0f97cba3, 0x99deccbb, +0x050ae044, 0x1cc7d7d6, 0xecf75a23, 0x4e8d7586, 0xae674d7f, 0x51c00b29, 0x038aa979, 0x7a366d37, 0x4712c714, 0x66f1bae1, 0xe6e241c8, 0x5e57c08a, 0xb1a203dc, 0x8693b214, 0x2dfe1f2f, 0x9c5c1cf3, 0xd2d16975, 0xff2f765a, 0x1acfaee7, 0x099fb292, +0xce9e8eaf, 0xe0ea38f9, 0x9a5465c2, 0x9f5e8586, 0x657b1398, 0xf5b25dbd, 0x8f84308a, 0x5d5559ff, 0xa7f8ffed, 0x2461adbd, 0xe3e8a18c, 0xc7013c3d, 0x7cb6240a, 0x276334c8, 0x343328bd, 0x4290175c, 0x0582d048, 0xb4a8e398, 0xd8c4729e, 0xc81ec792, +0x0f1ffbaf, 0xfc2def2f, 0xf53a6db1, 0x85912b61, 0x6c6c9106, 0x00000000, 0x2bf6661e, 0x32b36180, 0x10528500, 0x0c1d62da, 0xf3ba248c, 0x96490718, 0x216b4df9, 0x5edff086, 0x8c0e99f3, 0x13d82c79, 0x861b8218, 0xe568e8b1, 0x0917829e, 0x51483b25, +0x6a64e837, 0xa178b6d0, 0x95c3ae61, 0xd15bc00c, 0x58d789b7, 0x21e37df5, 0x479af718, 0x31b1f8f5, 0x16d2cc3d, 0xf9af3f67, 0x93cbd750, 0x34bb18b1, 0x323b518c, 0xdbc6ebeb, 0xd84c4292, 0x7abe5d3b, 0x42182750, 0x524aa250, 0x66798aed, 0xcb1c5ee7, +0x28f4ff6b, 0x57c87218, 0xf638f4c4, 0x63fb5aa5, 0x7f3c8d73, 0x15586544, 0x63736aa9, 0xa770cfe1, 0x11adc049, 0x79007919, 0xc44d503e, 0xb9e6b4cd, 0x94125380, 0xc686fd95, 0x3eec27da, 0x96d9fe2b, 0xc4c4b9bc, 0x3e928aaf, 0xc2a489fd, 0x6c7889cf, +0x061e9d34, 0x7d5ca004, 0xbbda5d91, 0x920cceb4, 0xede56e6e, 0x3e1b632d, 0x563f33ff, 0x7f1ee42d, 0x83a10efd, 0x023ce95c, 0x50d6ea3c, 0x7989909b, 0x45d0b79f, 0x7fe9a0da, 0x3cae63f3, 0xeb855e2f, 0xd135a0e8, 0xf89d9eb8, 0x6a18b98e, 0xc0e6cdd4, +0x045cd91d, 0xf814773a, 0xd14b0d9d, 0xd5e09077, 0x471b1a34, 0xb99819b8, 0xc0118923, 0xfe0aea0e, 0x521d4797, 0x3a391745, 0xf86ada4f, 0xac6900ec, 0x02424429, 0x38f2baee, 0x13ef8460, 0xfefdaef9, 0x4792f3b6, 0xc09860a1, 0xa835d9f1, 0xe9305ef1, +0x2bea7a79, 0xc2da2488, 0x387b536c, 0x927263c1, 0xd1bc496a, 0x903027e8, 0x4347c329, 0xbb53b413, 0x295f7aa7, 0x173ab4ff, 0xd380a036, 0x6ecd8911, 0xbdc4c0a5, 0x45595e1d, 0xfe83038c, 0x52ea0360, 0x417b2a75, 0xbba4f0e4, 0x3e65ce58, 0x6c8fcd38, +0xbd4d2927, 0x3ace53b2, 0x112429cb, 0xfcbfead0, 0xaea2ad47, 0x5263eae2, 0x6e3acde6, 0xd30949b4, 0xbf0f6d0e, 0x4765b741, 0x15065da3, 0xd7dc792b, 0xe94ef384, 0xbd338452, 0xd1c2e41f, 0x02cbadab, 0x8328e77f, 0xbf86848c, 0xed9bc31b, 0x83dfa388, +0xeb721ad8, 0x904e8a9d, 0x7dabe4f3, 0x6aeffd79, 0x5403daa3, 0x2b6393fb, 0x547d77d6, 0x2921d7d2, 0xef2ec3c5, 0x43b087de, 0xfc360352, 0xaa80d92f, 0x007ead75, 0x962ebadc, 0x418c6e82, 0xfaa177e4, 0x3c278a71, 0x7dd54986, 0x92852736, 0x682450d2, +0x388c179b, 0x7f604958, 0x02b500de, 0x6eb32464, 0x56419e8a, 0x069774b6, 0x15f11954, 0x43396e5c, 0x158fb421, 0x6c0624ba, 0xd7a2d45e, 0xd75590a9, 0x68d31425, 0xae2b44c5, 0x6e446093, 0x56b6da7d, 0x2f41e793, 0xeb0cb7ad, 0x13912915, 0xaedc0032, +0x90b9ce6a, 0x6a91500c, 0x87837a95, 0x5021aecb, 0xac17ad99, 0x43ce2aab, 0xfcc147a5, 0xfc48ae27, 0x17cdf008, 0x06e9d9c3, 0x1578f0d6, 0x946cfef5, 0xef506eb0, 0x54f49e54, 0x87fdd7e0, 0x85367a4b, 0x7d220d71, 0x1744198a, 0x56c87708, 0x797ed46c, +0xebfbf35a, 0xd377e4c1, 0xc4ba14c9, 0xc6f850e0, 0x816aa356, 0xfadfda91, 0x13666de2, 0xc671b962, 0x949bba02, 0xd3fe0d43, 0x45ae1aea, 0x6a6614fb, 0x4527f368, 0x41f2c3f7, 0xe9c71a06, 0x3c592704, 0x81e34ad4, 0xc433fd4b, 0xefa72a47, 0x115a84be, +0xb911f03a, 0x0089e982, 0x00f744f7, 0x2b1d3e8e, 0x50a84749, 0x8548d73e, 0xbdba6dd0, 0xed122a99, 0x06603041, 0x11d36d3c, 0xc22d607f, 0x819de7a1, 0xf8e333cd, 0xaafe745a, 0x85c13ebc, 0x3cd0ce86, 0xc60f1417, 0x7bb579c7, 0x685afda7, 0x2d7d0ecf, +0xac9e441b, 0x90c7631f, 0x7b3c9045, 0xd59e3d02, 0xfe74477b, 0x870a9317, 0x965017a9, 0x505f03be, 0x87743e62, 0xe9b9b773, 0x04d5309f, 0xae55e9b0, 0x47ec5ec3, 0x41058700, 0x04227468, 0x81140e23, 0xed6c87ec, 0x00000000, 0xd56979f5, 0x5294ae15, +0x7bcbd4b2, 0xaa779dd8, 0xb96f5d4f, 0x548a3321, 0x29d69325, 0xbff829f9, 0x79f73dee, 0x7b423d30, 0x94e51777, 0xaa0930ad, 0xefd98732, 0x2fc80e11, 0x85bf93c9, 0xfa289e66, 0xc06f2456, 0x29a83e50, 0xbb2d1966, 0x2d8a4a38, 0x1318c097, 0xfa563313, +0xc253cd0a, 0x2d03a3ba, 0xa8bc3073, 0x3a47ba30, 0xd72b3ddc, 0x17b35d7d, 0x3805fe19, 0x83564a0a, 0xbf71c07b, 0x2b94d70c, 0x2fb6a364, 0x7f970daf, 0x6cf1604d, 0xd517d480, 0x3ab0fec7, 0x2f3f4ae6, 0xa84b7484, 0x2df4e74d, 0x96a7535e, 0x92fb8a43, +0x04ab9dea, 0xace0e96e, 0x68adb950, 0xa8c29d06, 0x6d77f3ae, 0xc970bd12, 0xc97f4c8c, 0x5e738c81, 0xe41f3e6e, 0x650d3f0f, 0x5952dcb9, 0xa4074ebc, 0x43c53001, 0x731c0ffd, 0x21e95f36, 0xa7da0e6f, 0xefb74382, 0xf20e0e9c, 0x51281018, 0x7f952229, +0x04f3e175, 0x33047f2f, 0x85e1e014, 0xd71b4141, 0x55dbf16d, 0x2ebd3231, 0x6d780230, 0xba6cb2ef, 0xac7d821d, 0x29939397, 0xc62b218b, 0x55d400f3, 0xb9b1f23c, 0x6502ce91, 0x4c9eac98, 0x0c892dd4, 0x5606b1be, 0xce5e1cb4, 0xf520af3a, 0xb6e59f3b, +0x113060ca, 0x52faa155, 0x8e499df8, 0xafaf3350, 0x0f5b9c99, 0xce51ed2a, 0x12ed2019, 0x072ea1a6, 0x4862bc73, 0x2d6072e2, 0x7c4862fa, 0x8ab58d13, 0xc5f66158, 0x9cab4c7f, 0xd035e0e7, 0x89673c5e, 0x6a56a396, 0x56094020, 0xd03a1179, 0x5127e186, +0xf9a67370, 0x03d2b14d, 0x9f79fd32, 0x3c501228, 0x30d6ce62, 0xb2167e4e, 0xab5323bb, 0x8968cdc0, 0xec6a0351, 0x194aac6b, 0x3f8d52fb, 0x330b8eb1, 0x4bb00d3e, 0xcd8cadf9, 0x2eb2c3af, 0xc5f990c6, 0x5e7c7d1f, 0xa0f4afc9, 0x4736d174, 0x6ea542e3, +0x5daecc52, 0xeb4b5369, 0x161130f2, 0x94de7140, 0x5da13dcc, 0xd3e751aa, 0x19455df5, 0x77e01f16, 0x4017814c, 0x8d9b2cb5, 0x22341fe5, 0x21e6aea8, 0x9ca4bde1, 0xe33e6e56, 0xdcbccd33, 0xdcb33cad, 0x62239ea9, 0x0ba87dec, 0x1db94d1e, 0x000ff19e, +0xc624d015, 0xe410cff0, 0x8d94dd2b, 0x4c915d06, 0x2a4ed344, 0x66d07fdc, 0xbd421349, 0x7432ae5b, 0x087acca1, 0x902d9035, 0x811df0ff, 0x902261ab, 0xb6ea6ea5, 0xcaa20c5f, 0x7313fe63, 0x34252f17, 0x9f760cac, 0xfd5a639b, 0x30d93ffc, 0x0ba78c72, +0x66df8e42, 0xa88e6368, 0x37f79e5a, 0x3b7eb38e, 0x401870d2, 0xdb926c95, 0x25154fdd, 0xc105802d, 0x86335159, 0xe7cd8f23, 0x8aba7c8d, 0xf9a982ee, 0x9b85edd9, 0x08753d3f, 0x4bbffca0, 0x9858ad0a, 0x97033193, 0x2d6f837c, 0x04fc10eb, 0x93ff2178, +0x7c479364, 0x78bb838f, 0xbe90a204, 0x743d5fc5, 0xac727383, 0x15c381bf, 0xcd835c67, 0x1e6bfc53, 0xcaadfdc1, 0x7f9ad3b7, 0x26c80f0e, 0xfe872348, 0x251abe43, 0x43cac19f, 0x2a4122da, 0x70cebeb0, 0xd3e8a034, 0xe0ecdf1b, 0x82cf41b2, 0xefb8b21c, +0xfa7b33a3, 0xb2198fd0, 0xbd4de2d7, 0xe899e224, 0x61f12fe4, 0x113f9154, 0x0c86dc4a, 0x342ade89, 0x3f82a365, 0xc2d8c0fe, 0x03dd40d3, 0x4f4c1dd5, 0x1a97ecb8, 0x622c6f37, 0x26c7fe90, 0x1e640dcd, 0xe89613ba, 0xa3261e84, 0x52f550cb, 0xfe88d2d6, +0x12e2d187, 0xf201ff02, 0x61fede7a, 0x77efee88, 0xba634371, 0x6a595208, 0xa408bf22, 0x223bee7b, 0xf1d34e4f, 0x7b6932c2, 0xdf618de0, 0xa7d5fff1, 0x6eaab37d, 0xb1c4cf03, 0x9b8a1c47, 0x7b66c35c, 0x698412db, 0x38a3f35d, 0x85ee118a, 0xd840ddd8, +0x486d4ded, 0x0f546d07, 0x38ac02c3, 0x4f43ec4b, 0xd714b0df, 0xec65f2cf, 0x3c5fe3b6, 0xdb9d9d0b, 0x3b714210, 0x94d180de, 0xeb44a2f7, 0xbe9f539a, 0x1db6bc80, 0xf6f21e77, 0x44e46039, 0x82c0b02c, 0xafa0c2ce, 0xe0e32e85, 0xe7c27ebd, 0xc10a71b3, +0xf6fdefe9, 0x93f0d0e6, 0xab5cd225, 0xd4c9f00c, 0x299c6209, 0x161ec16c, 0xb9be03a2, 0x07215038, 0x1a981d26, 0xf52f5ea4, 0xb1cb3e9d, 0xa0fb5e57, 0xf1dcbfd1, 0x00000000, 0x5a806df4, 0x595d2d27, 0x473920ea, 0x970cc00d, 0xdf6e7c7e, 0x5a8f9c6a, +0xa329ef1a, 0xa88192f6, 0xd4c60192, 0xfa74c23d, 0xb538dfe8, 0x81120161, 0x698be345, 0x15cc7021, 0x8e466c66, 0x70c14f2e, 0x98575c94, 0xd84f2c46, 0x863ca0c7, 0xfd559205, 0x37f86fc4, 0x78b47211, 0xe3319fc8, 0x44eb91a7, 0xb5372e76, 0xc2d73160, +0x4af2d26b, 0x72d9f704, 0xd8d2d590, 0x7907632c, 0xf0aa2c52, 0x42c3c4d0, 0xde9eb586, 0xf6e64c44, 0xa4765439, 0x33f5b147, 0x95bb9e64, 0x7ca481a9, 0xd7785ab4, 0x322248ce, 0x05a3e285, 0xfed75aff, 0x29af004b, 0xa1d5b6bc, 0x6165a93a, 0xad90bb0b, +0x8273db56, 0xa3edcda6, 0x6abb3d12, 0xdaeaae8a, 0x2878f9c2, 0x9783e57e, 0x15f03e28, 0xcd22ebb8, 0xd54021ae, 0x9fb2f3c5, 0x0e7d76ad, 0x1b8d4885, 0xafa8c011, 0x50a86367, 0x2049ef79, 0x48caa971, 0x99fe93d3, 0xb3be110b, 0xc6fc7f90, 0x8dd95472, +0x35b9d151, 0x4e86c967, 0xb61df38e, 0x03ef8293, 0x843fbb40, 0xd6afa33d, 0x4d694bf4, 0xa799d6aa, 0xe12e0976, 0xdd713715, 0x365653c2, 0x00000000, 0x3a135e75, 0x8607c05a, 0x1e2eaa00, 0xcab97227, 0xc167e60f, 0x946c67ed, 0x491d50f8, 0xeb2764d7, +0x635dd220, 0x126ba7b7, 0xccf51231, 0xf17dd5db, 0xa9e4a007, 0xbb8f07b0, 0xf731b5cd, 0x301a33d4, 0x382b256f, 0x68834608, 0x23a66dea, 0x161fbcbb, 0x589975dc, 0x1427c7a1, 0x6729c92c, 0xf509ced7, 0xb1866a11, 0x27d276e6, 0x01d7f989, 0x8a42cded, +0x0faa8f24, 0x0d92f43e, 0x02387b1a, 0x6954bf81, 0xae7f3998, 0x5ced6ed0, 0x60b250b3, 0x9e650a4c, 0xe316726c, 0xe2c18be5, 0x17c84532, 0x40fbbfca, 0x64c64bbf, 0x47602655, 0x2a4082d8, 0x25ea0dfc, 0x7ae8e1bf, 0xc4c4048a, 0x98296a5a, 0x56e40371, +0x079b999f, 0x887ab6f7, 0x730e0e8d, 0x0a096da1, 0x93f7fe72, 0x19b5339f, 0xaa0b2294, 0xc956f0b4, 0x90187ce1, 0x46b7dfdc, 0xc513fd03, 0xeaf09d5e, 0x3c5f3e63, 0x5290187d, 0xe91f1fcd, 0xbdc367a6, 0x628a2ba9, 0x4b252be2, 0xf4de375e, 0x4f5130ee, +0x7f4b033a, 0x9bc6e8c9, 0xe7626960, 0xba58fe39, 0xcb6e8bae, 0x11842524, 0xed6b04c1, 0xc881093d, 0x3781aa4b, 0xf89b3ae9, 0x0c450db7, 0x1c16d11a, 0x22719463, 0x7b3f1836, 0xd2dbb831, 0xf2925748, 0x2ddb1b47, 0xf345aec1, 0x3bc4a7fc, 0xa23a342f, +0xac474282, 0x5f02ec43, 0x5347e1f4, 0x45585d4f, 0x550b81e2, 0x8e36d6e1, 0x5d3a9759, 0x1053dcad, 0x1a5ab10c, 0x78d09aa5, 0xe8c8e644, 0xd1343aa2, 0x8fe12f68, 0x3e674579, 0x219e16f0, 0xdb3d5703, 0x3fb0bcf0, 0x594e8c55, 0xee848652, 0x75426e9b, +0x777a1581, 0xe6b590e9, 0x346e28d8, 0x1862ca16, 0xb7ca0a07, 0x517f9aee, 0x9c5d7156, 0x54dc786b, 0x2fe3605d, 0xa833598e, 0xbe2ce535, 0xb9b77caa, 0x04741b0c, 0x819c59c5, 0xff00a376, 0x6cf75d04, 0xabdcdb1d, 0xb4258894, 0x5aa10ec6, 0xc72b8619, +0xef537fdb, 0x6ecf261e, 0xb269e882, 0x85e842c9, 0x87d039d3, 0xb8608523, 0x09e6ef32, 0xd0e3c32b, 0x7e9cfab3, 0x31cdca5d, 0x6d20a48d, 0xc288649c, 0x6511b236, 0x6b6cc49b, 0xbffb1cbc, 0xa64e2f23, 0x71367597, 0xfd38d86c, 0xfcef21e5, 0x8b953464, +0x9d8a88df, 0x91cf8568, 0x5733faf8, 0x083116bb, 0x412c4643, 0x4cbeb27d, 0xe48debf3, 0x66fe30a5, 0x2e3499d4, 0x89ad4f7e, 0x76adec08, 0xfb74b87a, 0xecbcfd48, 0x1dc12893, 0x96541cf7, 0x1ff95389, 0x43143d59, 0xe55a127a, 0xd497d827, 0xf94cc360, +0x0bde9428, 0xb5f2711d, 0xc35f9d15, 0x74959712, 0xcecd692b, 0xb0519398, 0xa5a1adb0, 0x70e18c1e, 0x3d88c7ea, 0x13bc5e3e, 0x7d737820, 0xa0024f35, 0x243df475, 0xe0f9f0ff, 0x448fa4c6, 0x064c6016, 0x6f18df97, 0x26058f6f, 0x5b76f74f, 0xcf1a90a2, +0xd30c41b8, 0x2b977b51, 0xbc149e2f, 0x8c0eadfb, 0x39fcdce6, 0xfaa341f3, 0x83a422df, 0xdf494c0f, 0xd9052c19, 0xdca6ce9c, 0x922007fb, 0x9a111140, 0x804ba04c, 0xc0b01f86, 0x5ed515ca, 0x2c0ce2ce, 0x68c2854a, 0x6841a832, 0x1e699957, 0x25aad9cc, +0x2260d36b, 0xf04703d1, 0xab6c7477, 0xd227d0ba, 0xa0aaeb89, 0x890ca71c, 0x5727e2ff, 0xa760e12e, 0x940a3eba, 0x8d2a8032, 0xc70bfb6b, 0xf3280320, 0xb24ccaff, 0xe1ce2256, 0xea08bda8, 0x29a64c95, 0x494e7ba8, 0x0fe0b8d0, 0x76283165, 0xb505ed20, +0x85003245, 0x0c8fb821, 0x2646f445, 0x1920be88, 0x382f6d12, 0xc464fb9a, 0x67223d9a, 0x420bc92e, 0x9bea866a, 0xf78d0976, 0x374cf8ba, 0x7e028312, 0x81a53813, 0x4d685c86, 0x37cfd5c2, 0xc8eb43bb, 0x8da9ad4a, 0xf86db1a6, 0x336adf94, 0x644d3d6b, +0xabef590f, 0x4164c9df, 0x506ec520, 0x218cfee2, 0xf46124ff, 0x67a110e2, 0x45c1c389, 0x7a24a43c, 0x082ab277, 0xf4e20987, 0x2d0346c3, 0x60e8373d, 0xb98a5501, 0xf70e240e, 0x03ec2d89, 0x110a0cff, 0x1a4fbe79, 0x3c094a3c, 0x2a4a611c, 0xc4e7d6e2, +0x4a217b59, 0xb1a0e776, 0x75c41cec, 0x606b1a45, 0x9806abe3, 0x6c678f1c, 0xa346c600, 0x3c8a6744, 0x074927df, 0x85831f3d, 0xc8686ec3, 0xe967bd59, 0x90af34ec, 0x75473194, 0x86ec1fcc, 0x210fd39a, 0x152c2bd1, 0xd2a4fdc2, 0xac2553a8, 0xd962623c, +0x63041ab4, 0x82ca38e2, 0x3fe567b5, 0xa7e3cc56, 0xa40fe1df, 0x57a4cf87, 0x3bc3409b, 0xb586c058, 0xbd2f5f57, 0x2d806bbb, 0x8a63a7ed, 0x4288e456, 0x1d0699a6, 0x33e9f2ec, 0xe14d0f2e, 0x7deeae9b, 0x12650c0e, 0x5f0d5088, 0x00000000, 0x08a99f0f, +0x46aec378, 0xeeadb7fe, 0xcb84434a, 0x9fcca144, 0x5ba85ade, 0xbdac722f, 0x1acc9301, 0x49cd56d0, 0xdea8689b, 0x79c889b5, 0x41e7e4a7, 0xda0d62cd, 0x5382e8a9, 0x716116ba, 0x50ede858, 0xe2a122a7, 0x4e84710f, 0xcf21491c, 0xe6870589, 0xe56b2800, +0x2e6c4632, 0xc3aef13d, 0xcb076e32, 0x6b2ea8c3, 0xb6e9c0a9, 0x7d6d83e3, 0x64ce1013, 0x898f8a64, 0xed419a77, 0x0bc69ffe, 0x8e4580c3, 0xcfa26464, 0xa029c6f1, 0x5ce17d01, 0x1d85b4de, 0x6f8ba295, 0xf3ab2e58, 0x0c0c9559, 0x5c625079, 0x9ca3a1b5, +0xf0c42ea9, 0xa8037486, 0x3f664acd, 0xe9e49021, 0x794ba4cd, 0x902c1994, 0xffa7bb01, 0xe5e80578, 0xfc4b9688, 0xde2b45e3, 0x5b2b77a6, 0xea8b90d0, 0xee2e9a86, 0xd56ef765, 0x97e61333, 0x3423f84b, 0x97653e4b, 0xf8ee9cde, 0xc042dcb4, 0xa88059fe, +0xbe405fa6, 0xfb02b157, 0x58c75a2f, 0x2eef6b4a, 0xa48ccca7, 0x638737cc, 0xd9e14f44, 0xbae555f0, 0x0b45b286, 0xbec372de, 0xb2cfe787, 0x2529f4b4, 0x5f8e7df0, 0x5448e20e, 0x8126156b, 0x93431965, 0x15af06a9, 0x4deb71fe, 0xb123ca0e, 0x34a0d533, +0x9c208ccd, 0xd5edda1d, 0x54cbcf76, 0x0f6395a8, 0x462dee00, 0x4e075c77, 0x7e81ae6a, 0x6bad85bb, 0x26c5d93d, 0xd148d04b, 0x292561ed, 0xd1cbfd33, 0x8ae08a95, 0xe60428f1, 0x948913c2, 0x71e23bc2, 0xdd444512, 0x866f32b4, 0x04a50a56, 0xaf4a5359, +0x9f4f8c3c, 0x93c0341d, 0x6ce4a264, 0xfb819c2f, 0xedc2b70f, 0x3086f21d, 0x00832d78, 0xe2220fdf, 0x4542eef1, 0x11892187, 0xafc97e21, 0x3b406de3, 0xa3c5eb78, 0xba667888, 0x728d3b33, 0x9885869b, 0x19a393f0, 0xc0c1f1cc, 0x5301c5d1, 0x2ac94c64, +0xcccd6495, 0xb66aedd1, 0xd601f794, 0xc788d613, 0xb9097879, 0xddc7686a, 0xc32ddc45, 0x16432b20, 0x6f088fed, 0x58447757, 0x76ab1c1d, 0x07ca0aa7, 0x8249159a, 0x0426272e, 0x3005df65, 0x8ec6adbb, 0x4aa25621, 0x720e164b, 0xff249679, 0xcc4e49ed, +0x38ac406a, 0xd682daec, 0x036f00f1, 0xda8e4fb5, 0x7aa78944, 0xaca67ed0, 0x1eeab42f, 0x22e3fe13, 0x16c00658, 0x12e62176, 0x9b69ab12, 0xfcc8bbf0, 0xe245fc55, 0xa302f43b, 0x3eca02d0, 0xd95d8e8e, 0xd74fb503, 0xc99fa48e, 0xdba1ecae, 0xbb4ec380, +0xfe698ff8, 0x55e56678, 0xaa3edd9d, 0xfbbbfff3, 0x2686356b, 0x247a574b, 0xc25fef08, 0x8436f54d, 0xafecad96, 0x1ab0559b, 0x88d8ace0, 0xfc95edd8, 0x30d8395d, 0xc82d9093, 0x54575265, 0x5d6b7bc3, 0x7bed4ea8, 0xcb63c6ae, 0xe0b99e75, 0x702d052e, +0x6db3429e, 0x9c7ac2f6, 0x0d5c6db0, 0x11701e1d, 0x981a86e0, 0x79112c88, 0x9dc8f6eb, 0x1b026186, 0x46691a45, 0x04604416, 0xbc60d1ab, 0x97ba8970, 0xd1d39335, 0xaca2fbab, 0x1c2c73ad, 0xb272ea26, 0x2d467eed, 0x9f3494cb, 0x72d1670e, 0x4a8743e8, +0xbe9cb38b, 0x4147086e, 0x9126af46, 0x1f622590, 0x33966f60, 0x3d8454ed, 0x487b21c8, 0xeeaba5f8, 0x034e563d, 0x86ca976d, 0xc0a38d28, 0x9b54d0dd, 0x9e86a0d6, 0x67c13d05, 0xe3f7c848, 0xb612ae30, 0x69d30688, 0x57190458, 0xe985b7d3, 0x316a0d40, +0x81e48546, 0x6efd14a3, 0x90949b5b, 0x8318e766, 0x184c37bb, 0x896a98fd, 0x201a135d, 0xbf2e8796, 0xa59ed20d, 0x3c3660f0, 0x8ff6becb, 0x7cc35c83, 0x2bda58db, 0x19fe03a6, 0x34b87d4b, 0xdd3dca98, 0x63a17913, 0xa9708ba0, 0xcf0382b8, 0xf335e248, +0x648f6b38, 0xad10cfb6, 0xf9479dd3, 0xe625b843, 0xb9b2a1a0, 0x43bb6a4e, 0x42095e53, 0xa42ce610, 0x6f4f20be, 0xeb79d5f3, 0xa8c2bfbd, 0xf07bb475, 0xa762b02d, 0x2cf44af0, 0xd8efba93, 0xe56bee7e, 0x2a686cc6, 0xec57c7d8, 0x6b2f64a8, 0x8056b15b, +0xbdd2e5b6, 0x7f8d0abe, 0x78a31895, 0x8a24cec0, 0x17ec382b, 0x49c915d5, 0xe10baa68, 0xede5f3c5, 0x719f3133, 0x8778a370, 0x123e4820, 0xffdbbbe5, 0x8e448ad6, 0x62134d0e, 0x99a8b2fd, 0x5185226e, 0x82aad37b, 0xc571fd23, 0x9268f97b, 0x77031705, +0xceb1b6a5, 0xe4d9da63, 0xb80095bd, 0x8b96fadd, 0x5a4569e8, 0xfa09cbee, 0x072e122b, 0xc4c3c93e, 0x9546eb50, 0xd6fd811e, 0x25c86356, 0x590b3fd5, 0xdfc1a8b8, 0x138c7c3d, 0xf287d655, 0xdc8ffe85, 0x088e1dbb, 0xd29dc508, 0xcad1f2b3, 0x8584c150, +0x5cd94fde, 0x68613295, 0x37f62b76, 0x7a5f7ab5, 0x76b12318, 0x9608bd6d, 0x5f9719e3, 0x744d4138, 0x36441f6b, 0x94f4df4d, 0x32245b7d, 0x9ae6e4c0, 0xde739ca5, 0x60ef2f2e, 0x01b2341d, 0x29263afb, 0xd32ff115, 0xa04ca206, 0xe83783ce, 0x52cb7453, +0xd5b3d723, 0x4ee707fe, 0x73635313, 0xa6d08430, 0x27340176, 0x6c017683, 0xc78d9f03, 0x02fc6220, 0x15105a0b, 0xf755a65e, 0xcdffe098, 0x23544560, 0x28940ee6, 0x4f5533e3, 0x58b90bc8, 0x75ff7525, 0x22e6717d, 0xab8ce980, 0xf5a9c47e, 0xcc4dd485, +0xbafcf79d, 0xf6e79243, 0xeacbe1ee, 0x66730918, 0x093c29a6, 0x40f53c73, 0x93dacd66, 0xf8f5a9ce, 0x350a4956, 0x385624e6, 0xda13d8b3, 0x39e410fb, 0xb13cbc1b, 0x00000000, 0xd401e33e, 0xf1c98068, 0xb7a09a2d, 0x2fba1ccd, 0x3f7836cd, 0xc111b935, +0x6a9d50b5, 0xfd27d9c5, 0x4c1b65de, 0x3b1872db, 0xc63fab1e, 0xae5e998b, 0x14a26e16, 0x4da951c3, 0x47db2e58, 0x21a82740, 0xef1991e5, 0x8cb8e8f6, 0xa1fe961b, 0x7d71689e, 0x5e252dfe, 0x8d0adceb, 0x0bc04b86, 0x1d9e47b0, 0x069c2636, 0x05d2700b, +0x5bf75df5, 0x50371673, 0xb08e8806, 0x44957865, 0x0fa00f90, 0x3aaa46c6, 0x2e0828d0, 0xb4eecc10, 0xb3c0de3b, 0xc3eddb15, 0x0e123b8d, 0x615d1b33, 0xd061a728, 0x45274c78, 0x5379404e, 0x56ab3045, 0xe7978c5e, 0x4b3577f5, 0x653d5f25, 0x7e3f3ea3, +0x165e0c36, 0xa2b0c026, 0xf41bf063, 0x1ed0118d, 0x0cee59ad, 0x0a727f9b, 0x10c22a00, 0xb55cf80d, 0x7c7015a0, 0x00000000, 0x3248fa48, 0x6462b030, 0x585a199b, 0x196f791e, 0xc4af9959, 0x71557515, 0xf5b25047, 0x1812a590, 0x7e797b2c, 0x91d0e077, +0x8beaaa3f, 0x908cbdad, 0x93d98efb, 0xe0859562, 0x4c318164, 0xb8fe0dad, 0x183324c4, 0x7221c717, 0xa1b0f5e7, 0x16437727, 0x64433164, 0x0228efd8, 0x9fa0b394, 0x0f0d8f6d, 0x737d9acd, 0x2a7bde8c, 0x257651e1, 0x7028a99b, 0x3314a792, 0x0374b202, +0xd1985c7c, 0x5a72f643, 0x696651d1, 0xe2ad7aba, 0xb68e5e4e, 0xbbab3efb, 0xa19174b3, 0xa0eca83d, 0x3f4c1ba9, 0xc6a6f7d5, 0x242a0c3b, 0x9edd6f1a, 0xfa9e5e7e, 0xc5d245d7, 0x0c793d6f, 0xf6c6e245, 0xf9eaec7c, 0x1b4796c6, 0xfabfdf2a, 0x7c5194f4, +0x6b6f3f5d, 0x4f453366, 0xddc0e047, 0x92a45275, 0xdc9cbd9d, 0x86cfca8a, 0x7f2526f6, 0xe1f849ec, 0x9d885c4c, 0x275ebe39, 0x4e38efe8, 0xacb41406, 0x5a537717, 0xf8b6b1a6, 0x562a4a78, 0x30601590, 0x0d04e1e1, 0x67378366, 0xde95d311, 0xb7f382c0, +0xa0cd2969, 0x277f3f6d, 0x89c245e7, 0x2602e3e3, 0x8a9776b1, 0x5b2eab99, 0x542324f4, 0xef881a0f, 0x290f6c8e, 0xe0a41436, 0x144a19ab, 0xe3f12760, 0x311dc91e, 0x2a5a5fd8, 0xdfc98ecb, 0x8bcb2b6b, 0x85bb7888, 0x1662f673, 0x4e196ebc, 0x87939750, +0xaebd7a8a, 0x555ef87a, 0x4114e1d1, 0x426053d3, 0x4241d287, 0xb983d123, 0xb7d20394, 0xf593d113, 0x9cd40196, 0xbb8abfaf, 0x557f792e, 0xcafe4bee, 0x7d0dc92e, 0xd0e580f2, 0x700928cf, 0x3d457525, 0x666bdebc, 0xd1b9dd28, 0x4c100030, 0x0f2c0e39, +0x02096e8c, 0xeef5c681, 0x8ab6f7e5, 0x6a336287, 0x433c0e09, 0x304194c4, 0x86ee4bde, 0xf4cf8cc9, 0x431d8f5d, 0x4048bc0b, 0x1a3a4a48, 0x72004643, 0x4d4c5dea, 0xc98af9ec, 0x40693d5f, 0x93f80faf, 0x587b98cf, 0xecfca80d, 0xc8f72562, 0xdde16113, +0x4f64b232, 0x7e58fa78, 0xc8d6a436, 0x664a5fe8, 0x2557d0b5, 0x91f16123, 0x3c1928ff, 0x653eedea, 0x6947d085, 0x7174f441, 0xc48e180d, 0xa3b99b6b, 0x3e31c727, 0xcadfcaba, 0xe1d9c8b8, 0xed817483, 0xf9cb6d28, 0xa2e5c6b1, 0xd2ecee7e, 0x3f6d9afd, +0xf7bb3ecb, 0x2872b000, 0xfbe382f0, 0xc7faaa0f, 0x6a12e3d3, 0x240b8d6f, 0xd0c401a6, 0xae9cfbde, 0x87b21604, 0xa2c447e5, 0xefa99b5b, 0x194ef84a, 0x171f2afd, 0xdcbd3cc9, 0x889e183d, 0x560bcb2c, 0x017ddc8e, 0xf6e76311, 0x5402a5a0, 0x146b98ff, +0x859af9dc, 0xa3981a3f, 0x5927c515, 0x577617a2, 0xb8df8cf9, 0x1a1bcb1c, 0x313c484a, 0xb5db6d18, 0xd3b0b3a4, 0x9f8132c0, 0x0e7053e3, 0x59064441, 0x89e3c4b3, 0xeda0f5d7, 0xb9a25077, 0xd2cd6f2a, 0x7d2c487a, 0x4d6ddcbe, 0x173eaba9, 0xc5f3c483, +0xb5faec4c, 0x5b0f2acd, 0x9efcee4e, 0x2b278356, 0xecdd2959, 0x262362b7, 0xcba21634, 0xf79abf9f, 0x03553356, 0x6b4ebe09, 0xb4a6b196, 0x292eedda, 0x88bf9969, 0xf4ee0d9d, 0xe3d0a634, 0x333526c6, 0x32697b1c, 0x3e104673, 0xc9ab78b8, 0x0d2560b5, +0xcb839760, 0xafe12750, 0x1b661792, 0xadc9c888, 0x00218154, 0x9285d321, 0x9cf580c2, 0x7f04a7a2, 0x1537c525, 0x84e72552, 0x2b060202, 0xdeb45245, 0xac959552, 0xbad6e275, 0xb6afdf1a, 0xc6877681, 0xd39132f0, 0x15164471, 0xc7db2b5b, 0x575796f6, +0x41356085, 0xf89730f2, 0xdfe80f9f, 0xe28cfbee, 0x3c38a9ab, 0xeed447d5, 0x67160232, 0x90ad3cf9, 0xbaf76321, 0x3d64f471, 0x015c5dda, 0xfbc203a4, 0x651f6cbe, 0x84c6a406, 0x735c1b99, 0x28533154, 0xade849dc, 0x681b8d5f, 0xb48730c2, 0x0c58bc3b, +0xafc0a604, 0x0e51d2b7, 0x9da9dd18, 0x683a0c0b, 0xf87ebbc4, 0x1ac71ca0, 0xfce5e694, 0xd4d7ee46, 0x173b827e, 0xb001cc78, 0xeb922a05, 0x249ad49f, 0x2dfd1711, 0x49677bc0, 0x092b8d61, 0x0967c38e, 0x649a6cd1, 0x94d75608, 0x5f08bb2d, 0x949b18e7, +0x52f425f3, 0x24d69a70, 0x7e5d7071, 0xd8337ce4, 0x53a06760, 0xc62373fb, 0xcf08fe9a, 0x1f080363, 0xe2b9a764, 0x692abce0, 0xee117b29, 0x1777cc91, 0xf15536a5, 0xcbdfed25, 0x9583149b, 0xb04d8297, 0x3b92d7fc, 0xf5ce6bf5, 0x5e5cf9be, 0xae5d8d88, +0xce5cbc09, 0xdce46f5b, 0x16238e02, 0x1a8b524f, 0xddb02dc8, 0xfdb1a407, 0x604d7f6e, 0x4000b84e, 0xb4d6dfc7, 0xa622427a, 0xe3a1ab18, 0xb49a9128, 0x52b86b1c, 0x8f0846d4, 0x200189cf, 0x900045b7, 0x5f44f5c2, 0x1e5c41f0, 0x7e113e9e, 0x48333953, +0x7f457c0d, 0x9db09586, 0x1bdf10dc, 0xf832f52b, 0x7bde215d, 0x12f49dbd, 0xe622fa34, 0x4154fadd, 0x72f5ac3c, 0x13a0df2e, 0x366e4922, 0xea8a2679, 0x3776455e, 0x211985b3, 0xa2b91f2a, 0x2ce51b6d, 0x487f77bc, 0xf49a2966, 0x8b931b84, 0xfca9a87b, +0x12b8d352, 0x362207cd, 0xd92b7098, 0xf4d66789, 0x73eda040, 0x2582d8e3, 0x4118b432, 0x4583e962, 0x049b5d50, 0x3e5dc83f, 0xbdb11c49, 0x449be51e, 0xc73b7f87, 0x73a1eeaf, 0x766ef16c, 0x83a09a99, 0x64d6223e, 0xc66f3d14, 0x8f44083b, 0x1b935e33, +0x658260ad, 0x5bdfa892, 0x6dfdaf5f, 0x373a0bb1, 0xa2f551c5, 0x3f45c443, 0x8bdf556b, 0x0833811d, 0xe776b8a7, 0xcac7e159, 0xa73a4e06, 0xd04cb316, 0x01180c7c, 0xd583acd5, 0xcf44b075, 0x91540724, 0x25ce960c, 0xa66e0c95, 0x6832b09c, 0xef4539ba, +0x5b93e67d, 0x4ca86403, 0x61557312, 0x866f855a, 0x292a04ae, 0x45cfa78d, 0x0ca8dc4d, 0xb5829d54, 0xc2b82eab, 0xa77600e9, 0x61193dfd, 0xb8324d65, 0x5e10b751, 0xce10f2e6, 0x01544293, 0xf04d3ad9, 0xb92a4119, 0x873bc7c9, 0xca8bafb6, 0x3f098aac, +0xd5cfe23a, 0xb119c004, 0xd87f320b, 0x65ce2e42, 0x4db0687f, 0x904c0b58, 0xaf4581f4, 0xef097755, 0xc7773168, 0x773ab3ff, 0x0dfc9ede, 0xaf09cf1b, 0xf582251a, 0x6966f20f, 0xd118f185, 0xdca821b4, 0x04d713bf, 0x83ecd476, 0xbca91035, 0x166fc0ed, +0xddfc6327, 0xf119784a, 0x95cf5a74, 0xaac6d0d8, 0x087fcff2, 0xcb93a3ca, 0xf92af957, 0xe66eb4db, 0xa3ed5db9, 0xe3ede5f7, 0xb5ced3bb, 0x283208d2, 0x29664a41, 0xb87e038a, 0x3ac6956f, 0xd000fdf9, 0x7a8a63ce, 0x82f4d80a, 0xaa8a9e37, 0x6db1e1b0, +0x8a8b17f8, 0x0ce492a2, 0xc2f46044, 0xd9673e77, 0x5ac7a4ee, 0x99678639, 0x00000000, 0x287e463d, 0xfdfdeae8, 0xee5d35c6, 0x566f78a3, 0x0db0d031, 0x7776fd10, 0xb1558eeb, 0x72b9e2d3, 0x2db159fe, 0x9dfcdb69, 0x3e1186d0, 0x004c4eef, 0x82b896e5, +0xd154bf6a, 0x2ca95582, 0xe73af648, 0x992bc8d6, 0x7f0932e2, 0x3a8adb80, 0xae11c367, 0x987f8a45, 0x32b95a9d, 0x7ac62d21, 0xabdedca4, 0x13ec91c1, 0x87778926, 0x7b926fb2, 0x9ca899fa, 0x44d7abf1, 0xbce55eda, 0x8e104aa8, 0x0583512c, 0x32f51472, +0x3bde9913, 0xb9660ff6, 0x4dfc2690, 0xc3ec6c38, 0x33ed180e, 0xab92924b, 0x6ce5a323, 0x9833c4aa, 0x9ce4d715, 0x573b3a30, 0xebde64ea, 0x2155cb5c, 0xd49ba0a9, 0x60013181, 0x6ca9edcc, 0x53ec298f, 0xa3a11356, 0x8ac75917, 0xeac66896, 0x4ce42aec, +0x8e5c0447, 0x204dc720, 0x687efe73, 0x8623cbb5, 0x1f444d8c, 0x7622bf83, 0xe2f5e98b, 0x33a156e1, 0x911849cb, 0xc3a022d7, 0x1e100f1f, 0x404cf6a1, 0x577774df, 0x5a8bea01, 0xf0017436, 0xbdfd52a6, 0xf966b7b8, 0x05cf1fc3, 0x492b352f, 0x5623364c, +0xdce6fc11, 0x906953dc, 0x6a7dee17, 0xc058f275, 0xe7d93b4a, 0x7b547ff3, 0xddcb6a2e, 0x2a1656bf, 0xe7a8ff6b, 0x002fdafb, 0xccbce510, 0x8cf88743, 0x1cbe0e64, 0xf783224b, 0xcde0b70e, 0xe7872590, 0xf7acf8b0, 0x7a563337, 0x511c3796, 0xbb0c8d86, +0xb7995ec2, 0x3b101da0, 0x8dd5117c, 0xba7f0563, 0xaa54d843, 0x6b507828, 0x4169f46c, 0x77ee764c, 0x779fb26d, 0xf7dd3c91, 0x2b3bc080, 0x90468927, 0x5133ed6d, 0x4137eab6, 0x012d963f, 0x8d8b0fa6, 0xeb12f6d4, 0xd002eb74, 0x0dc9815a, 0xdcc926ea, +0x50406588, 0x8da4d55d, 0xf6df7055, 0x2a398c44, 0x26f241da, 0x36878220, 0xba0ec142, 0x1ce010be, 0x80334add, 0xeb4ce80e, 0x9cfc8098, 0xf6f0aaae, 0x801c9026, 0x806d5407, 0x7a27f716, 0xfb16f10f, 0x76c3e073, 0x77b06896, 0xfa6579ea, 0x3785cee4, +0xa6b0cf26, 0x9cd35a63, 0x36f64601, 0x115855c5, 0x406bb8a8, 0x4dd3fdd3, 0x76b22452, 0x0ce41765, 0xab2750a6, 0x811edce2, 0x67ea7197, 0xab088a5d, 0xc006ecaf, 0x36d99cfa, 0xd12f7d4b, 0xa7c347c3, 0x005e1eda, 0x66e83d53, 0x3b4e037a, 0xba50df98, +0xbb23577d, 0x5da63e29, 0x401a7c89, 0x8c894362, 0x7a082ded, 0xfb67352e, 0x9c8d44b9, 0xcc933feb, 0x67b46f4d, 0x112991e4, 0xfa4aa311, 0xf6aeb474, 0x37aa141f, 0x5142294c, 0x4da239f2, 0xa6eed1fc, 0x102bdd20, 0x015c521e, 0x27ae13c4, 0xcdcf6df5, +0xe6aab3af, 0xeb6332f5, 0x5cfa6c37, 0x2a484865, 0x9d8f087d, 0xd02d318f, 0x9dd116a7, 0x41462e97, 0x5d89e4d2, 0xd05cf5ae, 0x1dcd8681, 0x1de25c7a, 0xfb392bf4, 0xcd91732f, 0x0cba09bf, 0xdc973830, 0xaa251c62, 0xf7f2e66a, 0x105a1901, 0x4ca07536, +0x506fbf73, 0xe6f4ad75, 0x4c8fafcd, 0x37f40ac5, 0x1ccfca45, 0x5df820f3, 0xc104a06b, 0x7b7ba508, 0xc15abeb1, 0xa79d5919, 0xf6816e8f, 0xd1716391, 0x3b3fc75b, 0x8ca69999, 0xaa7b02b8, 0x77c1acb7, 0xfa3b6730, 0xdcb8e2cb, 0xcccd2131, 0xdde4b0d5, +0x8cd75db8, 0x1c91d49f, 0x66c7e7a8, 0xea10ba10, 0xddbaae0f, 0xb6ead627, 0xcce2fbca, 0x2b4a04a1, 0xa7ec9d38, 0x4cfe6bec, 0xd15eb96a, 0x6a5234ec, 0x27f00d1e, 0xe6856954, 0x2b65de5a, 0xc12b7a90, 0xc0293654, 0x1075c3fa, 0x911adb39, 0x7b25bbd2, +0x11064b1f, 0xb69b1206, 0xe7f6e1b1, 0xbb52935c, 0xa6c10b07, 0xa69f15dd, 0xfa14bdcb, 0x0db8457b, 0x9144c5e3, 0xea617e31, 0x76ec3a88, 0xe6db778e, 0x1dbc42a0, 0xfb48efd5, 0x27dfd7e5, 0x6699f972, 0x5c8ba816, 0x4cd1b117, 0x67c5ab6c, 0x0ccbcd9e, +0xc077288e, 0x6b21bc09, 0x36a858db, 0x80428efc, 0xcdbea9d4, 0xb7c74018, 0x5dd7fa08, 0x3a3d8b9f, 0x5cd5b6cc, 0x6a23f0cd, 0x2b141a7b, 0x81310619, 0xbb7d49a7, 0x0c95d344, 0x3a639545, 0x01024cc4, 0xb7e89ae3, 0x679bb5b6, 0x4d8de309, 0x3a125164, +0x4dfc2728, 0x5ca472ed, 0x8dfacb87, 0x26dd9b21, 0x2781c93f, 0x9da0d286, 0x90374d06, 0xaa0ac699, 0xd100a7b0, 0x268385fb, 0xb6b4c8fd, 0x9ca29e42, 0xb6c50cdc, 0xab794e7c, 0x7b0a6129, 0x4118304d, 0x501e7b52, 0x1d93985b, 0x9dfecc5c, 0x0071c421, +0xd0732f55, 0x7a79e9cc, 0x3b61d981, 0x100407db, 0xba211bb9, 0x40446253, 0xab569487, 0xea3f60eb, 0x6a0c2a36, 0x916b1f18, 0x5031a1a9, 0x6b7fa2d3, 0xdd9574f4, 0x3a4c4fbe, 0xa7b283e2, 0x8140c238, 0x901897fd, 0x00000000, 0x26ac5f00, 0x017388e5, +0x66b62389, 0x2a67929e, 0x0d979f80, 0x6b0e66f2, 0x913501c2, 0x516df3b7, 0xc175644a, 0x37dbd03e, 0x0de65ba1, 0xeb3d2c2f, 0x816f18c3, 0x4035a672, 0x769dfea9, 0xb7b68439, 0x11778f3e, 0xea4ea4ca, 0x742fd4e7, 0xc6fe86cc, 0x3eee1b79, 0xc015718d, +0x0c67b7f6, 0xe562d7e2, 0xab4406e4, 0xc429f793, 0xede27e8c, 0xbcba0c04, 0x6106af58, 0x8e33a08b, 0x76f8a5b8, 0xe76e3e3b, 0x69860636, 0x4efd4980, 0x214b2071, 0x86689163, 0xfa1c746c, 0xf4acb2c5, 0x043c861e, 0xf09034db, 0xca42a9bc, 0xe15e51fc, +0xb43aa56a, 0x97a6f444, 0x78486311, 0xbeb6e5dd, 0xf8109db5, 0x30854556, 0x653a2946, 0xd95bbdc4, 0x1f7ea38e, 0x630a4681, 0xdf6bd203, 0x429afe76, 0x44710937, 0x84bfe03c, 0xe5b94f64, 0x1fa53b08, 0xf2474584, 0x424166f0, 0x57681d4f, 0x2577a66f, +0x02d7715f, 0x17259266, 0x939a725a, 0x46a67868, 0xadaff1a5, 0x6f6df177, 0x3e3583ff, 0x61dd37de, 0x59d8dbe6, 0xd1008c2c, 0xb6364cb3, 0x4e26d106, 0x57b385c9, 0xeb0989cd, 0x9341eadc, 0x0880a96e, 0x991632ed, 0xebd2114b, 0x8058fea4, 0x2190b8f7, +0xef350fd3, 0x29101199, 0x48cd2647, 0x5fe8b421, 0xf67bc39a, 0xf29cdd02, 0x15297bbf, 0x06306fc7, 0xa7f82994, 0x9571851b, 0x239c512e, 0x3ad29d67, 0xbe6d7d5b, 0x3a0905e1, 0x6b8aefef, 0x51587288, 0x409617af, 0xc6251e4a, 0xfc2c1bab, 0x7ea39450, +0x99cdaa6b, 0x2ffbe6d8, 0x6b517769, 0xdfb04a85, 0xcca95efd, 0x828f8ffb, 0xb6edd435, 0x3c396a26, 0xdb8ccc9b, 0xf8cb0533, 0xf4772a43, 0x13191478, 0x914d0305, 0x7a9f124e, 0xe9056014, 0x6736c09f, 0xa948ef3d, 0x34625bce, 0xc895d8e3, 0xafa3187c, +0xbc619482, 0x366eb217, 0x32523409, 0x3805ec38, 0xd5e792b4, 0x4a1a5718, 0x538f03d7, 0x4816bec1, 0xca99313a, 0xab9f9e62, 0xe185c97a, 0x1115fda1, 0x53549b51, 0x1b99bd16, 0x13c28cfe, 0x5bd4323f, 0x74f44c61, 0xe7b5a6bd, 0x0a57d831, 0xfe20f272, +0x8254177d, 0x305eddd0, 0x9df12c75, 0x0a8c40b7, 0x695d9eb0, 0xc2c200d2, 0xf04bac5d, 0x27a0d730, 0xdd673bda, 0x846478ba, 0x7e780cd6, 0x199554cf, 0x2f207e5e, 0x7893fb97, 0xdb57541d, 0x95aa1d9d, 0xc84e4065, 0x2d2c9787, 0x8ad4be13, 0x8ee8380d, +0x11ce6527, 0xd1db14aa, 0x36b52a91, 0x277b4fb6, 0xa52f58cb, 0xb8868a1a, 0x7a448ac8, 0x88d857ca, 0x4c2a38df, 0xa1c84653, 0xfcf7832d, 0x34b9c348, 0xa99377bb, 0x9f265d2a, 0xf6a05b1c, 0x2bc760c6, 0xfac7ecea, 0x25ac3ee9, 0xce7e2fa2, 0x721fbb20, +0xba8a63c3, 0xad746923, 0x8a0f2695, 0x3ce2f2a0, 0x29cb891f, 0x5564f496, 0x9ffdc5ac, 0xb2d1522b, 0xba51fb45, 0x8803cf4c, 0x467de0ee, 0xe38920a3, 0x5183ea0e, 0x65e1b1c0, 0x2df70f01, 0x76233d3e, 0xb0ddbbf2, 0x977d6cc2, 0xb4e13dec, 0xc4f26f15, +0xaf7880fa, 0xefee9755, 0x55bf6c10, 0x2347c9a8, 0x020ce9d9, 0x9d2ab4f3, 0x44aa91b1, 0x0e6b5e2f, 0x5b0faab9, 0x17fe0ae0, 0x0cbc2f70, 0x72c423a6, 0x194ecc49, 0xa113ded5, 0xe352b825, 0xb0062374, 0xddbca35c, 0x8c3f4952, 0xd730e3eb, 0x1b422590, +0x9bc143b2, 0x1da9d2d1, 0x6dba8028, 0xd30c65f5, 0x6d6118ae, 0xa3c4af8a, 0x701352f9, 0x4cf1a059, 0x085b31e8, 0x4ac1cf9e, 0x91969b83, 0x5d3fc57e, 0x5de45df8, 0x06ebf741, 0xb85d129c, 0xcc72c67b, 0xfefb6af4, 0xa31f370c, 0x7c74e50f, 0x70c8ca7f, +0x04e71e98, 0x1d724a57, 0xb20acaad, 0x67ed5819, 0x63d1de07, 0xa723b112, 0x3289ac8f, 0x9b1adb34, 0x00db9886, 0xd9802542, 0x59034360, 0x5f332ca7, 0x86b309e5, 0x0eb0c6a9, 0xd3d7fd73, 0xa5f4c04d, 0x80836622, 0x00000000, 0xed39e60a, 0xc0cee90b, +0x38de74be, 0x8ce4d1d4, 0x6fb669f1, 0xc2199854, 0xd53c0a32, 0x404d8f29, 0xe9def892, 0x15f2e339, 0xcea5b724, 0x2b1cf840, 0x7caf7d89, 0xd7eb7b6d, 0x3650a397, 0xb2a9235a, 0xd8f0c448, 0x64a9e119, 0x6fb559ca, 0xb4b2388c, 0x54e25958, 0x71a3a31c, +0x0f3b853d, 0xb7459d82, 0xe05061d4, 0x96235a28, 0x421fbe53, 0x2e5d4297, 0x0ad73be5, 0xc9ddbba3, 0x903841fe, 0xf0b69d09, 0x9f03c4c3, 0x8329182d, 0xbe650369, 0x4b3f20b8, 0xc72dbda8, 0x3f703d7c, 0x38a0a59c, 0xfa61a6ec, 0x91f3c2c8, 0x31803b77, +0xdacce270, 0xd3ec7c9b, 0x7d6f832f, 0x5529da6e, 0x023c2638, 0x235ae192, 0x1fdd79e0, 0x4023986b, 0xf99603e2, 0xbc592551, 0x277ddc7c, 0x80debd23, 0x56de7f60, 0x4cefb858, 0xba423e87, 0x09209eeb, 0x061b1bd6, 0x35a70699, 0x1736643d, 0x5332c1b8, +0xcc31057b, 0x82e29b1b, 0x16fde70b, 0xef6be4e9, 0xa454c451, 0xf55a23d1, 0x8e2ebb28, 0x8835a0fe, 0x75849ef2, 0xaaa4c25a, 0x510ee780, 0x248a7972, 0x08eb1ddd, 0xfc7abd3a, 0xb0950562, 0x9918df15, 0x2daae799, 0x8c129d10, 0x33bc1d4f, 0x2a7a7f79, +0xa668e269, 0x12dadae5, 0x14c1c133, 0x2541fa44, 0x8a0986c6, 0xd93b477e, 0x49030680, 0x4404a585, 0xe3a7c4da, 0xb68e1eb4, 0xf6ad86df, 0x52f9428e, 0x20ad449c, 0x4d243b6e, 0xe970ff3f, 0xd227ffad, 0xcdfa864d, 0xa59f4767, 0x84f980cd, 0xb362a06c, +0xbfae805f, 0x00000000, 0x637979f9, 0xf28abb31, 0x6e7edafc, 0x3ebbbe4a, 0x62b2facf, 0x61455fc1, 0x2bb1fc4f, 0x131159d3, 0x9ec847f5, 0xc0fd2548, 0x7f53a517, 0xf491a0e7, 0xdcd7f9a6, 0x396b26aa, 0x8dd91e26, 0x6c42fcc4, 0xacbfd98c, 0xbb89bdb1, +0x7e982621, 0xaf487c82, 0x5c094485, 0xf76605e9, 0xb9b59b89, 0x346c85af, 0xd1d05aa3, 0x5e3562bd, 0xa898e462, 0x112d7feb, 0xa9536754, 0x05ecbed8, 0xf17d1e3f, 0x3c879872, 0x28465941, 0xe19be2e2, 0x26b65f4a, 0xf85d80d4, 0xe780f934, 0x941f7c10, +0x04273dee, 0xf3413807, 0x0ccc2033, 0x9aef7a1b, 0x93cfe4f0, 0x41e81b5d, 0x59e5fa5d, 0x7948bec1, 0x675e4417, 0xce0d2343, 0xb87e18bf, 0xdeebdf9e, 0xea875a31, 0x180de100, 0x6865c12a, 0x4af4a38e, 0x2166c7aa, 0x7abf1bcf, 0x744f1dc4, 0x0b1cb8d3, +0xec9c41e7, 0x5715fc56, 0x920467c6, 0x10e6fcdd, 0x03f7a50e, 0x4f181d56, 0x5a125f53, 0x5dc2c7b3, 0x1e16fad6, 0x870e25c3, 0xeea067df, 0x72540612, 0x4ed39e60, 0x5bd9dc65, 0x7068202a, 0xad745aba, 0x1c2adcee, 0xfbaa25da, 0x7b7498f9, 0x5ffee18b, +0x8fe5381e, 0xeb4cd907, 0x77b8b8ca, 0xdf205ca8, 0x81153e15, 0x45cf26b3, 0x379b20a1, 0x78833df7, 0x50c564b6, 0xfe469b02, 0x0ef0060b, 0xe5bcdf0c, 0x9cf461cd, 0x48c885b6, 0xd7cb4175, 0xa1b87a89, 0x3d4c1b44, 0x8bc205f0, 0x229162a4, 0x304bb841, +0xa7a3615f, 0x97e8d91e, 0x47f3008b, 0xe26c47ec, 0x76733bfc, 0x7ca40019, 0xdb076146, 0x43d43d65, 0x0d07a305, 0xd5f7674d, 0x86c5a6f5, 0x6b926424, 0xca2a1ead, 0x9d3fe2fb, 0xc4da18a6, 0x69ae421c, 0x89fe23c8, 0xc2c10370, 0xd43ce47b, 0xbd92a667, +0xa24fdf87, 0xd600c243, 0x98d35c23, 0x853203fb, 0x2c6164af, 0x6562622f, 0x6695c721, 0xb579bbba, 0x6a59e712, 0x1a31c738, 0xcfc6a075, 0x582e796b, 0xab6f416c, 0xed57c2d1, 0xcbe19d9b, 0xa073f9bf, 0x9b24f92d, 0x6d897ff2, 0xae83ffb4, 0xd01bd995, +0xc8163895, 0xfdb13e0c, 0xc5119b90, 0x150a4205, 0xdd1c7a90, 0x1bfa440e, 0x463883bd, 0x07d098e0, 0xa3845cb1, 0x298dda77, 0xff8d1834, 0x19c66236, 0x739f8524, 0x01cb8336, 0xc30a8046, 0xe4775c3a, 0x32779e79, 0xb15e8654, 0x1de15fd8, 0xe64b7a02, +0x608edcf7, 0xc6e63e9e, 0x3b570092, 0x3a9c83a4, 0xc136a67e, 0x2f96c1a1, 0xe8bb7c09, 0x95d4ff26, 0x0f0762d9, 0x5022ad92, 0x05ad694b, 0xf8baa07e, 0x45c731cf, 0x31ff0262, 0x46879e4b, 0xbf1e3bc3, 0x3c9bcac9, 0xad3564a7, 0x86289841, 0x6a54a194, +0xf5de68d5, 0x6edacd29, 0x2df03a29, 0x524107e0, 0xed5f3c23, 0xd4699fa1, 0x98440a78, 0xd54a9a57, 0x432af700, 0x00000000, 0x14c699ab, 0xef3c9651, 0xb7d79a23, 0x71955ae6, 0xf1500468, 0x3631c15b, 0x0c47cd5d, 0xac166151, 0x5101a864, 0xe37b5b0c, +0x81e65b78, 0x2f93905b, 0x4c2d95d9, 0x892ffa98, 0xe2585efa, 0x2cd33fdf, 0x629d0074, 0xa9bb081a, 0x0d64c8ab, 0xc4216ab7, 0x57ec6eab, 0x73f6f094, 0xdec39433, 0x21b7f774, 0xc3efa98e, 0x4e4e3fab, 0x275a31bb, 0xb13a5cec, 0xe5969dc3, 0x9de96333, +0xa232067e, 0x15e59c5d, 0x93cd041c, 0xce8b6125, 0x880cff6e, 0xe03bf488, 0x048e6cbd, 0x66136cc9, 0x68370be6, 0x8a6f551c, 0xae75cb23, 0x8da19625, 0x9403c725, 0xb8d0f8fa, 0x5e06cabd, 0x5d466539, 0x3815a674, 0xdca03e41, 0x4209f2f6, 0x5c6560cf, +0x61ddaff0, 0x91aeae6e, 0xd3a75c98, 0xb9f3fd0c, 0x4be356e0, 0xbab35288, 0xbd7d91b1, 0xb359f69e, 0x7cf1924d, 0x6ff9c8df, 0xcce8cb57, 0x5f25cf4b, 0xff746347, 0x70b65f10, 0xfbfa0ffa, 0xec7c39d5, 0xcfa864d3, 0x870b9db7, 0xe9d1509e, 0x58eb0c72, +0x77789c29, 0x2eb095ad, 0x4f6d3a5d, 0x56cf6b5d, 0x2b1dfce6, 0x06edc6cf, 0xcb26086e, 0x743833ad, 0x122b5f64, 0x2094f282, 0x25399bc9, 0x13085a92, 0x3db8cf3f, 0x0e24672f, 0xabd8a268, 0x1bc1fb72, 0xc18c03fc, 0x41495d72, 0x54acc12f, 0x558fc4d9, +0x9f8ac941, 0x5baba3f6, 0x7b3f5174, 0x6470c6bb, 0x53620216, 0x4980fc92, 0xb5b43051, 0xe6d63247, 0xfd17c935, 0x48a3f964, 0xaf56ced5, 0x844b3233, 0x3b5509f0, 0xda4df88e, 0x47a49bbd, 0x7a1c5482, 0x08c9a1e0, 0x8fc23c57, 0xc866a7ea, 0x82a6f4fc, +0x1048f516, 0x8ee139a1, 0xa4dfc0b1, 0x4ac05316, 0xf999a588, 0x44e43439, 0x30dc0794, 0x8b4c50ea, 0x1e6c9239, 0x406a5884, 0xf073019e, 0x188154f6, 0xc5026f41, 0xbb90577e, 0x9cca66c5, 0x1786362f, 0x07cec339, 0x32bfade6, 0x765b99df, 0xa6bc6ac3, +0x795cfb06, 0x3fdb654d, 0x72d5f562, 0x1d2c3dbd, 0xd60a35d3, 0x09eaa416, 0xe8f25568, 0x7dd297bb, 0x5a88a600, 0x1f4f97cf, 0x16a533d9, 0x7fb13dc9, 0xdb6efd78, 0xbe3d3e35, 0x7e92383f, 0xa79f6f35, 0xd1c4f6ea, 0xd7293025, 0x285d5362, 0x0aaa0b92, +0xa5fcc547, 0xa051ac0c, 0xa3110388, 0x22f758f0, 0xc2ccac78, 0x34526b29, 0xdd833bb7, 0x116bf0e0, 0x59c80984, 0x6553c34d, 0xb27af368, 0x3ef860bb, 0xa172a9fa, 0xf7bdc2a7, 0x9520c2d3, 0x69140e10, 0x787ffef0, 0x8c8293d3, 0x0340af84, 0xa8980dec, +0x1c0f384b, 0xf333ae1a, 0xc642c0c5, 0x0b890e64, 0xfe5766b1, 0xfad90a0c, 0xe4b59835, 0x96606d57, 0x3a760c06, 0xd90d570a, 0x2a3ef910, 0x2679344d, 0xea91ff1a, 0x63be0582, 0x751b365b, 0x297e5694, 0xd82e52fc, 0xbc5e9447, 0xf69ec751, 0xf4fd6d23, +0x4d0e902f, 0x6d9a62ad, 0x6730693f, 0xc0af060a, 0x3712c4ad, 0x9ea9ccb7, 0xb6f49fd5, 0x6cb9675b, 0x80c55e8e, 0x6b77a462, 0xdfe091c5, 0xd284596e, 0x974368a1, 0x339ca810, 0xc761c533, 0xaafba79e, 0x23d45d06, 0x908dab98, 0x92ee01ea, 0x1ae2fe84, +0x19a25100, 0xfc34ccc3, 0xe7f537b1, 0x012305f6, 0xe118f17e, 0xebb2faec, 0x35716edf, 0xee1f93a7, 0xb019591a, 0xd0e7f31c, 0xf210abec, 0x8385f10a, 0x99670f8e, 0xc945a21c, 0xcdcbcea1, 0x60feaa06, 0x0263aa72, 0xca050d98, 0x856837c5, 0x9b04a5fc, +0x3936a382, 0x9a27a00a, 0xb49735a7, 0x241a9e3f, 0x18a0c9dd, 0xd9ab92eb, 0xfe60c0a9, 0x45262cc2, 0xc10b5b36, 0x259b9039, 0x66b413bf, 0x9edd7c52, 0xcf7b5420, 0x9da52b99, 0xc62a61c2, 0xb9162e10, 0xd1d232b9, 0xc35b994d, 0xacbebf10, 0x5d86e51f, +0x52de7fb9, 0x363aae7d, 0x7064d574, 0x6a94ded2, 0x311b9489, 0x432f8386, 0x4b5623d4, 0x781d7526, 0x2ac30a9f, 0xe6c00974, 0x5cae70af, 0x20ea68b6, 0x440eb972, 0x0f589aa6, 0xf1385a0f, 0xfa39ad96, 0xfc3002d2, 0xa8e7d22f, 0x731c82bf, 0x9c8dbe29, +0x714c40c4, 0xc702f472, 0x8755203f, 0xca0aacaf, 0xa7bf4889, 0x384aa16b, 0x0879a052, 0x57af8736, 0x9ff5e9e2, 0x92fdb13f, 0x04596d3f, 0x26e3c7f2, 0x89252f29, 0x60bdbcfb, 0x482e741f, 0x743db84b, 0x80741acb, 0xb64eb4b6, 0x5b8f4a5b, 0xf2400dc4, +0x9185e6f4, 0x6db5e426, 0x54d7d0fd, 0x978c49b0, 0xddf2ffd4, 0x94f41e7b, 0xe7e89cc4, 0xb7662106, 0x0c20cd6d, 0x56871286, 0x64e4d1c4, 0x7d6c8da9, 0x0d0858dd, 0x508ebdc2, 0xf5613730, 0xedc1feed, 0x7e14da62, 0xd883075b, 0xebc851a9, 0x7935e096, +0x3e430e2f, 0x815c8f7b, 0xce53c190, 0xcd2b965b, 0xdad3c520, 0x10d9698f, 0x7745ef80, 0x4f0f4eeb, 0x7a4db75d, 0xb41e76cd, 0xd6f3084d, 0xf3689874, 0xab9f85e4, 0x880dba99, 0x4906e1af, 0x4057d44d, 0x095135e2, 0xc023ce86, 0x346a6c06, 0x95dc8bcb, +0x3542f9b6, 0x96a4dc00, 0x1289abf4, 0xb0471bf2, 0xd58b5f86, 0xd7db9dfd, 0x4a7eb664, 0xf941fa5d, 0x148004b0, 0xd4a3ca36, 0x842d77f4, 0x8505e244, 0x75152dfb, 0x15a89100, 0xdfa23daf, 0x2beb9f2f, 0xaab71054, 0xfb113826, 0x22baaacd, 0x1f81f329, +0x0609af44, 0xa9cf479f, 0x1dd13152, 0xe8b00662, 0x334b56f2, 0x7c441819, 0xe3b1f1fb, 0x1ea96699, 0x6fe5265d, 0xbe3714e4, 0xa697dd39, 0x2893c8e4, 0x6c9d7196, 0x16d0c6cb, 0x9bac84dd, 0xafc6e8db, 0x6bbc4b62, 0x2ccaa5db, 0x8224d8b0, 0xa5ef8af2, +0xb33f4c39, 0x24b30589, 0x6ecdb3ed, 0xe490cb0f, 0x3d3b59e4, 0x465e7b09, 0x2de2306b, 0xaeee7d6b, 0xb217d989, 0xf449a280, 0xe1e13380, 0xbf1f8154, 0x4776eeb9, 0x8a5d78e2, 0xf010cfbf, 0x5efeb2d4, 0x6195294b, 0x19885c6d, 0x4c771920, 0x396234db, +0x830c4d00, 0x8d7c4216, 0xde8aa81f, 0x29bb5d54, 0x11f1fc3f, 0x53f6ea09, 0xc972fb64, 0x0b01f799, 0xeeb9a926, 0x21c2fd06, 0xe5b85ebf, 0x3f6b9b9f, 0x90ad7344, 0xf8696fed, 0xa1b6e7cd, 0xe0c9a630, 0xa09e727d, 0x3c13cc54, 0xa4c71f42, 0x7f3c4fd2, +0x13a13e44, 0xcb22391f, 0x23923f7d, 0xf731f54b, 0xa2ceb006, 0xad962aa0, 0xc5523609, 0xa3e625b6, 0xb16f8e42, 0x99fc46a6, 0xbd4f432f, 0x4e27db5b, 0x012895b0, 0xd2aa6572, 0x00000000, 0xc47aa3b9, 0x3263c342, 0x7234170f, 0xece96b5d, 0x07213af4, +0x59df8820, 0x55ff454d, 0x8b75ed52, 0x63c5eb30, 0xdbfb5090, 0x7b6522ed, 0xbb46ec6b, 0x9a84116d, 0x65cc4474, 0x766d7a30, 0x8e0415dd, 0x69ec8919, 0x1cf9a4e2, 0x867db58f, 0xd0faa709, 0x68c41ca9, 0x37123bcd, 0x30330139, 0x51a62872, 0xbc67d69f, +0xfd189762, 0x3b32f6a0, 0xb536e37d, 0x2e9a67a0, 0x5aa7dfeb, 0xb83ebba0, 0xdcda6a64, 0xe299644b, 0x1bd89e16, 0x0a296229, 0xc2730cfd, 0x0571f88f, 0x037857cb, 0xef913c96, 0x58f71d90, 0x93d5248f, 0x0e700f16, 0x4d5f8c90, 0x17f8537b, 0x3a1a6310, +0x0250c27b, 0xc85a6ed4, 0xeae0c419, 0xff485519, 0xf61960fb, 0xba6e79db, 0x5fd62764, 0x8f2c806d, 0x1af00ba6, 0x679c860f, 0x62ed7e80, 0x98d4d316, 0x417f41fd, 0xcc0303eb, 0xe99893d2, 0x8c54d7a6, 0x42071636, 0xd382f0c2, 0x2fb2f210, 0x27cb5242, +0xf0ddfda7, 0xa793f5ef, 0xd22cfed1, 0x5442ea7d, 0xd6a567ef, 0x597ab703, 0x2e9eeaaa, 0xa40778d8, 0xadb6bc98, 0x0eacd049, 0xa08ee1e6, 0x706126a2, 0x7527643c, 0x79d0e2e2, 0x0f630be9, 0xa8689104, 0x0546429e, 0xf83b8d45, 0x8024b407, 0x071d1409, +0x7c96a07c, 0xfcb2147b, 0x2a177394, 0xd4665e7a, 0x53c79176, 0x75bf0b3e, 0x0e34bf4b, 0xfee942ec, 0xaeba5ead, 0xa49f17da, 0x5ca49a9f, 0x8cd332d9, 0xd3e32571, 0xd1b873e6, 0x5619bcea, 0x03948d37, 0xdb055593, 0x74e8bf9c, 0xac796738, 0xab647331, +0x2bd8a834, 0xa2d5b771, 0x0489993e, 0xfc2a7b79, 0x7470d09e, 0xde43170d, 0xaaaba891, 0xaf75850d, 0x8a999272, 0x86f67bae, 0x0da0327c, 0x2983fea3, 0xf96c39e7, 0x7b13db77, 0x72a21f37, 0xd63d08ed, 0x2c5dd33f, 0x81eb6fa7, 0xd809b7a6, 0xd2b491d3, +0x519cc7e1, 0xd4fe3178, 0x85fa999b, 0x5a765536, 0x5df32e3d, 0xd0efc744, 0x2423ccdf, 0x50531c41, 0xdf14a3af, 0x5e67a30a, 0x5f3017a8, 0xd7f2d34d, 0x8d84867b, 0x80bcdb05, 0xa8f0fe06, 0x26789a48, 0xd531ead8, 0x73f5ab95, 0xa31a6cd1, 0x0bea92d7, +0x8d1ce979, 0xf59bbf39, 0xdc18419a, 0x582d03a1, 0x7f022d4b, 0xa93f25a6, 0x7e5599e9, 0x762b8609, 0x8435423b, 0xf6975d0c, 0x8a01fd70, 0xabfc1c33, 0xd95e0304, 0x82e78d92, 0x88c2c4e5, 0xfde5a0d9, 0x20aa55e1, 0x71369200, 0x2f51310a, 0x8fdfd0ec, +0x2fc95e08, 0x07857b0b, 0x2574787d, 0x0a254977, 0x8c4b5ddb, 0xd077a846, 0x76b3e90b, 0x70f949a0, 0x8e100b4c, 0x781f3942, 0x2d92089f, 0x7d597bdc, 0xd9c66c06, 0xa9a74aa4, 0x2b40c736, 0x57d6674a, 0x50cb7343, 0x00986f02, 0xd891d8a4, 0xf503d03b, +0x08e670e2, 0xda52e131, 0xfbaf0072, 0x064aa0ab, 0xd37b4a73, 0xf9f456e5, 0x7b8bb475, 0x558d31dd, 0x0c6fe9dc, 0xd5a985da, 0xdaca8e33, 0x0157b4a2, 0xa6c4414d, 0xa0168ee4, 0xf3497090, 0xa1d95544, 0x83285632, 0x02c33995, 0xf04592a5, 0xff26994c, +0xa1413a46, 0x77e45da9, 0xdd4ff538, 0x21fde143, 0x84ad2d39, 0x5681d3e8, 0xa70b9aed, 0xf18a4905, 0x5104a8e3, 0x5effcc08, 0x827fe290, 0x5d6b413f, 0xdf8cccad, 0xd1201ce4, 0x52084ad6, 0x25ec177f, 0x8bce26d0, 0x7a446fd5, 0x83b03930, 0x23a6b7d4, +0x79488de0, 0x7adc00d7, 0xf8a3e247, 0x28d44a01, 0xfb376f70, 0xf286ab30, 0xf7c0e9ae, 0x5c3cf59d, 0x5fa878aa, 0x20323ae3, 0x574e0848, 0xf60f320e, 0xffbef64e, 0x8f47bfee, 0xf4546499, 0xd76abc4f, 0xf1122607, 0xdedb780f, 0x0411f63c, 0xdc802e98, +0x2e0685a8, 0xf4cc0b9b, 0x535ffe74, 0x087e1fe0, 0xad2ed39a, 0x58b56ca3, 0x5bb98e96, 0x22696c74, 0x284c2503, 0xa38203d3, 0xfaf8b4d0, 0x0929ab42, 0x09b1c440, 0xa550cc7a, 0x8562f699, 0x24bba3dd, 0xa24dd873, 0x8e88644e, 0x890d1f45, 0x89957047, +0x030ce235, 0xddd79a3a, 0x2d0a679d, 0xa65c2e4f, 0x0ffb64eb, 0x0abd2675, 0x5aee3a34, 0x54da857f, 0x7c0ecf7e, 0x291b91a1, 0xace1083a, 0x5b21e194, 0xf3d11f92, 0xa5c8a378, 0xfa60dbd2, 0x0cf786de, 0x22f10376, 0x87a1cf0c, 0x8b5649d2, 0x2cc5bc3d, +0x01cfdba0, 0x866e14ac, 0x26e0f54a, 0x025b5697, 0x723a7035, 0x817300a5, 0x529025d4, 0x2a8f1c96, 0xfd7dcfdb, 0xae2231af, 0x777c32ab, 0x0d385d7e, 0x21658e41, 0x7dc114de, 0x59e2d801, 0x06d2cfa9, 0x8739a00e, 0x78875640, 0x233ed8d6, 0x272f2eea, +0x00000000, 0x27b741e8, 0xafedea0f, 0x736dc497, 0x7ecdf6eb, 0x0b72fdd5, 0x71aefd02, 0xf75886ac, 0x885aabe7, 0x05de2d9c, 0xaa33c793, 0xf21ec432, 0xfe712dee, 0x55155edf, 0xdb9d3a91, 0x7f9a4249, ] + +d0x6a089498=[ 0x00000000, 0xda6244ff, 0x161141b1, 0xcc73054e, 0x39bda818, 0xe3dfece7, 0x2face9a9, 0xf5cead56, 0xbdebea6a, 0x6789ae95, 0xabfaabdb, 0x7198ef24, 0x84564272, 0x5e34068d, 0x924703c3, 0x4825473c, 0x9c2f00f1, 0x464d440e, 0x8a3e4140, 0x505c05bf, +0xa592a8e9, 0x7ff0ec16, 0xb383e958, 0x69e1ada7, 0x21c4ea9b, 0xfba6ae64, 0x37d5ab2a, 0xedb7efd5, 0x18794283, 0xc21b067c, 0x0e680332, 0xd40a47cd, 0xe8da3753, 0x32b873ac, 0xfecb76e2, 0x24a9321d, 0xd1679f4b, 0x0b05dbb4, 0xc776defa, 0x1d149a05, +0x5531dd39, 0x8f5399c6, 0x43209c88, 0x9942d877, 0x6c8c7521, 0xb6ee31de, 0x7a9d3490, 0xa0ff706f, 0x74f537a2, 0xae97735d, 0x62e47613, 0xb88632ec, 0x4d489fba, 0x972adb45, 0x5b59de0b, 0x813b9af4, 0xc91eddc8, 0x137c9937, 0xdf0f9c79, 0x056dd886, +0xf0a375d0, 0x2ac1312f, 0xe6b23461, 0x3cd0709e, 0x65cd88fe, 0xbfafcc01, 0x73dcc94f, 0xa9be8db0, 0x5c7020e6, 0x86126419, 0x4a616157, 0x900325a8, 0xd8266294, 0x0244266b, 0xce372325, 0x145567da, 0xe19bca8c, 0x3bf98e73, 0xf78a8b3d, 0x2de8cfc2, +0xf9e2880f, 0x2380ccf0, 0xeff3c9be, 0x35918d41, 0xc05f2017, 0x1a3d64e8, 0xd64e61a6, 0x0c2c2559, 0x44096265, 0x9e6b269a, 0x521823d4, 0x887a672b, 0x7db4ca7d, 0xa7d68e82, 0x6ba58bcc, 0xb1c7cf33, 0x8d17bfad, 0x5775fb52, 0x9b06fe1c, 0x4164bae3, +0xb4aa17b5, 0x6ec8534a, 0xa2bb5604, 0x78d912fb, 0x30fc55c7, 0xea9e1138, 0x26ed1476, 0xfc8f5089, 0x0941fddf, 0xd323b920, 0x1f50bc6e, 0xc532f891, 0x1138bf5c, 0xcb5afba3, 0x0729feed, 0xdd4bba12, 0x28851744, 0xf2e753bb, 0x3e9456f5, 0xe4f6120a, +0xacd35536, 0x76b111c9, 0xbac21487, 0x60a05078, 0x956efd2e, 0x4f0cb9d1, 0x837fbc9f, 0x591df860, 0x11f8d1c9, 0xcb9a9536, 0x07e99078, 0xdd8bd487, 0x284579d1, 0xf2273d2e, 0x3e543860, 0xe4367c9f, 0xac133ba3, 0x76717f5c, 0xba027a12, 0x60603eed, +0x95ae93bb, 0x4fccd744, 0x83bfd20a, 0x59dd96f5, 0x8dd7d138, 0x57b595c7, 0x9bc69089, 0x41a4d476, 0xb46a7920, 0x6e083ddf, 0xa27b3891, 0x78197c6e, 0x303c3b52, 0xea5e7fad, 0x262d7ae3, 0xfc4f3e1c, 0x0981934a, 0xd3e3d7b5, 0x1f90d2fb, 0xc5f29604, +0xf922e69a, 0x2340a265, 0xef33a72b, 0x3551e3d4, 0xc09f4e82, 0x1afd0a7d, 0xd68e0f33, 0x0cec4bcc, 0x44c90cf0, 0x9eab480f, 0x52d84d41, 0x88ba09be, 0x7d74a4e8, 0xa716e017, 0x6b65e559, 0xb107a1a6, 0x650de66b, 0xbf6fa294, 0x731ca7da, 0xa97ee325, +0x5cb04e73, 0x86d20a8c, 0x4aa10fc2, 0x90c34b3d, 0xd8e60c01, 0x028448fe, 0xcef74db0, 0x1495094f, 0xe15ba419, 0x3b39e0e6, 0xf74ae5a8, 0x2d28a157, 0x74355937, 0xae571dc8, 0x62241886, 0xb8465c79, 0x4d88f12f, 0x97eab5d0, 0x5b99b09e, 0x81fbf461, +0xc9deb35d, 0x13bcf7a2, 0xdfcff2ec, 0x05adb613, 0xf0631b45, 0x2a015fba, 0xe6725af4, 0x3c101e0b, 0xe81a59c6, 0x32781d39, 0xfe0b1877, 0x24695c88, 0xd1a7f1de, 0x0bc5b521, 0xc7b6b06f, 0x1dd4f490, 0x55f1b3ac, 0x8f93f753, 0x43e0f21d, 0x9982b6e2, +0x6c4c1bb4, 0xb62e5f4b, 0x7a5d5a05, 0xa03f1efa, 0x9cef6e64, 0x468d2a9b, 0x8afe2fd5, 0x509c6b2a, 0xa552c67c, 0x7f308283, 0xb34387cd, 0x6921c332, 0x2104840e, 0xfb66c0f1, 0x3715c5bf, 0xed778140, 0x18b92c16, 0xc2db68e9, 0x0ea86da7, 0xd4ca2958, +0x00c06e95, 0xdaa22a6a, 0x16d12f24, 0xccb36bdb, 0x397dc68d, 0xe31f8272, 0x2f6c873c, 0xf50ec3c3, 0xbd2b84ff, 0x6749c000, 0xab3ac54e, 0x715881b1, 0x84962ce7, 0x5ef46818, 0x92876d56, 0x48e529a9, 0x00000000, 0xd77f2de2, 0x461aba85, 0x91659767, +0x8618701a, 0x51675df8, 0xc002ca9f, 0x177de77d, 0xc514568c, 0x126b7b6e, 0x830eec09, 0x5471c1eb, 0x430c2696, 0x94730b74, 0x05169c13, 0xd269b1f1, 0xc0364fb7, 0x17496255, 0x862cf532, 0x5153d8d0, 0x462e3fad, 0x9151124f, 0x00348528, 0xd74ba8ca, +0x0522193b, 0xd25d34d9, 0x4338a3be, 0x94478e5c, 0x833a6921, 0x544544c3, 0xc520d3a4, 0x125ffe46, 0x82b53b6e, 0x55ca168c, 0xc4af81eb, 0x13d0ac09, 0x04ad4b74, 0xd3d26696, 0x42b7f1f1, 0x95c8dc13, 0x47a16de2, 0x90de4000, 0x01bbd767, 0xd6c4fa85, +0xc1b91df8, 0x16c6301a, 0x87a3a77d, 0x50dc8a9f, 0x428374d9, 0x95fc593b, 0x0499ce5c, 0xd3e6e3be, 0xc49b04c3, 0x13e42921, 0x8281be46, 0x55fe93a4, 0x87972255, 0x50e80fb7, 0xc18d98d0, 0x16f2b532, 0x018f524f, 0xd6f07fad, 0x4795e8ca, 0x90eac528, +0x0f6adc4c, 0xd815f1ae, 0x497066c9, 0x9e0f4b2b, 0x8972ac56, 0x5e0d81b4, 0xcf6816d3, 0x18173b31, 0xca7e8ac0, 0x1d01a722, 0x8c643045, 0x5b1b1da7, 0x4c66fada, 0x9b19d738, 0x0a7c405f, 0xdd036dbd, 0xcf5c93fb, 0x1823be19, 0x8946297e, 0x5e39049c, +0x4944e3e1, 0x9e3bce03, 0x0f5e5964, 0xd8217486, 0x0a48c577, 0xdd37e895, 0x4c527ff2, 0x9b2d5210, 0x8c50b56d, 0x5b2f988f, 0xca4a0fe8, 0x1d35220a, 0x8ddfe722, 0x5aa0cac0, 0xcbc55da7, 0x1cba7045, 0x0bc79738, 0xdcb8bada, 0x4ddd2dbd, 0x9aa2005f, +0x48cbb1ae, 0x9fb49c4c, 0x0ed10b2b, 0xd9ae26c9, 0xced3c1b4, 0x19acec56, 0x88c97b31, 0x5fb656d3, 0x4de9a895, 0x9a968577, 0x0bf31210, 0xdc8c3ff2, 0xcbf1d88f, 0x1c8ef56d, 0x8deb620a, 0x5a944fe8, 0x88fdfe19, 0x5f82d3fb, 0xcee7449c, 0x1998697e, +0x0ee58e03, 0xd99aa3e1, 0x48ff3486, 0x9f801964, 0xd9214d5a, 0x0e5e60b8, 0x9f3bf7df, 0x4844da3d, 0x5f393d40, 0x884610a2, 0x192387c5, 0xce5caa27, 0x1c351bd6, 0xcb4a3634, 0x5a2fa153, 0x8d508cb1, 0x9a2d6bcc, 0x4d52462e, 0xdc37d149, 0x0b48fcab, +0x191702ed, 0xce682f0f, 0x5f0db868, 0x8872958a, 0x9f0f72f7, 0x48705f15, 0xd915c872, 0x0e6ae590, 0xdc035461, 0x0b7c7983, 0x9a19eee4, 0x4d66c306, 0x5a1b247b, 0x8d640999, 0x1c019efe, 0xcb7eb31c, 0x5b947634, 0x8ceb5bd6, 0x1d8eccb1, 0xcaf1e153, +0xdd8c062e, 0x0af32bcc, 0x9b96bcab, 0x4ce99149, 0x9e8020b8, 0x49ff0d5a, 0xd89a9a3d, 0x0fe5b7df, 0x189850a2, 0xcfe77d40, 0x5e82ea27, 0x89fdc7c5, 0x9ba23983, 0x4cdd1461, 0xddb88306, 0x0ac7aee4, 0x1dba4999, 0xcac5647b, 0x5ba0f31c, 0x8cdfdefe, +0x5eb66f0f, 0x89c942ed, 0x18acd58a, 0xcfd3f868, 0xd8ae1f15, 0x0fd132f7, 0x9eb4a590, 0x49cb8872, 0xd64b9116, 0x0134bcf4, 0x90512b93, 0x472e0671, 0x5053e10c, 0x872cccee, 0x16495b89, 0xc136766b, 0x135fc79a, 0xc420ea78, 0x55457d1f, 0x823a50fd, +0x9547b780, 0x42389a62, 0xd35d0d05, 0x042220e7, 0x167ddea1, 0xc102f343, 0x50676424, 0x871849c6, 0x9065aebb, 0x471a8359, 0xd67f143e, 0x010039dc, 0xd369882d, 0x0416a5cf, 0x957332a8, 0x420c1f4a, 0x5571f837, 0x820ed5d5, 0x136b42b2, 0xc4146f50, +0x54feaa78, 0x8381879a, 0x12e410fd, 0xc59b3d1f, 0xd2e6da62, 0x0599f780, 0x94fc60e7, 0x43834d05, 0x91eafcf4, 0x4695d116, 0xd7f04671, 0x008f6b93, 0x17f28cee, 0xc08da10c, 0x51e8366b, 0x86971b89, 0x94c8e5cf, 0x43b7c82d, 0xd2d25f4a, 0x05ad72a8, +0x12d095d5, 0xc5afb837, 0x54ca2f50, 0x83b502b2, 0x51dcb343, 0x86a39ea1, 0x17c609c6, 0xc0b92424, 0xd7c4c359, 0x00bbeebb, 0x91de79dc, 0x46a1543e, 0x00000000, 0x3c748d01, 0xd5483d5d, 0xe93cb05c, 0x3567a665, 0x09132b64, 0xe02f9b38, 0xdc5b1639, +0xa3574e5b, 0x9f23c35a, 0x761f7306, 0x4a6bfe07, 0x9630e83e, 0xaa44653f, 0x4378d563, 0x7f0c5862, 0x87e1f293, 0xbb957f92, 0x52a9cfce, 0x6edd42cf, 0xb28654f6, 0x8ef2d9f7, 0x67ce69ab, 0x5bbae4aa, 0x24b6bcc8, 0x18c231c9, 0xf1fe8195, 0xcd8a0c94, +0x11d11aad, 0x2da597ac, 0xc49927f0, 0xf8edaaf1, 0xf1943079, 0xcde0bd78, 0x24dc0d24, 0x18a88025, 0xc4f3961c, 0xf8871b1d, 0x11bbab41, 0x2dcf2640, 0x52c37e22, 0x6eb7f323, 0x878b437f, 0xbbffce7e, 0x67a4d847, 0x5bd05546, 0xb2ece51a, 0x8e98681b, +0x7675c2ea, 0x4a014feb, 0xa33dffb7, 0x9f4972b6, 0x4312648f, 0x7f66e98e, 0x965a59d2, 0xaa2ed4d3, 0xd5228cb1, 0xe95601b0, 0x006ab1ec, 0x3c1e3ced, 0xe0452ad4, 0xdc31a7d5, 0x350d1789, 0x09799a88, 0xa3d14b79, 0x9fa5c678, 0x76997624, 0x4aedfb25, +0x96b6ed1c, 0xaac2601d, 0x43fed041, 0x7f8a5d40, 0x00860522, 0x3cf28823, 0xd5ce387f, 0xe9bab57e, 0x35e1a347, 0x09952e46, 0xe0a99e1a, 0xdcdd131b, 0x2430b9ea, 0x184434eb, 0xf17884b7, 0xcd0c09b6, 0x11571f8f, 0x2d23928e, 0xc41f22d2, 0xf86bafd3, +0x8767f7b1, 0xbb137ab0, 0x522fcaec, 0x6e5b47ed, 0xb20051d4, 0x8e74dcd5, 0x67486c89, 0x5b3ce188, 0x52457b00, 0x6e31f601, 0x870d465d, 0xbb79cb5c, 0x6722dd65, 0x5b565064, 0xb26ae038, 0x8e1e6d39, 0xf112355b, 0xcd66b85a, 0x245a0806, 0x182e8507, +0xc475933e, 0xf8011e3f, 0x113dae63, 0x2d492362, 0xd5a48993, 0xe9d00492, 0x00ecb4ce, 0x3c9839cf, 0xe0c32ff6, 0xdcb7a2f7, 0x358b12ab, 0x09ff9faa, 0x76f3c7c8, 0x4a874ac9, 0xa3bbfa95, 0x9fcf7794, 0x439461ad, 0x7fe0ecac, 0x96dc5cf0, 0xaaa8d1f1, +0x979912d4, 0xabed9fd5, 0x42d12f89, 0x7ea5a288, 0xa2feb4b1, 0x9e8a39b0, 0x77b689ec, 0x4bc204ed, 0x34ce5c8f, 0x08bad18e, 0xe18661d2, 0xddf2ecd3, 0x01a9faea, 0x3ddd77eb, 0xd4e1c7b7, 0xe8954ab6, 0x1078e047, 0x2c0c6d46, 0xc530dd1a, 0xf944501b, +0x251f4622, 0x196bcb23, 0xf0577b7f, 0xcc23f67e, 0xb32fae1c, 0x8f5b231d, 0x66679341, 0x5a131e40, 0x86480879, 0xba3c8578, 0x53003524, 0x6f74b825, 0x660d22ad, 0x5a79afac, 0xb3451ff0, 0x8f3192f1, 0x536a84c8, 0x6f1e09c9, 0x8622b995, 0xba563494, +0xc55a6cf6, 0xf92ee1f7, 0x101251ab, 0x2c66dcaa, 0xf03dca93, 0xcc494792, 0x2575f7ce, 0x19017acf, 0xe1ecd03e, 0xdd985d3f, 0x34a4ed63, 0x08d06062, 0xd48b765b, 0xe8fffb5a, 0x01c34b06, 0x3db7c607, 0x42bb9e65, 0x7ecf1364, 0x97f3a338, 0xab872e39, +0x77dc3800, 0x4ba8b501, 0xa294055d, 0x9ee0885c, 0x344859ad, 0x083cd4ac, 0xe10064f0, 0xdd74e9f1, 0x012fffc8, 0x3d5b72c9, 0xd467c295, 0xe8134f94, 0x971f17f6, 0xab6b9af7, 0x42572aab, 0x7e23a7aa, 0xa278b193, 0x9e0c3c92, 0x77308cce, 0x4b4401cf, +0xb3a9ab3e, 0x8fdd263f, 0x66e19663, 0x5a951b62, 0x86ce0d5b, 0xbaba805a, 0x53863006, 0x6ff2bd07, 0x10fee565, 0x2c8a6864, 0xc5b6d838, 0xf9c25539, 0x25994300, 0x19edce01, 0xf0d17e5d, 0xcca5f35c, 0xc5dc69d4, 0xf9a8e4d5, 0x10945489, 0x2ce0d988, +0xf0bbcfb1, 0xcccf42b0, 0x25f3f2ec, 0x19877fed, 0x668b278f, 0x5affaa8e, 0xb3c31ad2, 0x8fb797d3, 0x53ec81ea, 0x6f980ceb, 0x86a4bcb7, 0xbad031b6, 0x423d9b47, 0x7e491646, 0x9775a61a, 0xab012b1b, 0x775a3d22, 0x4b2eb023, 0xa212007f, 0x9e668d7e, +0xe16ad51c, 0xdd1e581d, 0x3422e841, 0x08566540, 0xd40d7379, 0xe879fe78, 0x01454e24, 0x3d31c325, 0x00000000, 0x0d45dc78, 0x02bdba72, 0x0ff8660a, 0xa015d2f7, 0xad500e8f, 0xa2a86885, 0xafedb4fd, 0x9e3d71fb, 0x9378ad83, 0x9c80cb89, 0x91c517f1, +0x3e28a30c, 0x336d7f74, 0x3c95197e, 0x31d0c506, 0x057e4a38, 0x083b9640, 0x07c3f04a, 0x0a862c32, 0xa56b98cf, 0xa82e44b7, 0xa7d622bd, 0xaa93fec5, 0x9b433bc3, 0x9606e7bb, 0x99fe81b1, 0x94bb5dc9, 0x3b56e934, 0x3613354c, 0x39eb5346, 0x34ae8f3e, +0x49e618f8, 0x44a3c480, 0x4b5ba28a, 0x461e7ef2, 0xe9f3ca0f, 0xe4b61677, 0xeb4e707d, 0xe60bac05, 0xd7db6903, 0xda9eb57b, 0xd566d371, 0xd8230f09, 0x77cebbf4, 0x7a8b678c, 0x75730186, 0x7836ddfe, 0x4c9852c0, 0x41dd8eb8, 0x4e25e8b2, 0x436034ca, +0xec8d8037, 0xe1c85c4f, 0xee303a45, 0xe375e63d, 0xd2a5233b, 0xdfe0ff43, 0xd0189949, 0xdd5d4531, 0x72b0f1cc, 0x7ff52db4, 0x700d4bbe, 0x7d4897c6, 0x821eca41, 0x8f5b1639, 0x80a37033, 0x8de6ac4b, 0x220b18b6, 0x2f4ec4ce, 0x20b6a2c4, 0x2df37ebc, +0x1c23bbba, 0x116667c2, 0x1e9e01c8, 0x13dbddb0, 0xbc36694d, 0xb173b535, 0xbe8bd33f, 0xb3ce0f47, 0x87608079, 0x8a255c01, 0x85dd3a0b, 0x8898e673, 0x2775528e, 0x2a308ef6, 0x25c8e8fc, 0x288d3484, 0x195df182, 0x14182dfa, 0x1be04bf0, 0x16a59788, +0xb9482375, 0xb40dff0d, 0xbbf59907, 0xb6b0457f, 0xcbf8d2b9, 0xc6bd0ec1, 0xc94568cb, 0xc400b4b3, 0x6bed004e, 0x66a8dc36, 0x6950ba3c, 0x64156644, 0x55c5a342, 0x58807f3a, 0x57781930, 0x5a3dc548, 0xf5d071b5, 0xf895adcd, 0xf76dcbc7, 0xfa2817bf, +0xce869881, 0xc3c344f9, 0xcc3b22f3, 0xc17efe8b, 0x6e934a76, 0x63d6960e, 0x6c2ef004, 0x616b2c7c, 0x50bbe97a, 0x5dfe3502, 0x52065308, 0x5f438f70, 0xf0ae3b8d, 0xfdebe7f5, 0xf21381ff, 0xff565d87, 0xfbd2a72d, 0xf6977b55, 0xf96f1d5f, 0xf42ac127, +0x5bc775da, 0x5682a9a2, 0x597acfa8, 0x543f13d0, 0x65efd6d6, 0x68aa0aae, 0x67526ca4, 0x6a17b0dc, 0xc5fa0421, 0xc8bfd859, 0xc747be53, 0xca02622b, 0xfeaced15, 0xf3e9316d, 0xfc115767, 0xf1548b1f, 0x5eb93fe2, 0x53fce39a, 0x5c048590, 0x514159e8, +0x60919cee, 0x6dd44096, 0x622c269c, 0x6f69fae4, 0xc0844e19, 0xcdc19261, 0xc239f46b, 0xcf7c2813, 0xb234bfd5, 0xbf7163ad, 0xb08905a7, 0xbdccd9df, 0x12216d22, 0x1f64b15a, 0x109cd750, 0x1dd90b28, 0x2c09ce2e, 0x214c1256, 0x2eb4745c, 0x23f1a824, +0x8c1c1cd9, 0x8159c0a1, 0x8ea1a6ab, 0x83e47ad3, 0xb74af5ed, 0xba0f2995, 0xb5f74f9f, 0xb8b293e7, 0x175f271a, 0x1a1afb62, 0x15e29d68, 0x18a74110, 0x29778416, 0x2432586e, 0x2bca3e64, 0x268fe21c, 0x896256e1, 0x84278a99, 0x8bdfec93, 0x869a30eb, +0x79cc6d6c, 0x7489b114, 0x7b71d71e, 0x76340b66, 0xd9d9bf9b, 0xd49c63e3, 0xdb6405e9, 0xd621d991, 0xe7f11c97, 0xeab4c0ef, 0xe54ca6e5, 0xe8097a9d, 0x47e4ce60, 0x4aa11218, 0x45597412, 0x481ca86a, 0x7cb22754, 0x71f7fb2c, 0x7e0f9d26, 0x734a415e, +0xdca7f5a3, 0xd1e229db, 0xde1a4fd1, 0xd35f93a9, 0xe28f56af, 0xefca8ad7, 0xe032ecdd, 0xed7730a5, 0x429a8458, 0x4fdf5820, 0x40273e2a, 0x4d62e252, 0x302a7594, 0x3d6fa9ec, 0x3297cfe6, 0x3fd2139e, 0x903fa763, 0x9d7a7b1b, 0x92821d11, 0x9fc7c169, +0xae17046f, 0xa352d817, 0xacaabe1d, 0xa1ef6265, 0x0e02d698, 0x03470ae0, 0x0cbf6cea, 0x01fab092, 0x35543fac, 0x3811e3d4, 0x37e985de, 0x3aac59a6, 0x9541ed5b, 0x98043123, 0x97fc5729, 0x9ab98b51, 0xab694e57, 0xa62c922f, 0xa9d4f425, 0xa491285d, +0x0b7c9ca0, 0x063940d8, 0x09c126d2, 0x0484faaa, 0x00000000, 0x9c217fdc, 0x3163d277, 0xad42adab, 0x7a3bcf88, 0xe61ab054, 0x4b581dff, 0xd7796223, 0xd3fad313, 0x4fdbaccf, 0xe2990164, 0x7eb87eb8, 0xa9c11c9b, 0x35e06347, 0x98a2ceec, 0x0483b130, +0x83f3ca6a, 0x1fd2b5b6, 0xb290181d, 0x2eb167c1, 0xf9c805e2, 0x65e97a3e, 0xc8abd795, 0x548aa849, 0x50091979, 0xcc2866a5, 0x616acb0e, 0xfd4bb4d2, 0x2a32d6f1, 0xb613a92d, 0x1b510486, 0x87707b5a, 0x8da0f101, 0x11818edd, 0xbcc32376, 0x20e25caa, +0xf79b3e89, 0x6bba4155, 0xc6f8ecfe, 0x5ad99322, 0x5e5a2212, 0xc27b5dce, 0x6f39f065, 0xf3188fb9, 0x2461ed9a, 0xb8409246, 0x15023fed, 0x89234031, 0x0e533b6b, 0x927244b7, 0x3f30e91c, 0xa31196c0, 0x7468f4e3, 0xe8498b3f, 0x450b2694, 0xd92a5948, +0xdda9e878, 0x418897a4, 0xecca3a0f, 0x70eb45d3, 0xa79227f0, 0x3bb3582c, 0x96f1f587, 0x0ad08a5b, 0xe9b282a9, 0x7593fd75, 0xd8d150de, 0x44f02f02, 0x93894d21, 0x0fa832fd, 0xa2ea9f56, 0x3ecbe08a, 0x3a4851ba, 0xa6692e66, 0x0b2b83cd, 0x970afc11, +0x40739e32, 0xdc52e1ee, 0x71104c45, 0xed313399, 0x6a4148c3, 0xf660371f, 0x5b229ab4, 0xc703e568, 0x107a874b, 0x8c5bf897, 0x2119553c, 0xbd382ae0, 0xb9bb9bd0, 0x259ae40c, 0x88d849a7, 0x14f9367b, 0xc3805458, 0x5fa12b84, 0xf2e3862f, 0x6ec2f9f3, +0x641273a8, 0xf8330c74, 0x5571a1df, 0xc950de03, 0x1e29bc20, 0x8208c3fc, 0x2f4a6e57, 0xb36b118b, 0xb7e8a0bb, 0x2bc9df67, 0x868b72cc, 0x1aaa0d10, 0xcdd36f33, 0x51f210ef, 0xfcb0bd44, 0x6091c298, 0xe7e1b9c2, 0x7bc0c61e, 0xd6826bb5, 0x4aa31469, +0x9dda764a, 0x01fb0996, 0xacb9a43d, 0x3098dbe1, 0x341b6ad1, 0xa83a150d, 0x0578b8a6, 0x9959c77a, 0x4e20a559, 0xd201da85, 0x7f43772e, 0xe36208f2, 0xb5b8cd7f, 0x2999b2a3, 0x84db1f08, 0x18fa60d4, 0xcf8302f7, 0x53a27d2b, 0xfee0d080, 0x62c1af5c, +0x66421e6c, 0xfa6361b0, 0x5721cc1b, 0xcb00b3c7, 0x1c79d1e4, 0x8058ae38, 0x2d1a0393, 0xb13b7c4f, 0x364b0715, 0xaa6a78c9, 0x0728d562, 0x9b09aabe, 0x4c70c89d, 0xd051b741, 0x7d131aea, 0xe1326536, 0xe5b1d406, 0x7990abda, 0xd4d20671, 0x48f379ad, +0x9f8a1b8e, 0x03ab6452, 0xaee9c9f9, 0x32c8b625, 0x38183c7e, 0xa43943a2, 0x097bee09, 0x955a91d5, 0x4223f3f6, 0xde028c2a, 0x73402181, 0xef615e5d, 0xebe2ef6d, 0x77c390b1, 0xda813d1a, 0x46a042c6, 0x91d920e5, 0x0df85f39, 0xa0baf292, 0x3c9b8d4e, +0xbbebf614, 0x27ca89c8, 0x8a882463, 0x16a95bbf, 0xc1d0399c, 0x5df14640, 0xf0b3ebeb, 0x6c929437, 0x68112507, 0xf4305adb, 0x5972f770, 0xc55388ac, 0x122aea8f, 0x8e0b9553, 0x234938f8, 0xbf684724, 0x5c0a4fd6, 0xc02b300a, 0x6d699da1, 0xf148e27d, +0x2631805e, 0xba10ff82, 0x17525229, 0x8b732df5, 0x8ff09cc5, 0x13d1e319, 0xbe934eb2, 0x22b2316e, 0xf5cb534d, 0x69ea2c91, 0xc4a8813a, 0x5889fee6, 0xdff985bc, 0x43d8fa60, 0xee9a57cb, 0x72bb2817, 0xa5c24a34, 0x39e335e8, 0x94a19843, 0x0880e79f, +0x0c0356af, 0x90222973, 0x3d6084d8, 0xa141fb04, 0x76389927, 0xea19e6fb, 0x475b4b50, 0xdb7a348c, 0xd1aabed7, 0x4d8bc10b, 0xe0c96ca0, 0x7ce8137c, 0xab91715f, 0x37b00e83, 0x9af2a328, 0x06d3dcf4, 0x02506dc4, 0x9e711218, 0x3333bfb3, 0xaf12c06f, +0x786ba24c, 0xe44add90, 0x4908703b, 0xd5290fe7, 0x525974bd, 0xce780b61, 0x633aa6ca, 0xff1bd916, 0x2862bb35, 0xb443c4e9, 0x19016942, 0x8520169e, 0x81a3a7ae, 0x1d82d872, 0xb0c075d9, 0x2ce10a05, 0xfb986826, 0x67b917fa, 0xcafbba51, 0x56dac58d, +0x00000000, 0xc3c13ce5, 0x50f43343, 0x93350fa6, 0x8030f6e6, 0x43f1ca03, 0xd0c4c5a5, 0x1305f940, 0xf3c9690c, 0x300855e9, 0xa33d5a4f, 0x60fc66aa, 0x73f99fea, 0xb038a30f, 0x230daca9, 0xe0cc904c, 0x1fd7d5bd, 0xdc16e958, 0x4f23e6fe, 0x8ce2da1b, +0x9fe7235b, 0x5c261fbe, 0xcf131018, 0x0cd22cfd, 0xec1ebcb1, 0x2fdf8054, 0xbcea8ff2, 0x7f2bb317, 0x6c2e4a57, 0xafef76b2, 0x3cda7914, 0xff1b45f1, 0xcc442f72, 0x0f851397, 0x9cb01c31, 0x5f7120d4, 0x4c74d994, 0x8fb5e571, 0x1c80ead7, 0xdf41d632, +0x3f8d467e, 0xfc4c7a9b, 0x6f79753d, 0xacb849d8, 0xbfbdb098, 0x7c7c8c7d, 0xef4983db, 0x2c88bf3e, 0xd393facf, 0x1052c62a, 0x8367c98c, 0x40a6f569, 0x53a30c29, 0x906230cc, 0x03573f6a, 0xc096038f, 0x205a93c3, 0xe39baf26, 0x70aea080, 0xb36f9c65, +0xa06a6525, 0x63ab59c0, 0xf09e5666, 0x335f6a83, 0x5a9d4fc3, 0x995c7326, 0x0a697c80, 0xc9a84065, 0xdaadb925, 0x196c85c0, 0x8a598a66, 0x4998b683, 0xa95426cf, 0x6a951a2a, 0xf9a0158c, 0x3a612969, 0x2964d029, 0xeaa5eccc, 0x7990e36a, 0xba51df8f, +0x454a9a7e, 0x868ba69b, 0x15bea93d, 0xd67f95d8, 0xc57a6c98, 0x06bb507d, 0x958e5fdb, 0x564f633e, 0xb683f372, 0x7542cf97, 0xe677c031, 0x25b6fcd4, 0x36b30594, 0xf5723971, 0x664736d7, 0xa5860a32, 0x96d960b1, 0x55185c54, 0xc62d53f2, 0x05ec6f17, +0x16e99657, 0xd528aab2, 0x461da514, 0x85dc99f1, 0x651009bd, 0xa6d13558, 0x35e43afe, 0xf625061b, 0xe520ff5b, 0x26e1c3be, 0xb5d4cc18, 0x7615f0fd, 0x890eb50c, 0x4acf89e9, 0xd9fa864f, 0x1a3bbaaa, 0x093e43ea, 0xcaff7f0f, 0x59ca70a9, 0x9a0b4c4c, +0x7ac7dc00, 0xb906e0e5, 0x2a33ef43, 0xe9f2d3a6, 0xfaf72ae6, 0x39361603, 0xaa0319a5, 0x69c22540, 0x7f06efb0, 0xbcc7d355, 0x2ff2dcf3, 0xec33e016, 0xff361956, 0x3cf725b3, 0xafc22a15, 0x6c0316f0, 0x8ccf86bc, 0x4f0eba59, 0xdc3bb5ff, 0x1ffa891a, +0x0cff705a, 0xcf3e4cbf, 0x5c0b4319, 0x9fca7ffc, 0x60d13a0d, 0xa31006e8, 0x3025094e, 0xf3e435ab, 0xe0e1cceb, 0x2320f00e, 0xb015ffa8, 0x73d4c34d, 0x93185301, 0x50d96fe4, 0xc3ec6042, 0x002d5ca7, 0x1328a5e7, 0xd0e99902, 0x43dc96a4, 0x801daa41, +0xb342c0c2, 0x7083fc27, 0xe3b6f381, 0x2077cf64, 0x33723624, 0xf0b30ac1, 0x63860567, 0xa0473982, 0x408ba9ce, 0x834a952b, 0x107f9a8d, 0xd3bea668, 0xc0bb5f28, 0x037a63cd, 0x904f6c6b, 0x538e508e, 0xac95157f, 0x6f54299a, 0xfc61263c, 0x3fa01ad9, +0x2ca5e399, 0xef64df7c, 0x7c51d0da, 0xbf90ec3f, 0x5f5c7c73, 0x9c9d4096, 0x0fa84f30, 0xcc6973d5, 0xdf6c8a95, 0x1cadb670, 0x8f98b9d6, 0x4c598533, 0x259ba073, 0xe65a9c96, 0x756f9330, 0xb6aeafd5, 0xa5ab5695, 0x666a6a70, 0xf55f65d6, 0x369e5933, +0xd652c97f, 0x1593f59a, 0x86a6fa3c, 0x4567c6d9, 0x56623f99, 0x95a3037c, 0x06960cda, 0xc557303f, 0x3a4c75ce, 0xf98d492b, 0x6ab8468d, 0xa9797a68, 0xba7c8328, 0x79bdbfcd, 0xea88b06b, 0x29498c8e, 0xc9851cc2, 0x0a442027, 0x99712f81, 0x5ab01364, +0x49b5ea24, 0x8a74d6c1, 0x1941d967, 0xda80e582, 0xe9df8f01, 0x2a1eb3e4, 0xb92bbc42, 0x7aea80a7, 0x69ef79e7, 0xaa2e4502, 0x391b4aa4, 0xfada7641, 0x1a16e60d, 0xd9d7dae8, 0x4ae2d54e, 0x8923e9ab, 0x9a2610eb, 0x59e72c0e, 0xcad223a8, 0x09131f4d, +0xf6085abc, 0x35c96659, 0xa6fc69ff, 0x653d551a, 0x7638ac5a, 0xb5f990bf, 0x26cc9f19, 0xe50da3fc, 0x05c133b0, 0xc6000f55, 0x553500f3, 0x96f43c16, 0x85f1c556, 0x4630f9b3, 0xd505f615, 0x16c4caf0, 0x00000000, 0xa98b6fd5, 0xeca92153, 0x45224e86, +0x6d9850d1, 0xc4133f04, 0x81317182, 0x28ba1e57, 0xbe99e48b, 0x17128b5e, 0x5230c5d8, 0xfbbbaa0d, 0xd301b45a, 0x7a8adb8f, 0x3fa89509, 0x9623fadc, 0x83aa63a2, 0x2a210c77, 0x6f0342f1, 0xc6882d24, 0xee323373, 0x47b95ca6, 0x029b1220, 0xab107df5, +0x3d338729, 0x94b8e8fc, 0xd19aa67a, 0x7811c9af, 0x50abd7f8, 0xf920b82d, 0xbc02f6ab, 0x1589997e, 0x229af2db, 0x8b119d0e, 0xce33d388, 0x67b8bc5d, 0x4f02a20a, 0xe689cddf, 0xa3ab8359, 0x0a20ec8c, 0x9c031650, 0x35887985, 0x70aa3703, 0xd92158d6, +0xf19b4681, 0x58102954, 0x1d3267d2, 0xb4b90807, 0xa1309179, 0x08bbfeac, 0x4d99b02a, 0xe412dfff, 0xcca8c1a8, 0x6523ae7d, 0x2001e0fb, 0x898a8f2e, 0x1fa975f2, 0xb6221a27, 0xf30054a1, 0x5a8b3b74, 0x72312523, 0xdbba4af6, 0x9e980470, 0x37136ba5, +0x23c1f982, 0x8a4a9657, 0xcf68d8d1, 0x66e3b704, 0x4e59a953, 0xe7d2c686, 0xa2f08800, 0x0b7be7d5, 0x9d581d09, 0x34d372dc, 0x71f13c5a, 0xd87a538f, 0xf0c04dd8, 0x594b220d, 0x1c696c8b, 0xb5e2035e, 0xa06b9a20, 0x09e0f5f5, 0x4cc2bb73, 0xe549d4a6, +0xcdf3caf1, 0x6478a524, 0x215aeba2, 0x88d18477, 0x1ef27eab, 0xb779117e, 0xf25b5ff8, 0x5bd0302d, 0x736a2e7a, 0xdae141af, 0x9fc30f29, 0x364860fc, 0x015b0b59, 0xa8d0648c, 0xedf22a0a, 0x447945df, 0x6cc35b88, 0xc548345d, 0x806a7adb, 0x29e1150e, +0xbfc2efd2, 0x16498007, 0x536bce81, 0xfae0a154, 0xd25abf03, 0x7bd1d0d6, 0x3ef39e50, 0x9778f185, 0x82f168fb, 0x2b7a072e, 0x6e5849a8, 0xc7d3267d, 0xef69382a, 0x46e257ff, 0x03c01979, 0xaa4b76ac, 0x3c688c70, 0x95e3e3a5, 0xd0c1ad23, 0x794ac2f6, +0x51f0dca1, 0xf87bb374, 0xbd59fdf2, 0x14d29227, 0x573a5878, 0xfeb137ad, 0xbb93792b, 0x121816fe, 0x3aa208a9, 0x9329677c, 0xd60b29fa, 0x7f80462f, 0xe9a3bcf3, 0x4028d326, 0x050a9da0, 0xac81f275, 0x843bec22, 0x2db083f7, 0x6892cd71, 0xc119a2a4, +0xd4903bda, 0x7d1b540f, 0x38391a89, 0x91b2755c, 0xb9086b0b, 0x108304de, 0x55a14a58, 0xfc2a258d, 0x6a09df51, 0xc382b084, 0x86a0fe02, 0x2f2b91d7, 0x07918f80, 0xae1ae055, 0xeb38aed3, 0x42b3c106, 0x75a0aaa3, 0xdc2bc576, 0x99098bf0, 0x3082e425, +0x1838fa72, 0xb1b395a7, 0xf491db21, 0x5d1ab4f4, 0xcb394e28, 0x62b221fd, 0x27906f7b, 0x8e1b00ae, 0xa6a11ef9, 0x0f2a712c, 0x4a083faa, 0xe383507f, 0xf60ac901, 0x5f81a6d4, 0x1aa3e852, 0xb3288787, 0x9b9299d0, 0x3219f605, 0x773bb883, 0xdeb0d756, +0x48932d8a, 0xe118425f, 0xa43a0cd9, 0x0db1630c, 0x250b7d5b, 0x8c80128e, 0xc9a25c08, 0x602933dd, 0x74fba1fa, 0xdd70ce2f, 0x985280a9, 0x31d9ef7c, 0x1963f12b, 0xb0e89efe, 0xf5cad078, 0x5c41bfad, 0xca624571, 0x63e92aa4, 0x26cb6422, 0x8f400bf7, +0xa7fa15a0, 0x0e717a75, 0x4b5334f3, 0xe2d85b26, 0xf751c258, 0x5edaad8d, 0x1bf8e30b, 0xb2738cde, 0x9ac99289, 0x3342fd5c, 0x7660b3da, 0xdfebdc0f, 0x49c826d3, 0xe0434906, 0xa5610780, 0x0cea6855, 0x24507602, 0x8ddb19d7, 0xc8f95751, 0x61723884, +0x56615321, 0xffea3cf4, 0xbac87272, 0x13431da7, 0x3bf903f0, 0x92726c25, 0xd75022a3, 0x7edb4d76, 0xe8f8b7aa, 0x4173d87f, 0x045196f9, 0xaddaf92c, 0x8560e77b, 0x2ceb88ae, 0x69c9c628, 0xc042a9fd, 0xd5cb3083, 0x7c405f56, 0x396211d0, 0x90e97e05, +0xb8536052, 0x11d80f87, 0x54fa4101, 0xfd712ed4, 0x6b52d408, 0xc2d9bbdd, 0x87fbf55b, 0x2e709a8e, 0x06ca84d9, 0xaf41eb0c, 0xea63a58a, 0x43e8ca5f, 0x00000000, 0xc66c8c50, 0x374d0564, 0xf1218934, 0x407a2a27, 0x8616a677, 0x77372f43, 0xb15ba313, +0x700321c7, 0xb66fad97, 0x474e24a3, 0x8122a8f3, 0x30790be0, 0xf61587b0, 0x07340e84, 0xc15882d4, 0xf052f63a, 0x363e7a6a, 0xc71ff35e, 0x01737f0e, 0xb028dc1d, 0x7644504d, 0x8765d979, 0x41095529, 0x8051d7fd, 0x463d5bad, 0xb71cd299, 0x71705ec9, +0xc02bfdda, 0x0647718a, 0xf766f8be, 0x310a74ee, 0xd536e78b, 0x135a6bdb, 0xe27be2ef, 0x24176ebf, 0x954ccdac, 0x532041fc, 0xa201c8c8, 0x646d4498, 0xa535c64c, 0x63594a1c, 0x9278c328, 0x54144f78, 0xe54fec6b, 0x2323603b, 0xd202e90f, 0x146e655f, +0x256411b1, 0xe3089de1, 0x122914d5, 0xd4459885, 0x651e3b96, 0xa372b7c6, 0x52533ef2, 0x943fb2a2, 0x55673076, 0x930bbc26, 0x622a3512, 0xa446b942, 0x151d1a51, 0xd3719601, 0x22501f35, 0xe43c9365, 0x9a71d80f, 0x5c1d545f, 0xad3cdd6b, 0x6b50513b, +0xda0bf228, 0x1c677e78, 0xed46f74c, 0x2b2a7b1c, 0xea72f9c8, 0x2c1e7598, 0xdd3ffcac, 0x1b5370fc, 0xaa08d3ef, 0x6c645fbf, 0x9d45d68b, 0x5b295adb, 0x6a232e35, 0xac4fa265, 0x5d6e2b51, 0x9b02a701, 0x2a590412, 0xec358842, 0x1d140176, 0xdb788d26, +0x1a200ff2, 0xdc4c83a2, 0x2d6d0a96, 0xeb0186c6, 0x5a5a25d5, 0x9c36a985, 0x6d1720b1, 0xab7bace1, 0x4f473f84, 0x892bb3d4, 0x780a3ae0, 0xbe66b6b0, 0x0f3d15a3, 0xc95199f3, 0x387010c7, 0xfe1c9c97, 0x3f441e43, 0xf9289213, 0x08091b27, 0xce659777, +0x7f3e3464, 0xb952b834, 0x48733100, 0x8e1fbd50, 0xbf15c9be, 0x797945ee, 0x8858ccda, 0x4e34408a, 0xff6fe399, 0x39036fc9, 0xc822e6fd, 0x0e4e6aad, 0xcf16e879, 0x097a6429, 0xf85bed1d, 0x3e37614d, 0x8f6cc25e, 0x49004e0e, 0xb821c73a, 0x7e4d4b6a, +0x5970ba68, 0x9f1c3638, 0x6e3dbf0c, 0xa851335c, 0x190a904f, 0xdf661c1f, 0x2e47952b, 0xe82b197b, 0x29739baf, 0xef1f17ff, 0x1e3e9ecb, 0xd852129b, 0x6909b188, 0xaf653dd8, 0x5e44b4ec, 0x982838bc, 0xa9224c52, 0x6f4ec002, 0x9e6f4936, 0x5803c566, +0xe9586675, 0x2f34ea25, 0xde156311, 0x1879ef41, 0xd9216d95, 0x1f4de1c5, 0xee6c68f1, 0x2800e4a1, 0x995b47b2, 0x5f37cbe2, 0xae1642d6, 0x687ace86, 0x8c465de3, 0x4a2ad1b3, 0xbb0b5887, 0x7d67d4d7, 0xcc3c77c4, 0x0a50fb94, 0xfb7172a0, 0x3d1dfef0, +0xfc457c24, 0x3a29f074, 0xcb087940, 0x0d64f510, 0xbc3f5603, 0x7a53da53, 0x8b725367, 0x4d1edf37, 0x7c14abd9, 0xba782789, 0x4b59aebd, 0x8d3522ed, 0x3c6e81fe, 0xfa020dae, 0x0b23849a, 0xcd4f08ca, 0x0c178a1e, 0xca7b064e, 0x3b5a8f7a, 0xfd36032a, +0x4c6da039, 0x8a012c69, 0x7b20a55d, 0xbd4c290d, 0xc3016267, 0x056dee37, 0xf44c6703, 0x3220eb53, 0x837b4840, 0x4517c410, 0xb4364d24, 0x725ac174, 0xb30243a0, 0x756ecff0, 0x844f46c4, 0x4223ca94, 0xf3786987, 0x3514e5d7, 0xc4356ce3, 0x0259e0b3, +0x3353945d, 0xf53f180d, 0x041e9139, 0xc2721d69, 0x7329be7a, 0xb545322a, 0x4464bb1e, 0x8208374e, 0x4350b59a, 0x853c39ca, 0x741db0fe, 0xb2713cae, 0x032a9fbd, 0xc54613ed, 0x34679ad9, 0xf20b1689, 0x163785ec, 0xd05b09bc, 0x217a8088, 0xe7160cd8, +0x564dafcb, 0x9021239b, 0x6100aaaf, 0xa76c26ff, 0x6634a42b, 0xa058287b, 0x5179a14f, 0x97152d1f, 0x264e8e0c, 0xe022025c, 0x11038b68, 0xd76f0738, 0xe66573d6, 0x2009ff86, 0xd12876b2, 0x1744fae2, 0xa61f59f1, 0x6073d5a1, 0x91525c95, 0x573ed0c5, +0x96665211, 0x500ade41, 0xa12b5775, 0x6747db25, 0xd61c7836, 0x1070f466, 0xe1517d52, 0x273df102, 0x00000000, 0x3f859fc2, 0xe32975ce, 0xdcacea0c, 0xc668b6f9, 0xf9ed293b, 0x2541c337, 0x1ac45cf5, 0xd386cae6, 0xec035524, 0x30afbf28, 0x0f2a20ea, +0x15ee7c1f, 0x2a6be3dd, 0xf6c709d1, 0xc9429613, 0xb7012d9f, 0x8884b25d, 0x54285851, 0x6badc793, 0x71699b66, 0x4eec04a4, 0x9240eea8, 0xadc5716a, 0x6487e779, 0x5b0278bb, 0x87ae92b7, 0xb82b0d75, 0xa2ef5180, 0x9d6ace42, 0x41c6244e, 0x7e43bb8c, +0x0ab13015, 0x3534afd7, 0xe99845db, 0xd61dda19, 0xccd986ec, 0xf35c192e, 0x2ff0f322, 0x10756ce0, 0xd937faf3, 0xe6b26531, 0x3a1e8f3d, 0x059b10ff, 0x1f5f4c0a, 0x20dad3c8, 0xfc7639c4, 0xc3f3a606, 0xbdb01d8a, 0x82358248, 0x5e996844, 0x611cf786, +0x7bd8ab73, 0x445d34b1, 0x98f1debd, 0xa774417f, 0x6e36d76c, 0x51b348ae, 0x8d1fa2a2, 0xb29a3d60, 0xa85e6195, 0x97dbfe57, 0x4b77145b, 0x74f28b99, 0xd6aa328b, 0xe92fad49, 0x35834745, 0x0a06d887, 0x10c28472, 0x2f471bb0, 0xf3ebf1bc, 0xcc6e6e7e, +0x052cf86d, 0x3aa967af, 0xe6058da3, 0xd9801261, 0xc3444e94, 0xfcc1d156, 0x206d3b5a, 0x1fe8a498, 0x61ab1f14, 0x5e2e80d6, 0x82826ada, 0xbd07f518, 0xa7c3a9ed, 0x9846362f, 0x44eadc23, 0x7b6f43e1, 0xb22dd5f2, 0x8da84a30, 0x5104a03c, 0x6e813ffe, +0x7445630b, 0x4bc0fcc9, 0x976c16c5, 0xa8e98907, 0xdc1b029e, 0xe39e9d5c, 0x3f327750, 0x00b7e892, 0x1a73b467, 0x25f62ba5, 0xf95ac1a9, 0xc6df5e6b, 0x0f9dc878, 0x301857ba, 0xecb4bdb6, 0xd3312274, 0xc9f57e81, 0xf670e143, 0x2adc0b4f, 0x1559948d, +0x6b1a2f01, 0x549fb0c3, 0x88335acf, 0xb7b6c50d, 0xad7299f8, 0x92f7063a, 0x4e5bec36, 0x71de73f4, 0xb89ce5e7, 0x87197a25, 0x5bb59029, 0x64300feb, 0x7ef4531e, 0x4171ccdc, 0x9ddd26d0, 0xa258b912, 0x07322e71, 0x38b7b1b3, 0xe41b5bbf, 0xdb9ec47d, +0xc15a9888, 0xfedf074a, 0x2273ed46, 0x1df67284, 0xd4b4e497, 0xeb317b55, 0x379d9159, 0x08180e9b, 0x12dc526e, 0x2d59cdac, 0xf1f527a0, 0xce70b862, 0xb03303ee, 0x8fb69c2c, 0x531a7620, 0x6c9fe9e2, 0x765bb517, 0x49de2ad5, 0x9572c0d9, 0xaaf75f1b, +0x63b5c908, 0x5c3056ca, 0x809cbcc6, 0xbf192304, 0xa5dd7ff1, 0x9a58e033, 0x46f40a3f, 0x797195fd, 0x0d831e64, 0x320681a6, 0xeeaa6baa, 0xd12ff468, 0xcbeba89d, 0xf46e375f, 0x28c2dd53, 0x17474291, 0xde05d482, 0xe1804b40, 0x3d2ca14c, 0x02a93e8e, +0x186d627b, 0x27e8fdb9, 0xfb4417b5, 0xc4c18877, 0xba8233fb, 0x8507ac39, 0x59ab4635, 0x662ed9f7, 0x7cea8502, 0x436f1ac0, 0x9fc3f0cc, 0xa0466f0e, 0x6904f91d, 0x568166df, 0x8a2d8cd3, 0xb5a81311, 0xaf6c4fe4, 0x90e9d026, 0x4c453a2a, 0x73c0a5e8, +0xd1981cfa, 0xee1d8338, 0x32b16934, 0x0d34f6f6, 0x17f0aa03, 0x287535c1, 0xf4d9dfcd, 0xcb5c400f, 0x021ed61c, 0x3d9b49de, 0xe137a3d2, 0xdeb23c10, 0xc47660e5, 0xfbf3ff27, 0x275f152b, 0x18da8ae9, 0x66993165, 0x591caea7, 0x85b044ab, 0xba35db69, +0xa0f1879c, 0x9f74185e, 0x43d8f252, 0x7c5d6d90, 0xb51ffb83, 0x8a9a6441, 0x56368e4d, 0x69b3118f, 0x73774d7a, 0x4cf2d2b8, 0x905e38b4, 0xafdba776, 0xdb292cef, 0xe4acb32d, 0x38005921, 0x0785c6e3, 0x1d419a16, 0x22c405d4, 0xfe68efd8, 0xc1ed701a, +0x08afe609, 0x372a79cb, 0xeb8693c7, 0xd4030c05, 0xcec750f0, 0xf142cf32, 0x2dee253e, 0x126bbafc, 0x6c280170, 0x53ad9eb2, 0x8f0174be, 0xb084eb7c, 0xaa40b789, 0x95c5284b, 0x4969c247, 0x76ec5d85, 0xbfaecb96, 0x802b5454, 0x5c87be58, 0x6302219a, +0x79c67d6f, 0x4643e2ad, 0x9aef08a1, 0xa56a9763, 0x00000000, 0x602a99e3, 0x34bfe7ca, 0x54957e29, 0x70967926, 0x10bce0c5, 0x44299eec, 0x2403070f, 0x83b9a8b5, 0xe3933156, 0xb7064f7f, 0xd72cd69c, 0xf32fd193, 0x93054870, 0xc7903659, 0xa7baafba, +0xe4eab6cc, 0x84c02f2f, 0xd0555106, 0xb07fc8e5, 0x947ccfea, 0xf4565609, 0xa0c32820, 0xc0e9b1c3, 0x67531e79, 0x0779879a, 0x53ecf9b3, 0x33c66050, 0x17c5675f, 0x77effebc, 0x237a8095, 0x43501976, 0x8c083f35, 0xec22a6d6, 0xb8b7d8ff, 0xd89d411c, +0xfc9e4613, 0x9cb4dff0, 0xc821a1d9, 0xa80b383a, 0x0fb19780, 0x6f9b0e63, 0x3b0e704a, 0x5b24e9a9, 0x7f27eea6, 0x1f0d7745, 0x4b98096c, 0x2bb2908f, 0x68e289f9, 0x08c8101a, 0x5c5d6e33, 0x3c77f7d0, 0x1874f0df, 0x785e693c, 0x2ccb1715, 0x4ce18ef6, +0xeb5b214c, 0x8b71b8af, 0xdfe4c686, 0xbfce5f65, 0x9bcd586a, 0xfbe7c189, 0xaf72bfa0, 0xcf582643, 0x7d51d66e, 0x1d7b4f8d, 0x49ee31a4, 0x29c4a847, 0x0dc7af48, 0x6ded36ab, 0x39784882, 0x5952d161, 0xfee87edb, 0x9ec2e738, 0xca579911, 0xaa7d00f2, +0x8e7e07fd, 0xee549e1e, 0xbac1e037, 0xdaeb79d4, 0x99bb60a2, 0xf991f941, 0xad048768, 0xcd2e1e8b, 0xe92d1984, 0x89078067, 0xdd92fe4e, 0xbdb867ad, 0x1a02c817, 0x7a2851f4, 0x2ebd2fdd, 0x4e97b63e, 0x6a94b131, 0x0abe28d2, 0x5e2b56fb, 0x3e01cf18, +0xf159e95b, 0x917370b8, 0xc5e60e91, 0xa5cc9772, 0x81cf907d, 0xe1e5099e, 0xb57077b7, 0xd55aee54, 0x72e041ee, 0x12cad80d, 0x465fa624, 0x26753fc7, 0x027638c8, 0x625ca12b, 0x36c9df02, 0x56e346e1, 0x15b35f97, 0x7599c674, 0x210cb85d, 0x412621be, +0x652526b1, 0x050fbf52, 0x519ac17b, 0x31b05898, 0x960af722, 0xf6206ec1, 0xa2b510e8, 0xc29f890b, 0xe69c8e04, 0x86b617e7, 0xd22369ce, 0xb209f02d, 0xdf3f137d, 0xbf158a9e, 0xeb80f4b7, 0x8baa6d54, 0xafa96a5b, 0xcf83f3b8, 0x9b168d91, 0xfb3c1472, +0x5c86bbc8, 0x3cac222b, 0x68395c02, 0x0813c5e1, 0x2c10c2ee, 0x4c3a5b0d, 0x18af2524, 0x7885bcc7, 0x3bd5a5b1, 0x5bff3c52, 0x0f6a427b, 0x6f40db98, 0x4b43dc97, 0x2b694574, 0x7ffc3b5d, 0x1fd6a2be, 0xb86c0d04, 0xd84694e7, 0x8cd3eace, 0xecf9732d, +0xc8fa7422, 0xa8d0edc1, 0xfc4593e8, 0x9c6f0a0b, 0x53372c48, 0x331db5ab, 0x6788cb82, 0x07a25261, 0x23a1556e, 0x438bcc8d, 0x171eb2a4, 0x77342b47, 0xd08e84fd, 0xb0a41d1e, 0xe4316337, 0x841bfad4, 0xa018fddb, 0xc0326438, 0x94a71a11, 0xf48d83f2, +0xb7dd9a84, 0xd7f70367, 0x83627d4e, 0xe348e4ad, 0xc74be3a2, 0xa7617a41, 0xf3f40468, 0x93de9d8b, 0x34643231, 0x544eabd2, 0x00dbd5fb, 0x60f14c18, 0x44f24b17, 0x24d8d2f4, 0x704dacdd, 0x1067353e, 0xa26ec513, 0xc2445cf0, 0x96d122d9, 0xf6fbbb3a, +0xd2f8bc35, 0xb2d225d6, 0xe6475bff, 0x866dc21c, 0x21d76da6, 0x41fdf445, 0x15688a6c, 0x7542138f, 0x51411480, 0x316b8d63, 0x65fef34a, 0x05d46aa9, 0x468473df, 0x26aeea3c, 0x723b9415, 0x12110df6, 0x36120af9, 0x5638931a, 0x02aded33, 0x628774d0, +0xc53ddb6a, 0xa5174289, 0xf1823ca0, 0x91a8a543, 0xb5aba24c, 0xd5813baf, 0x81144586, 0xe13edc65, 0x2e66fa26, 0x4e4c63c5, 0x1ad91dec, 0x7af3840f, 0x5ef08300, 0x3eda1ae3, 0x6a4f64ca, 0x0a65fd29, 0xaddf5293, 0xcdf5cb70, 0x9960b559, 0xf94a2cba, +0xdd492bb5, 0xbd63b256, 0xe9f6cc7f, 0x89dc559c, 0xca8c4cea, 0xaaa6d509, 0xfe33ab20, 0x9e1932c3, 0xba1a35cc, 0xda30ac2f, 0x8ea5d206, 0xee8f4be5, 0x4935e45f, 0x291f7dbc, 0x7d8a0395, 0x1da09a76, 0x39a39d79, 0x5989049a, 0x0d1c7ab3, 0x6d36e350, +0x00000000, 0x4e8d26d6, 0x53c07506, 0x1d4d53d0, 0x7704e9cf, 0x3989cf19, 0x24c49cc9, 0x6a49ba1f, 0x194941d8, 0x57c4670e, 0x4a8934de, 0x04041208, 0x6e4da817, 0x20c08ec1, 0x3d8ddd11, 0x7300fbc7, 0x2f6133c5, 0x61ec1513, 0x7ca146c3, 0x322c6015, +0x5865da0a, 0x16e8fcdc, 0x0ba5af0c, 0x452889da, 0x3628721d, 0x78a554cb, 0x65e8071b, 0x2b6521cd, 0x412c9bd2, 0x0fa1bd04, 0x12eceed4, 0x5c61c802, 0x809db7cb, 0xce10911d, 0xd35dc2cd, 0x9dd0e41b, 0xf7995e04, 0xb91478d2, 0xa4592b02, 0xead40dd4, +0x99d4f613, 0xd759d0c5, 0xca148315, 0x8499a5c3, 0xeed01fdc, 0xa05d390a, 0xbd106ada, 0xf39d4c0c, 0xaffc840e, 0xe171a2d8, 0xfc3cf108, 0xb2b1d7de, 0xd8f86dc1, 0x96754b17, 0x8b3818c7, 0xc5b53e11, 0xb6b5c5d6, 0xf838e300, 0xe575b0d0, 0xabf89606, +0xc1b12c19, 0x8f3c0acf, 0x9271591f, 0xdcfc7fc9, 0x14ac1a77, 0x5a213ca1, 0x476c6f71, 0x09e149a7, 0x63a8f3b8, 0x2d25d56e, 0x306886be, 0x7ee5a068, 0x0de55baf, 0x43687d79, 0x5e252ea9, 0x10a8087f, 0x7ae1b260, 0x346c94b6, 0x2921c766, 0x67ace1b0, +0x3bcd29b2, 0x75400f64, 0x680d5cb4, 0x26807a62, 0x4cc9c07d, 0x0244e6ab, 0x1f09b57b, 0x518493ad, 0x2284686a, 0x6c094ebc, 0x71441d6c, 0x3fc93bba, 0x558081a5, 0x1b0da773, 0x0640f4a3, 0x48cdd275, 0x9431adbc, 0xdabc8b6a, 0xc7f1d8ba, 0x897cfe6c, +0xe3354473, 0xadb862a5, 0xb0f53175, 0xfe7817a3, 0x8d78ec64, 0xc3f5cab2, 0xdeb89962, 0x9035bfb4, 0xfa7c05ab, 0xb4f1237d, 0xa9bc70ad, 0xe731567b, 0xbb509e79, 0xf5ddb8af, 0xe890eb7f, 0xa61dcda9, 0xcc5477b6, 0x82d95160, 0x9f9402b0, 0xd1192466, +0xa219dfa1, 0xec94f977, 0xf1d9aaa7, 0xbf548c71, 0xd51d366e, 0x9b9010b8, 0x86dd4368, 0xc85065be, 0x8489e6d3, 0xca04c005, 0xd74993d5, 0x99c4b503, 0xf38d0f1c, 0xbd0029ca, 0xa04d7a1a, 0xeec05ccc, 0x9dc0a70b, 0xd34d81dd, 0xce00d20d, 0x808df4db, +0xeac44ec4, 0xa4496812, 0xb9043bc2, 0xf7891d14, 0xabe8d516, 0xe565f3c0, 0xf828a010, 0xb6a586c6, 0xdcec3cd9, 0x92611a0f, 0x8f2c49df, 0xc1a16f09, 0xb2a194ce, 0xfc2cb218, 0xe161e1c8, 0xafecc71e, 0xc5a57d01, 0x8b285bd7, 0x96650807, 0xd8e82ed1, +0x04145118, 0x4a9977ce, 0x57d4241e, 0x195902c8, 0x7310b8d7, 0x3d9d9e01, 0x20d0cdd1, 0x6e5deb07, 0x1d5d10c0, 0x53d03616, 0x4e9d65c6, 0x00104310, 0x6a59f90f, 0x24d4dfd9, 0x39998c09, 0x7714aadf, 0x2b7562dd, 0x65f8440b, 0x78b517db, 0x3638310d, +0x5c718b12, 0x12fcadc4, 0x0fb1fe14, 0x413cd8c2, 0x323c2305, 0x7cb105d3, 0x61fc5603, 0x2f7170d5, 0x4538caca, 0x0bb5ec1c, 0x16f8bfcc, 0x5875991a, 0x9025fca4, 0xdea8da72, 0xc3e589a2, 0x8d68af74, 0xe721156b, 0xa9ac33bd, 0xb4e1606d, 0xfa6c46bb, +0x896cbd7c, 0xc7e19baa, 0xdaacc87a, 0x9421eeac, 0xfe6854b3, 0xb0e57265, 0xada821b5, 0xe3250763, 0xbf44cf61, 0xf1c9e9b7, 0xec84ba67, 0xa2099cb1, 0xc84026ae, 0x86cd0078, 0x9b8053a8, 0xd50d757e, 0xa60d8eb9, 0xe880a86f, 0xf5cdfbbf, 0xbb40dd69, +0xd1096776, 0x9f8441a0, 0x82c91270, 0xcc4434a6, 0x10b84b6f, 0x5e356db9, 0x43783e69, 0x0df518bf, 0x67bca2a0, 0x29318476, 0x347cd7a6, 0x7af1f170, 0x09f10ab7, 0x477c2c61, 0x5a317fb1, 0x14bc5967, 0x7ef5e378, 0x3078c5ae, 0x2d35967e, 0x63b8b0a8, +0x3fd978aa, 0x71545e7c, 0x6c190dac, 0x22942b7a, 0x48dd9165, 0x0650b7b3, 0x1b1de463, 0x5590c2b5, 0x26903972, 0x681d1fa4, 0x75504c74, 0x3bdd6aa2, 0x5194d0bd, 0x1f19f66b, 0x0254a5bb, 0x4cd9836d, 0x00000000, 0x23cdc131, 0x438be78f, 0x604626be, +0x9b79e2cf, 0xb8b423fe, 0xd8f20540, 0xfb3fc471, 0xcab76d3e, 0xe97aac0f, 0x893c8ab1, 0xaaf14b80, 0x51ce8ff1, 0x72034ec0, 0x1245687e, 0x3188a94f, 0x48fc7dee, 0x6b31bcdf, 0x0b779a61, 0x28ba5b50, 0xd3859f21, 0xf0485e10, 0x900e78ae, 0xb3c3b99f, +0x824b10d0, 0xa186d1e1, 0xc1c0f75f, 0xe20d366e, 0x1932f21f, 0x3aff332e, 0x5ab91590, 0x7974d4a1, 0x51f7e5e9, 0x723a24d8, 0x127c0266, 0x31b1c357, 0xca8e0726, 0xe943c617, 0x8905e0a9, 0xaac82198, 0x9b4088d7, 0xb88d49e6, 0xd8cb6f58, 0xfb06ae69, +0x00396a18, 0x23f4ab29, 0x43b28d97, 0x607f4ca6, 0x190b9807, 0x3ac65936, 0x5a807f88, 0x794dbeb9, 0x82727ac8, 0xa1bfbbf9, 0xc1f99d47, 0xe2345c76, 0xd3bcf539, 0xf0713408, 0x903712b6, 0xb3fad387, 0x48c517f6, 0x6b08d6c7, 0x0b4ef079, 0x28833148, +0x01e5c1d3, 0x222800e2, 0x426e265c, 0x61a3e76d, 0x9a9c231c, 0xb951e22d, 0xd917c493, 0xfada05a2, 0xcb52aced, 0xe89f6ddc, 0x88d94b62, 0xab148a53, 0x502b4e22, 0x73e68f13, 0x13a0a9ad, 0x306d689c, 0x4919bc3d, 0x6ad47d0c, 0x0a925bb2, 0x295f9a83, +0xd2605ef2, 0xf1ad9fc3, 0x91ebb97d, 0xb226784c, 0x83aed103, 0xa0631032, 0xc025368c, 0xe3e8f7bd, 0x18d733cc, 0x3b1af2fd, 0x5b5cd443, 0x78911572, 0x5012243a, 0x73dfe50b, 0x1399c3b5, 0x30540284, 0xcb6bc6f5, 0xe8a607c4, 0x88e0217a, 0xab2de04b, +0x9aa54904, 0xb9688835, 0xd92eae8b, 0xfae36fba, 0x01dcabcb, 0x22116afa, 0x42574c44, 0x619a8d75, 0x18ee59d4, 0x3b2398e5, 0x5b65be5b, 0x78a87f6a, 0x8397bb1b, 0xa05a7a2a, 0xc01c5c94, 0xe3d19da5, 0xd25934ea, 0xf194f5db, 0x91d2d365, 0xb21f1254, +0x4920d625, 0x6aed1714, 0x0aab31aa, 0x2966f09b, 0x5249d6ce, 0x718417ff, 0x11c23141, 0x320ff070, 0xc9303401, 0xeafdf530, 0x8abbd38e, 0xa97612bf, 0x98febbf0, 0xbb337ac1, 0xdb755c7f, 0xf8b89d4e, 0x0387593f, 0x204a980e, 0x400cbeb0, 0x63c17f81, +0x1ab5ab20, 0x39786a11, 0x593e4caf, 0x7af38d9e, 0x81cc49ef, 0xa20188de, 0xc247ae60, 0xe18a6f51, 0xd002c61e, 0xf3cf072f, 0x93892191, 0xb044e0a0, 0x4b7b24d1, 0x68b6e5e0, 0x08f0c35e, 0x2b3d026f, 0x03be3327, 0x2073f216, 0x4035d4a8, 0x63f81599, +0x98c7d1e8, 0xbb0a10d9, 0xdb4c3667, 0xf881f756, 0xc9095e19, 0xeac49f28, 0x8a82b996, 0xa94f78a7, 0x5270bcd6, 0x71bd7de7, 0x11fb5b59, 0x32369a68, 0x4b424ec9, 0x688f8ff8, 0x08c9a946, 0x2b046877, 0xd03bac06, 0xf3f66d37, 0x93b04b89, 0xb07d8ab8, +0x81f523f7, 0xa238e2c6, 0xc27ec478, 0xe1b30549, 0x1a8cc138, 0x39410009, 0x590726b7, 0x7acae786, 0x53ac171d, 0x7061d62c, 0x1027f092, 0x33ea31a3, 0xc8d5f5d2, 0xeb1834e3, 0x8b5e125d, 0xa893d36c, 0x991b7a23, 0xbad6bb12, 0xda909dac, 0xf95d5c9d, +0x026298ec, 0x21af59dd, 0x41e97f63, 0x6224be52, 0x1b506af3, 0x389dabc2, 0x58db8d7c, 0x7b164c4d, 0x8029883c, 0xa3e4490d, 0xc3a26fb3, 0xe06fae82, 0xd1e707cd, 0xf22ac6fc, 0x926ce042, 0xb1a12173, 0x4a9ee502, 0x69532433, 0x0915028d, 0x2ad8c3bc, +0x025bf2f4, 0x219633c5, 0x41d0157b, 0x621dd44a, 0x9922103b, 0xbaefd10a, 0xdaa9f7b4, 0xf9643685, 0xc8ec9fca, 0xeb215efb, 0x8b677845, 0xa8aab974, 0x53957d05, 0x7058bc34, 0x101e9a8a, 0x33d35bbb, 0x4aa78f1a, 0x696a4e2b, 0x092c6895, 0x2ae1a9a4, +0xd1de6dd5, 0xf213ace4, 0x92558a5a, 0xb1984b6b, 0x8010e224, 0xa3dd2315, 0xc39b05ab, 0xe056c49a, 0x1b6900eb, 0x38a4c1da, 0x58e2e764, 0x7b2f2655, 0x00000000, 0x56ddbe26, 0x63b1ac19, 0x356c123f, 0xa3f2dc97, 0xf52f62b1, 0xc043708e, 0x969ecea8, +0x0e473b35, 0x589a8513, 0x6df6972c, 0x3b2b290a, 0xadb5e7a2, 0xfb685984, 0xce044bbb, 0x98d9f59d, 0x053a93d2, 0x53e72df4, 0x668b3fcb, 0x305681ed, 0xa6c84f45, 0xf015f163, 0xc579e35c, 0x93a45d7a, 0x0b7da8e7, 0x5da016c1, 0x68cc04fe, 0x3e11bad8, +0xa88f7470, 0xfe52ca56, 0xcb3ed869, 0x9de3664f, 0x43d4184f, 0x1509a669, 0x2065b456, 0x76b80a70, 0xe026c4d8, 0xb6fb7afe, 0x839768c1, 0xd54ad6e7, 0x4d93237a, 0x1b4e9d5c, 0x2e228f63, 0x78ff3145, 0xee61ffed, 0xb8bc41cb, 0x8dd053f4, 0xdb0dedd2, +0x46ee8b9d, 0x103335bb, 0x255f2784, 0x738299a2, 0xe51c570a, 0xb3c1e92c, 0x86adfb13, 0xd0704535, 0x48a9b0a8, 0x1e740e8e, 0x2b181cb1, 0x7dc5a297, 0xeb5b6c3f, 0xbd86d219, 0x88eac026, 0xde377e00, 0xa296883c, 0xf44b361a, 0xc1272425, 0x97fa9a03, +0x016454ab, 0x57b9ea8d, 0x62d5f8b2, 0x34084694, 0xacd1b309, 0xfa0c0d2f, 0xcf601f10, 0x99bda136, 0x0f236f9e, 0x59fed1b8, 0x6c92c387, 0x3a4f7da1, 0xa7ac1bee, 0xf171a5c8, 0xc41db7f7, 0x92c009d1, 0x045ec779, 0x5283795f, 0x67ef6b60, 0x3132d546, +0xa9eb20db, 0xff369efd, 0xca5a8cc2, 0x9c8732e4, 0x0a19fc4c, 0x5cc4426a, 0x69a85055, 0x3f75ee73, 0xe1429073, 0xb79f2e55, 0x82f33c6a, 0xd42e824c, 0x42b04ce4, 0x146df2c2, 0x2101e0fd, 0x77dc5edb, 0xef05ab46, 0xb9d81560, 0x8cb4075f, 0xda69b979, +0x4cf777d1, 0x1a2ac9f7, 0x2f46dbc8, 0x799b65ee, 0xe47803a1, 0xb2a5bd87, 0x87c9afb8, 0xd114119e, 0x478adf36, 0x11576110, 0x243b732f, 0x72e6cd09, 0xea3f3894, 0xbce286b2, 0x898e948d, 0xdf532aab, 0x49cde403, 0x1f105a25, 0x2a7c481a, 0x7ca1f63c, +0x052e17eb, 0x53f3a9cd, 0x669fbbf2, 0x304205d4, 0xa6dccb7c, 0xf001755a, 0xc56d6765, 0x93b0d943, 0x0b692cde, 0x5db492f8, 0x68d880c7, 0x3e053ee1, 0xa89bf049, 0xfe464e6f, 0xcb2a5c50, 0x9df7e276, 0x00148439, 0x56c93a1f, 0x63a52820, 0x35789606, +0xa3e658ae, 0xf53be688, 0xc057f4b7, 0x968a4a91, 0x0e53bf0c, 0x588e012a, 0x6de21315, 0x3b3fad33, 0xada1639b, 0xfb7cddbd, 0xce10cf82, 0x98cd71a4, 0x46fa0fa4, 0x1027b182, 0x254ba3bd, 0x73961d9b, 0xe508d333, 0xb3d56d15, 0x86b97f2a, 0xd064c10c, +0x48bd3491, 0x1e608ab7, 0x2b0c9888, 0x7dd126ae, 0xeb4fe806, 0xbd925620, 0x88fe441f, 0xde23fa39, 0x43c09c76, 0x151d2250, 0x2071306f, 0x76ac8e49, 0xe03240e1, 0xb6effec7, 0x8383ecf8, 0xd55e52de, 0x4d87a743, 0x1b5a1965, 0x2e360b5a, 0x78ebb57c, +0xee757bd4, 0xb8a8c5f2, 0x8dc4d7cd, 0xdb1969eb, 0xa7b89fd7, 0xf16521f1, 0xc40933ce, 0x92d48de8, 0x044a4340, 0x5297fd66, 0x67fbef59, 0x3126517f, 0xa9ffa4e2, 0xff221ac4, 0xca4e08fb, 0x9c93b6dd, 0x0a0d7875, 0x5cd0c653, 0x69bcd46c, 0x3f616a4a, +0xa2820c05, 0xf45fb223, 0xc133a01c, 0x97ee1e3a, 0x0170d092, 0x57ad6eb4, 0x62c17c8b, 0x341cc2ad, 0xacc53730, 0xfa188916, 0xcf749b29, 0x99a9250f, 0x0f37eba7, 0x59ea5581, 0x6c8647be, 0x3a5bf998, 0xe46c8798, 0xb2b139be, 0x87dd2b81, 0xd10095a7, +0x479e5b0f, 0x1143e529, 0x242ff716, 0x72f24930, 0xea2bbcad, 0xbcf6028b, 0x899a10b4, 0xdf47ae92, 0x49d9603a, 0x1f04de1c, 0x2a68cc23, 0x7cb57205, 0xe156144a, 0xb78baa6c, 0x82e7b853, 0xd43a0675, 0x42a4c8dd, 0x147976fb, 0x211564c4, 0x77c8dae2, +0xef112f7f, 0xb9cc9159, 0x8ca08366, 0xda7d3d40, 0x4ce3f3e8, 0x1a3e4dce, 0x2f525ff1, 0x798fe1d7, 0x00000000, 0x3fd6ba5b, 0xdd117d9c, 0xe2c7c7c7, 0x96be37c7, 0xa9688d9c, 0x4baf4a5b, 0x7479f000, 0x7ff12a4c, 0x40279017, 0xa2e057d0, 0x9d36ed8b, +0xe94f1d8b, 0xd699a7d0, 0x345e6017, 0x0b88da4c, 0x96235e1a, 0xa9f5e441, 0x4b322386, 0x74e499dd, 0x009d69dd, 0x3f4bd386, 0xdd8c1441, 0xe25aae1a, 0xe9d27456, 0xd604ce0d, 0x34c309ca, 0x0b15b391, 0x7f6c4391, 0x40baf9ca, 0xa27d3e0d, 0x9dab8456, +0xea8a4ff5, 0xd55cf5ae, 0x379b3269, 0x084d8832, 0x7c347832, 0x43e2c269, 0xa12505ae, 0x9ef3bff5, 0x957b65b9, 0xaaaddfe2, 0x486a1825, 0x77bca27e, 0x03c5527e, 0x3c13e825, 0xded42fe2, 0xe10295b9, 0x7ca911ef, 0x437fabb4, 0xa1b86c73, 0x9e6ed628, +0xea172628, 0xd5c19c73, 0x37065bb4, 0x08d0e1ef, 0x03583ba3, 0x3c8e81f8, 0xde49463f, 0xe19ffc64, 0x95e60c64, 0xaa30b63f, 0x48f771f8, 0x7721cba3, 0x74483f6b, 0x4b9e8530, 0xa95942f7, 0x968ff8ac, 0xe2f608ac, 0xdd20b2f7, 0x3fe77530, 0x0031cf6b, +0x0bb91527, 0x346faf7c, 0xd6a868bb, 0xe97ed2e0, 0x9d0722e0, 0xa2d198bb, 0x40165f7c, 0x7fc0e527, 0xe26b6171, 0xddbddb2a, 0x3f7a1ced, 0x00aca6b6, 0x74d556b6, 0x4b03eced, 0xa9c42b2a, 0x96129171, 0x9d9a4b3d, 0xa24cf166, 0x408b36a1, 0x7f5d8cfa, +0x0b247cfa, 0x34f2c6a1, 0xd6350166, 0xe9e3bb3d, 0x9ec2709e, 0xa114cac5, 0x43d30d02, 0x7c05b759, 0x087c4759, 0x37aafd02, 0xd56d3ac5, 0xeabb809e, 0xe1335ad2, 0xdee5e089, 0x3c22274e, 0x03f49d15, 0x778d6d15, 0x485bd74e, 0xaa9c1089, 0x954aaad2, +0x08e12e84, 0x373794df, 0xd5f05318, 0xea26e943, 0x9e5f1943, 0xa189a318, 0x434e64df, 0x7c98de84, 0x771004c8, 0x48c6be93, 0xaa017954, 0x95d7c30f, 0xe1ae330f, 0xde788954, 0x3cbf4e93, 0x0369f4c8, 0x368c64fe, 0x095adea5, 0xeb9d1962, 0xd44ba339, +0xa0325339, 0x9fe4e962, 0x7d232ea5, 0x42f594fe, 0x497d4eb2, 0x76abf4e9, 0x946c332e, 0xabba8975, 0xdfc37975, 0xe015c32e, 0x02d204e9, 0x3d04beb2, 0xa0af3ae4, 0x9f7980bf, 0x7dbe4778, 0x4268fd23, 0x36110d23, 0x09c7b778, 0xeb0070bf, 0xd4d6cae4, +0xdf5e10a8, 0xe088aaf3, 0x024f6d34, 0x3d99d76f, 0x49e0276f, 0x76369d34, 0x94f15af3, 0xab27e0a8, 0xdc062b0b, 0xe3d09150, 0x01175697, 0x3ec1eccc, 0x4ab81ccc, 0x756ea697, 0x97a96150, 0xa87fdb0b, 0xa3f70147, 0x9c21bb1c, 0x7ee67cdb, 0x4130c680, +0x35493680, 0x0a9f8cdb, 0xe8584b1c, 0xd78ef147, 0x4a257511, 0x75f3cf4a, 0x9734088d, 0xa8e2b2d6, 0xdc9b42d6, 0xe34df88d, 0x018a3f4a, 0x3e5c8511, 0x35d45f5d, 0x0a02e506, 0xe8c522c1, 0xd713989a, 0xa36a689a, 0x9cbcd2c1, 0x7e7b1506, 0x41adaf5d, +0x42c45b95, 0x7d12e1ce, 0x9fd52609, 0xa0039c52, 0xd47a6c52, 0xebacd609, 0x096b11ce, 0x36bdab95, 0x3d3571d9, 0x02e3cb82, 0xe0240c45, 0xdff2b61e, 0xab8b461e, 0x945dfc45, 0x769a3b82, 0x494c81d9, 0xd4e7058f, 0xeb31bfd4, 0x09f67813, 0x3620c248, +0x42593248, 0x7d8f8813, 0x9f484fd4, 0xa09ef58f, 0xab162fc3, 0x94c09598, 0x7607525f, 0x49d1e804, 0x3da81804, 0x027ea25f, 0xe0b96598, 0xdf6fdfc3, 0xa84e1460, 0x9798ae3b, 0x755f69fc, 0x4a89d3a7, 0x3ef023a7, 0x012699fc, 0xe3e15e3b, 0xdc37e460, +0xd7bf3e2c, 0xe8698477, 0x0aae43b0, 0x3578f9eb, 0x410109eb, 0x7ed7b3b0, 0x9c107477, 0xa3c6ce2c, 0x3e6d4a7a, 0x01bbf021, 0xe37c37e6, 0xdcaa8dbd, 0xa8d37dbd, 0x9705c7e6, 0x75c20021, 0x4a14ba7a, 0x419c6036, 0x7e4ada6d, 0x9c8d1daa, 0xa35ba7f1, +0xd72257f1, 0xe8f4edaa, 0x0a332a6d, 0x35e59036, 0x00000000, 0x242ee1c4, 0xd9514301, 0xfd7fa2c5, 0xce9624c3, 0xeab8c507, 0x17c767c2, 0x33e98606, 0x9e064d8f, 0xba28ac4b, 0x47570e8e, 0x6379ef4a, 0x5090694c, 0x74be8888, 0x89c12a4d, 0xadefcb89, +0x0e10972a, 0x2a3e76ee, 0xd741d42b, 0xf36f35ef, 0xc086b3e9, 0xe4a8522d, 0x19d7f0e8, 0x3df9112c, 0x9016daa5, 0xb4383b61, 0x494799a4, 0x6d697860, 0x5e80fe66, 0x7aae1fa2, 0x87d1bd67, 0xa3ff5ca3, 0xdab81301, 0xfe96f2c5, 0x03e95000, 0x27c7b1c4, +0x142e37c2, 0x3000d606, 0xcd7f74c3, 0xe9519507, 0x44be5e8e, 0x6090bf4a, 0x9def1d8f, 0xb9c1fc4b, 0x8a287a4d, 0xae069b89, 0x5379394c, 0x7757d888, 0xd4a8842b, 0xf08665ef, 0x0df9c72a, 0x29d726ee, 0x1a3ea0e8, 0x3e10412c, 0xc36fe3e9, 0xe741022d, +0x4aaec9a4, 0x6e802860, 0x93ff8aa5, 0xb7d16b61, 0x8438ed67, 0xa0160ca3, 0x5d69ae66, 0x79474fa2, 0x184df7e9, 0x3c63162d, 0xc11cb4e8, 0xe532552c, 0xd6dbd32a, 0xf2f532ee, 0x0f8a902b, 0x2ba471ef, 0x864bba66, 0xa2655ba2, 0x5f1af967, 0x7b3418a3, +0x48dd9ea5, 0x6cf37f61, 0x918cdda4, 0xb5a23c60, 0x165d60c3, 0x32738107, 0xcf0c23c2, 0xeb22c206, 0xd8cb4400, 0xfce5a5c4, 0x019a0701, 0x25b4e6c5, 0x885b2d4c, 0xac75cc88, 0x510a6e4d, 0x75248f89, 0x46cd098f, 0x62e3e84b, 0x9f9c4a8e, 0xbbb2ab4a, +0xc2f5e4e8, 0xe6db052c, 0x1ba4a7e9, 0x3f8a462d, 0x0c63c02b, 0x284d21ef, 0xd532832a, 0xf11c62ee, 0x5cf3a967, 0x78dd48a3, 0x85a2ea66, 0xa18c0ba2, 0x92658da4, 0xb64b6c60, 0x4b34cea5, 0x6f1a2f61, 0xcce573c2, 0xe8cb9206, 0x15b430c3, 0x319ad107, +0x02735701, 0x265db6c5, 0xdb221400, 0xff0cf5c4, 0x52e33e4d, 0x76cddf89, 0x8bb27d4c, 0xaf9c9c88, 0x9c751a8e, 0xb85bfb4a, 0x4524598f, 0x610ab84b, 0x1b0de93d, 0x3f2308f9, 0xc25caa3c, 0xe6724bf8, 0xd59bcdfe, 0xf1b52c3a, 0x0cca8eff, 0x28e46f3b, +0x850ba4b2, 0xa1254576, 0x5c5ae7b3, 0x78740677, 0x4b9d8071, 0x6fb361b5, 0x92ccc370, 0xb6e222b4, 0x151d7e17, 0x31339fd3, 0xcc4c3d16, 0xe862dcd2, 0xdb8b5ad4, 0xffa5bb10, 0x02da19d5, 0x26f4f811, 0x8b1b3398, 0xaf35d25c, 0x524a7099, 0x7664915d, +0x458d175b, 0x61a3f69f, 0x9cdc545a, 0xb8f2b59e, 0xc1b5fa3c, 0xe59b1bf8, 0x18e4b93d, 0x3cca58f9, 0x0f23deff, 0x2b0d3f3b, 0xd6729dfe, 0xf25c7c3a, 0x5fb3b7b3, 0x7b9d5677, 0x86e2f4b2, 0xa2cc1576, 0x91259370, 0xb50b72b4, 0x4874d071, 0x6c5a31b5, +0xcfa56d16, 0xeb8b8cd2, 0x16f42e17, 0x32dacfd3, 0x013349d5, 0x251da811, 0xd8620ad4, 0xfc4ceb10, 0x51a32099, 0x758dc15d, 0x88f26398, 0xacdc825c, 0x9f35045a, 0xbb1be59e, 0x4664475b, 0x624aa69f, 0x03401ed4, 0x276eff10, 0xda115dd5, 0xfe3fbc11, +0xcdd63a17, 0xe9f8dbd3, 0x14877916, 0x30a998d2, 0x9d46535b, 0xb968b29f, 0x4417105a, 0x6039f19e, 0x53d07798, 0x77fe965c, 0x8a813499, 0xaeafd55d, 0x0d5089fe, 0x297e683a, 0xd401caff, 0xf02f2b3b, 0xc3c6ad3d, 0xe7e84cf9, 0x1a97ee3c, 0x3eb90ff8, +0x9356c471, 0xb77825b5, 0x4a078770, 0x6e2966b4, 0x5dc0e0b2, 0x79ee0176, 0x8491a3b3, 0xa0bf4277, 0xd9f80dd5, 0xfdd6ec11, 0x00a94ed4, 0x2487af10, 0x176e2916, 0x3340c8d2, 0xce3f6a17, 0xea118bd3, 0x47fe405a, 0x63d0a19e, 0x9eaf035b, 0xba81e29f, +0x89686499, 0xad46855d, 0x50392798, 0x7417c65c, 0xd7e89aff, 0xf3c67b3b, 0x0eb9d9fe, 0x2a97383a, 0x197ebe3c, 0x3d505ff8, 0xc02ffd3d, 0xe4011cf9, 0x49eed770, 0x6dc036b4, 0x90bf9471, 0xb49175b5, 0x8778f3b3, 0xa3561277, 0x5e29b0b2, 0x7a075176, +0x00000000, 0xe2d55776, 0xa0d781a3, 0x4202d6d5, 0x7d0480f4, 0x9fd1d782, 0xddd30157, 0x3f065621, 0xc68dedab, 0x2458badd, 0x665a6c08, 0x848f3b7e, 0xbb896d5f, 0x595c3a29, 0x1b5eecfc, 0xf98bbb8a, 0x4c798fe6, 0xaeacd890, 0xecae0e45, 0x0e7b5933, +0x317d0f12, 0xd3a85864, 0x91aa8eb1, 0x737fd9c7, 0x8af4624d, 0x6821353b, 0x2a23e3ee, 0xc8f6b498, 0xf7f0e2b9, 0x1525b5cf, 0x5727631a, 0xb5f2346c, 0x7d2b0f89, 0x9ffe58ff, 0xddfc8e2a, 0x3f29d95c, 0x002f8f7d, 0xe2fad80b, 0xa0f80ede, 0x422d59a8, +0xbba6e222, 0x5973b554, 0x1b716381, 0xf9a434f7, 0xc6a262d6, 0x247735a0, 0x6675e375, 0x84a0b403, 0x3152806f, 0xd387d719, 0x918501cc, 0x735056ba, 0x4c56009b, 0xae8357ed, 0xec818138, 0x0e54d64e, 0xf7df6dc4, 0x150a3ab2, 0x5708ec67, 0xb5ddbb11, +0x8adbed30, 0x680eba46, 0x2a0c6c93, 0xc8d93be5, 0xebc96144, 0x091c3632, 0x4b1ee0e7, 0xa9cbb791, 0x96cde1b0, 0x7418b6c6, 0x361a6013, 0xd4cf3765, 0x2d448cef, 0xcf91db99, 0x8d930d4c, 0x6f465a3a, 0x50400c1b, 0xb2955b6d, 0xf0978db8, 0x1242dace, +0xa7b0eea2, 0x4565b9d4, 0x07676f01, 0xe5b23877, 0xdab46e56, 0x38613920, 0x7a63eff5, 0x98b6b883, 0x613d0309, 0x83e8547f, 0xc1ea82aa, 0x233fd5dc, 0x1c3983fd, 0xfeecd48b, 0xbcee025e, 0x5e3b5528, 0x96e26ecd, 0x743739bb, 0x3635ef6e, 0xd4e0b818, +0xebe6ee39, 0x0933b94f, 0x4b316f9a, 0xa9e438ec, 0x506f8366, 0xb2bad410, 0xf0b802c5, 0x126d55b3, 0x2d6b0392, 0xcfbe54e4, 0x8dbc8231, 0x6f69d547, 0xda9be12b, 0x384eb65d, 0x7a4c6088, 0x989937fe, 0xa79f61df, 0x454a36a9, 0x0748e07c, 0xe59db70a, +0x1c160c80, 0xfec35bf6, 0xbcc18d23, 0x5e14da55, 0x61128c74, 0x83c7db02, 0xc1c50dd7, 0x23105aa1, 0xca6dcf80, 0x28b898f6, 0x6aba4e23, 0x886f1955, 0xb7694f74, 0x55bc1802, 0x17beced7, 0xf56b99a1, 0x0ce0222b, 0xee35755d, 0xac37a388, 0x4ee2f4fe, +0x71e4a2df, 0x9331f5a9, 0xd133237c, 0x33e6740a, 0x86144066, 0x64c11710, 0x26c3c1c5, 0xc41696b3, 0xfb10c092, 0x19c597e4, 0x5bc74131, 0xb9121647, 0x4099adcd, 0xa24cfabb, 0xe04e2c6e, 0x029b7b18, 0x3d9d2d39, 0xdf487a4f, 0x9d4aac9a, 0x7f9ffbec, +0xb746c009, 0x5593977f, 0x179141aa, 0xf54416dc, 0xca4240fd, 0x2897178b, 0x6a95c15e, 0x88409628, 0x71cb2da2, 0x931e7ad4, 0xd11cac01, 0x33c9fb77, 0x0ccfad56, 0xee1afa20, 0xac182cf5, 0x4ecd7b83, 0xfb3f4fef, 0x19ea1899, 0x5be8ce4c, 0xb93d993a, +0x863bcf1b, 0x64ee986d, 0x26ec4eb8, 0xc43919ce, 0x3db2a244, 0xdf67f532, 0x9d6523e7, 0x7fb07491, 0x40b622b0, 0xa26375c6, 0xe061a313, 0x02b4f465, 0x21a4aec4, 0xc371f9b2, 0x81732f67, 0x63a67811, 0x5ca02e30, 0xbe757946, 0xfc77af93, 0x1ea2f8e5, +0xe729436f, 0x05fc1419, 0x47fec2cc, 0xa52b95ba, 0x9a2dc39b, 0x78f894ed, 0x3afa4238, 0xd82f154e, 0x6ddd2122, 0x8f087654, 0xcd0aa081, 0x2fdff7f7, 0x10d9a1d6, 0xf20cf6a0, 0xb00e2075, 0x52db7703, 0xab50cc89, 0x49859bff, 0x0b874d2a, 0xe9521a5c, +0xd6544c7d, 0x34811b0b, 0x7683cdde, 0x94569aa8, 0x5c8fa14d, 0xbe5af63b, 0xfc5820ee, 0x1e8d7798, 0x218b21b9, 0xc35e76cf, 0x815ca01a, 0x6389f76c, 0x9a024ce6, 0x78d71b90, 0x3ad5cd45, 0xd8009a33, 0xe706cc12, 0x05d39b64, 0x47d14db1, 0xa5041ac7, +0x10f62eab, 0xf22379dd, 0xb021af08, 0x52f4f87e, 0x6df2ae5f, 0x8f27f929, 0xcd252ffc, 0x2ff0788a, 0xd67bc300, 0x34ae9476, 0x76ac42a3, 0x947915d5, 0xab7f43f4, 0x49aa1482, 0x0ba8c257, 0xe97d9521, ] + +d0x6a088498=[ 0x90, 0xaf, 0x09, 0xa8, 0x7f, 0xd4, 0x93, 0x5e, 0xf9, 0x7d, 0x25, 0x4e, 0xed, 0xaa, 0x52, 0xe2, 0xa0, 0x73, 0x60, 0x0e, 0x62, 0x86, 0x46, 0xfc, 0xd1, 0x5b, 0x33, 0x39, 0xc9, 0xfe, 0xe8, 0x02, 0xc0, 0xbc, 0x36, 0x49, 0x14, 0xb6, 0x03, 0xd5, +0xe9, 0x0c, 0x69, 0x6c, 0x3f, 0x28, 0xb9, 0x7c, 0x04, 0x07, 0x8f, 0x37, 0x9a, 0xbd, 0x80, 0x44, 0xd3, 0xa7, 0x84, 0x23, 0xd6, 0x34, 0x31, 0x59, 0x51, 0x6f, 0xca, 0xba, 0x21, 0x56, 0x06, 0x47, 0xf4, 0x2f, 0xeb, 0xa2, 0xc6, 0xc1, 0x96, 0x19, +0xb7, 0x22, 0x8b, 0xdd, 0x38, 0xe1, 0x4a, 0xa3, 0x98, 0x83, 0xb8, 0x50, 0x58, 0x35, 0x40, 0x42, 0x7e, 0xe5, 0x77, 0x3c, 0x1d, 0x16, 0x0b, 0x29, 0x1a, 0x3b, 0x15, 0xef, 0x99, 0x1b, 0x64, 0xd8, 0xb3, 0x24, 0xf7, 0x41, 0x3d, 0xcf, 0xe0, 0x89, +0xea, 0x1c, 0x48, 0x11, 0xbb, 0x32, 0x2c, 0xc2, 0x94, 0x8a, 0x13, 0xec, 0x1f, 0x17, 0xa1, 0xa5, 0x9b, 0x0a, 0xd7, 0x9f, 0x78, 0xd2, 0xbe, 0x79, 0xce, 0xff, 0xb2, 0x71, 0x70, 0x4b, 0x82, 0x30, 0x3e, 0x92, 0xac, 0x9c, 0xbf, 0xe7, 0xf5, 0xcc, +0xa9, 0x18, 0x3a, 0x08, 0x67, 0xfd, 0x55, 0x05, 0x6a, 0x4c, 0x61, 0x87, 0x8e, 0x1e, 0x8d, 0x4d, 0xd9, 0x8c, 0xfa, 0x68, 0x6e, 0x2e, 0x54, 0x10, 0x7b, 0xdb, 0x57, 0xdf, 0xf1, 0xad, 0x74, 0xf2, 0x97, 0xe6, 0xcd, 0xab, 0x00, 0x76, 0x88, 0x5c, +0x72, 0x20, 0xfb, 0x65, 0x43, 0x27, 0xa6, 0x5f, 0xa4, 0x6d, 0x75, 0x2a, 0x2d, 0xdc, 0x85, 0xc7, 0x9d, 0x63, 0xe3, 0x5a, 0xc5, 0x5d, 0xf0, 0xc3, 0xd0, 0x4f, 0x2b, 0xf6, 0xb1, 0xc8, 0x45, 0x0f, 0x95, 0xda, 0x81, 0x01, 0xb0, 0xf3, 0x9e, 0xc4, +0x66, 0xae, 0x12, 0x0d, 0x7a, 0xb4, 0xf8, 0x6b, 0x53, 0xe4, 0xb5, 0x91, 0xde, 0xcb, 0x26, 0xee, 0xad, 0xf7, 0x5e, 0xcf, 0x8c, 0x84, 0xce, 0x13, 0xe3, 0x2a, 0xc6, 0x82, 0xfc, 0x74, 0x02, 0x9a, 0xf2, 0xe4, 0x30, 0x83, 0x50, 0xdc, 0xaf, 0x7e, +0x6d, 0x61, 0x18, 0xb0, 0xeb, 0xe2, 0x41, 0xe7, 0x19, 0x9b, 0x92, 0xf9, 0x59, 0x94, 0x05, 0x9e, 0xf4, 0xa2, 0x23, 0x04, 0x31, 0x45, 0xa3, 0xa1, 0x12, 0x2e, 0x08, 0xd2, 0xa5, 0x91, 0xea, 0x1e, 0x4a, 0x53, 0x1b, 0xe0, 0x01, 0x73, 0x4b, 0x4d, +0x2b, 0xc9, 0x62, 0x8a, 0x2c, 0xc5, 0xf3, 0xf0, 0xcd, 0x6c, 0xba, 0xb1, 0x8f, 0xae, 0xd4, 0x64, 0xd3, 0x56, 0x39, 0xf6, 0xec, 0xed, 0x4f, 0x93, 0x58, 0x70, 0x8b, 0x34, 0x68, 0x44, 0x89, 0x57, 0xe9, 0x6f, 0x95, 0x6b, 0xd8, 0x29, 0x4c, 0xde, +0xab, 0xb5, 0x6e, 0x24, 0xc0, 0x40, 0x97, 0x3d, 0xca, 0x86, 0x38, 0xd9, 0x52, 0xfb, 0xb2, 0x55, 0xe1, 0x77, 0xb8, 0xef, 0xa0, 0x66, 0x47, 0x1c, 0xa8, 0x1d, 0xc4, 0xfe, 0x43, 0xda, 0x67, 0xb7, 0x3b, 0xd7, 0xbe, 0xac, 0x88, 0x33, 0x46, 0x65, +0x20, 0x72, 0x9d, 0x5d, 0x26, 0x14, 0xe6, 0x90, 0x2f, 0xbc, 0x03, 0x32, 0xff, 0xa7, 0x4e, 0x6a, 0x98, 0x5a, 0xfd, 0x7a, 0x16, 0x0c, 0x27, 0xc8, 0xd0, 0x5b, 0xd1, 0x3a, 0xfa, 0x09, 0xc3, 0x7d, 0xdf, 0x96, 0x99, 0x8e, 0x00, 0x7c, 0x76, 0x37, +0xf5, 0x07, 0xdd, 0xb3, 0xe5, 0x0f, 0x7b, 0x8d, 0x0a, 0xa4, 0x28, 0xd5, 0x3c, 0x42, 0x06, 0x69, 0x17, 0x22, 0x36, 0xdb, 0xd6, 0x21, 0x1a, 0x15, 0x3f, 0x35, 0x87, 0x0e, 0xe8, 0x7f, 0xcb, 0x71, 0x63, 0xc1, 0x81, 0xf1, 0xc7, 0x48, 0xb4, 0x51, +0xf8, 0x79, 0xbf, 0x9f, 0x3e, 0x10, 0xee, 0x0d, 0x0b, 0x1f, 0xaa, 0x85, 0x75, 0x5c, 0x78, 0x60, 0xbd, 0x11, 0xa6, 0xc2, 0xa9, 0xb6, 0xbb, 0x80, 0xcc, 0x9c, 0x25, 0x54, 0x49, 0x2d, 0xb9, 0x5f, 0x77, 0xd8, 0x43, 0xb7, 0x01, 0x51, 0x30, 0x4f, +0xaa, 0xa8, 0x46, 0xff, 0xef, 0x62, 0x74, 0xf5, 0xb3, 0x33, 0x4c, 0xf0, 0xbc, 0x21, 0xc6, 0x41, 0xd3, 0x87, 0x65, 0xcc, 0x3d, 0x53, 0x92, 0x20, 0x59, 0xdf, 0xb9, 0x1e, 0x1a, 0x06, 0x1f, 0xa1, 0xdb, 0xbb, 0x23, 0xb5, 0xd2, 0x93, 0x6b, 0x0d, +0xd0, 0xba, 0xa4, 0x5f, 0x9d, 0x82, 0xa7, 0xce, 0x1b, 0x70, 0x49, 0x8e, 0xf2, 0x2a, 0xf4, 0xdd, 0x0f, 0x9b, 0xe6, 0xda, 0xa2, 0x44, 0x8d, 0x48, 0xd5, 0x83, 0x85, 0xc7, 0x57, 0x72, 0x8b, 0x68, 0xa0, 0xea, 0xc2, 0x89, 0xe2, 0x56, 0x95, 0x8f, +0xe3, 0xed, 0x60, 0x81, 0x75, 0x9f, 0x35, 0x05, 0xb0, 0x22, 0xf3, 0x37, 0x5b, 0x3a, 0x8c, 0x07, 0x3c, 0x17, 0x0b, 0x50, 0x4b, 0x02, 0x80, 0x79, 0x8a, 0x6a, 0xa6, 0xd4, 0x13, 0x2b, 0x28, 0x71, 0xc1, 0x0c, 0x40, 0xbf, 0x5c, 0x29, 0xec, 0xc3, +0x03, 0x11, 0x4e, 0x34, 0x64, 0x3b, 0xd6, 0x3f, 0xcd, 0xc8, 0xac, 0x6c, 0x45, 0x69, 0x67, 0x00, 0x2f, 0x16, 0x27, 0x2d, 0x10, 0xb6, 0xfb, 0x9e, 0xc4, 0xf1, 0x36, 0xfa, 0xc5, 0xe7, 0x14, 0xc9, 0x7f, 0xe1, 0x76, 0xf9, 0xaf, 0x1c, 0xb8, 0xfe, +0x26, 0x58, 0xe4, 0x97, 0xe5, 0x5d, 0x7d, 0x39, 0xfc, 0x2c, 0x94, 0xe9, 0x19, 0x1d, 0x84, 0x25, 0x47, 0xa9, 0xbe, 0x9a, 0x54, 0xd1, 0x31, 0x09, 0xf6, 0x4d, 0x63, 0x73, 0x98, 0xab, 0xe0, 0x08, 0x7b, 0xad, 0xca, 0xf8, 0x0e, 0xb1, 0x38, 0x9c, +0x7e, 0xbd, 0xd7, 0x6d, 0x5e, 0x52, 0x2e, 0x04, 0x5a, 0x55, 0x6f, 0xae, 0x7c, 0x86, 0xee, 0xb4, 0xb2, 0x66, 0x32, 0x42, 0x15, 0x99, 0xe8, 0xa5, 0xf7, 0x0a, 0xfd, 0x61, 0xcb, 0xa3, 0x90, 0x18, 0x7a, 0xcf, 0x24, 0xdc, 0xd9, 0x91, 0x6e, 0xde, +0x88, 0x3e, 0x78, 0xeb, 0x96, 0x4a, 0x12, 0xc0, 0x2d, 0x4d, 0xb1, 0x34, 0x5d, 0x61, 0x9e, 0xb4, 0xe4, 0x5b, 0xf1, 0xff, 0x3b, 0x7d, 0xce, 0x35, 0xf9, 0x5f, 0xef, 0x40, 0x15, 0xc7, 0x1d, 0x46, 0x77, 0x97, 0xf7, 0x7b, 0xb3, 0x1a, 0x25, 0x42, +0xb0, 0xf0, 0xd0, 0x7a, 0x09, 0x91, 0xb5, 0xcc, 0x68, 0x99, 0x57, 0x14, 0xc6, 0x9a, 0xfb, 0xf3, 0x21, 0xa3, 0xca, 0x13, 0x7f, 0xd4, 0x89, 0x6b, 0xc8, 0x8f, 0x72, 0x55, 0x08, 0x03, 0xf5, 0x98, 0x0f, 0xc1, 0x84, 0xe0, 0x71, 0x29, 0x9b, 0x01, +0xc3, 0xf8, 0x54, 0xc4, 0x96, 0x83, 0x38, 0x4e, 0xaa, 0xbd, 0xb7, 0x53, 0xdc, 0xab, 0x58, 0xd1, 0x2c, 0x2b, 0x0e, 0xfc, 0x4c, 0xee, 0x0a, 0x3d, 0xe1, 0x94, 0x52, 0xaf, 0x75, 0xf2, 0xa8, 0xd2, 0x95, 0xa0, 0x3f, 0xb2, 0x70, 0x88, 0x27, 0xac, +0x93, 0x28, 0x63, 0xd7, 0xfe, 0x8d, 0x30, 0x19, 0xbe, 0xa2, 0x8e, 0x5e, 0x05, 0xe6, 0x64, 0xa5, 0x33, 0xcf, 0xed, 0xa1, 0x10, 0x06, 0x1b, 0xb8, 0x79, 0x2e, 0x12, 0x41, 0xde, 0x0b, 0x2a, 0x82, 0xd5, 0xd3, 0xc5, 0x78, 0x5a, 0x6c, 0xec, 0x32, +0x49, 0x07, 0x7e, 0x4a, 0x9c, 0x9d, 0x39, 0x67, 0x1f, 0xdb, 0x31, 0x81, 0x02, 0x00, 0xae, 0x8c, 0x0c, 0xe5, 0x9f, 0x23, 0x3e, 0x56, 0x85, 0x48, 0x66, 0x3c, 0xc9, 0x8b, 0x24, 0x20, 0xe3, 0x65, 0xfd, 0x3a, 0x62, 0x26, 0x92, 0xd8, 0x59, 0x6a, +0xe9, 0x80, 0x36, 0xb9, 0xbb, 0x51, 0xf4, 0x22, 0x1c, 0xa6, 0x18, 0xdd, 0x37, 0xd9, 0x50, 0x11, 0x47, 0x87, 0xa4, 0x16, 0xba, 0x6e, 0x6d, 0xbf, 0xd6, 0x2f, 0xe7, 0x74, 0x8a, 0xda, 0xa9, 0x90, 0x6f, 0x17, 0x7c, 0x5c, 0xfa, 0xc0, 0x1e, 0xeb, +0xdf, 0xcb, 0x86, 0x76, 0xcd, 0x43, 0xe8, 0x04, 0x45, 0xb6, 0x69, 0x44, 0xea, 0x4f, 0x4b, 0xbc, 0x60, 0x73, 0xe2, 0x0d, 0xc2, 0xad, 0xf6, 0xa7, 0x30, 0x49, 0xc8, 0x63, 0x6d, 0x4e, 0x2e, 0x80, 0xb0, 0x4a, 0x1c, 0x54, 0x8f, 0x04, 0xfd, 0x1e, +0x70, 0xc2, 0x69, 0x00, 0x78, 0xcb, 0x67, 0x4b, 0xd7, 0x5d, 0xd3, 0x64, 0x3b, 0x0f, 0x16, 0x41, 0x6f, 0xa5, 0x9c, 0x91, 0xf1, 0xd6, 0x77, 0x86, 0x33, 0x87, 0xad, 0xd8, 0x0b, 0x83, 0x36, 0xde, 0x1f, 0x7a, 0x52, 0x6a, 0x9a, 0xdb, 0x2b, 0x7b, +0x9d, 0x3e, 0x6c, 0x5a, 0x12, 0x40, 0x99, 0x7c, 0x14, 0xd0, 0xba, 0xf8, 0x81, 0x8e, 0x09, 0xbc, 0xd5, 0x75, 0x2c, 0x37, 0x56, 0x42, 0x08, 0xe7, 0xa6, 0xd1, 0xc6, 0x5c, 0xb2, 0x7d, 0x28, 0x21, 0x5b, 0xc5, 0x92, 0x97, 0xaa, 0x03, 0xd4, 0x2f, +0x22, 0xbe, 0xfa, 0xea, 0xb6, 0xfc, 0xf9, 0x34, 0x01, 0xa4, 0x59, 0xac, 0x31, 0x10, 0xb4, 0x25, 0xb9, 0x72, 0xb8, 0x85, 0x53, 0x68, 0xc0, 0x32, 0x73, 0x13, 0x8c, 0x23, 0x4f, 0x45, 0xcc, 0xe8, 0x94, 0x57, 0x26, 0x90, 0xf5, 0xae, 0xc3, 0xff, +0x1a, 0x2d, 0xf7, 0xe2, 0xe5, 0xcd, 0x38, 0xe9, 0x93, 0x0c, 0x02, 0x3d, 0x5e, 0x7e, 0x51, 0xa2, 0x60, 0xdc, 0x6e, 0xa9, 0xeb, 0x95, 0xfe, 0xec, 0x29, 0x27, 0x5f, 0xbf, 0xf2, 0x82, 0x4d, 0x7f, 0xa8, 0xca, 0x8d, 0xe1, 0x05, 0x61, 0x50, 0x47, +0xa1, 0xf0, 0x18, 0x96, 0xed, 0xee, 0x3a, 0xf3, 0x79, 0xb5, 0xa7, 0xda, 0x1d, 0x9b, 0xdd, 0xdf, 0x48, 0x76, 0x39, 0x88, 0x17, 0x11, 0xe3, 0xaf, 0xd9, 0x20, 0xa3, 0x66, 0x15, 0x19, 0x55, 0x89, 0xf4, 0x4c, 0xc7, 0x98, 0xc1, 0x46, 0xd2, 0xfb, +0xef, 0xb3, 0x35, 0x58, 0x06, 0x9f, 0xe0, 0x0d, 0xb7, 0x62, 0x74, 0x2a, 0x8a, 0xbb, 0xe6, 0x71, 0x84, 0xc9, 0x6b, 0xcf, 0x0e, 0xe4, 0x44, 0x24, 0x1b, 0x07, 0xb1, 0x3c, 0x43, 0x9e, 0xc4, 0x65, 0xab, 0xf6, 0xce, 0x8b, 0xbd, 0x3f, 0x0a, 0xa0, +0xc1, 0x87, 0x22, 0x5b, 0x5d, 0xfa, 0xce, 0xac, 0xf3, 0x9a, 0x06, 0xf6, 0x9e, 0xe3, 0x50, 0x76, 0x63, 0xf7, 0x08, 0x37, 0xa8, 0x9b, 0x84, 0xb2, 0xf8, 0x3b, 0x7c, 0xab, 0x3d, 0x89, 0x00, 0x07, 0xe9, 0x01, 0x66, 0x81, 0xd8, 0xe4, 0x5f, 0x57, +0x19, 0x03, 0x1e, 0x4c, 0xe2, 0x58, 0xb3, 0x93, 0xb0, 0x36, 0xbc, 0xbd, 0x6d, 0xde, 0xff, 0x64, 0xbe, 0x6e, 0xdc, 0xcb, 0x51, 0x4e, 0x04, 0xaa, 0x69, 0x9d, 0x11, 0x80, 0x7b, 0x92, 0xe1, 0xad, 0x75, 0x7f, 0xa5, 0x8b, 0x52, 0xd5, 0x02, 0x74, +0x97, 0x1b, 0x8c, 0x0e, 0x46, 0xd4, 0xeb, 0x24, 0xd9, 0x43, 0x31, 0x5e, 0x98, 0x2d, 0xea, 0x96, 0x91, 0x55, 0xa6, 0xf5, 0x26, 0x6b, 0x35, 0x7a, 0xe0, 0x18, 0x0a, 0x90, 0xee, 0xb7, 0x13, 0x56, 0x95, 0xca, 0x4a, 0xe7, 0xdd, 0x72, 0x42, 0x05, +0x34, 0xa9, 0xa2, 0x9c, 0x65, 0x5c, 0xb8, 0x1d, 0x59, 0x94, 0x1f, 0x09, 0x6a, 0xb6, 0xd6, 0x28, 0xae, 0x53, 0x70, 0x4b, 0x79, 0x30, 0xfb, 0x62, 0xd1, 0x0c, 0x12, 0xc8, 0x41, 0xe8, 0x20, 0xc2, 0x8a, 0x0b, 0xbb, 0x2c, 0xa1, 0x61, 0x8f, 0x60, +0x6c, 0x38, 0x2e, 0x8e, 0xc4, 0xe6, 0x16, 0xc3, 0xda, 0xdf, 0x2b, 0x48, 0xb4, 0x39, 0x1c, 0xd2, 0x15, 0xc7, 0xcd, 0xa0, 0xc5, 0x3a, 0xc0, 0xfd, 0x40, 0xb9, 0x82, 0xaf, 0xdb, 0x47, 0x3e, 0xed, 0xc9, 0x33, 0xcf, 0x10, 0x8d, 0x83, 0x6f, 0x2f, +0x1a, 0x3f, 0x14, 0xa3, 0xf1, 0x27, 0x99, 0x17, 0x88, 0x4f, 0xf9, 0x44, 0xfe, 0xc6, 0x67, 0xf2, 0xd7, 0xa4, 0xb1, 0x86, 0x23, 0x45, 0xef, 0x25, 0xf4, 0x71, 0xfc, 0x0d, 0xa7, 0xcc, 0xf0, 0x21, 0x73, 0x32, 0x77, 0x4d, 0x2a, 0x54, 0x85, 0x29, +0x7e, 0x9f, 0xd0, 0xd3, 0xbf, 0xe5, 0x49, 0x7d, 0x68, 0x5a, 0x78, 0xba, 0xec, 0x0f, 0xb5, 0x3c, 0x31, 0x77, 0x44, 0xa5, 0x25, 0x17, 0x79, 0x10, 0x81, 0x78, 0x5d, 0x57, 0xb3, 0x47, 0xe1, 0x33, 0x1d, 0xd1, 0xb5, 0x3e, 0x27, 0x97, 0xa8, 0x11, +0x69, 0x22, 0x0a, 0x4e, 0x8f, 0xa6, 0x28, 0x38, 0xc2, 0x82, 0x08, 0x93, 0xd4, 0x7a, 0x8b, 0x05, 0xf4, 0x51, 0xf2, 0x6b, 0x74, 0x8a, 0x24, 0x63, 0x02, 0x88, 0xe3, 0x87, 0x55, 0xfd, 0x29, 0x34, 0x4f, 0x5e, 0x8e, 0x50, 0x92, 0x60, 0x4b, 0xfa, +0xf8, 0xf9, 0x9e, 0x41, 0xa4, 0x13, 0x09, 0x1e, 0xff, 0xc4, 0xbb, 0x85, 0xc7, 0x6a, 0x30, 0x26, 0xb7, 0x94, 0xb4, 0xe5, 0xf7, 0x2e, 0x42, 0x5c, 0xee, 0x9a, 0x99, 0xda, 0x84, 0x71, 0x64, 0x89, 0x2c, 0x76, 0xbc, 0x1b, 0xe2, 0x9f, 0xc8, 0x2b, +0xa7, 0x20, 0x59, 0xc5, 0xc6, 0x39, 0xdc, 0x35, 0x7d, 0x0d, 0x7f, 0xcd, 0x68, 0x0f, 0x7c, 0x0e, 0x90, 0x06, 0x95, 0xbf, 0x0c, 0xc9, 0x6e, 0x4a, 0x83, 0xd0, 0x14, 0xce, 0x48, 0xdf, 0xfb, 0x61, 0x5b, 0x6c, 0xf0, 0xa2, 0x9c, 0x7b, 0x80, 0x3d, +0xfe, 0xa3, 0x01, 0x15, 0x21, 0xb9, 0xf6, 0x72, 0xed, 0xb8, 0x7e, 0x75, 0xe9, 0x1a, 0x37, 0x3a, 0xf5, 0xd7, 0x1f, 0x8d, 0x96, 0x23, 0xc1, 0x4c, 0x62, 0xd6, 0x98, 0xe6, 0xb6, 0xdd, 0xf3, 0xc0, 0xf1, 0x6f, 0xb2, 0x58, 0xfc, 0x43, 0x86, 0xec, +0xb0, 0x9b, 0x1c, 0xba, 0x49, 0x19, 0xbd, 0x0b, 0xde, 0x52, 0x32, 0x66, 0xef, 0xea, 0x5f, 0xac, 0x04, 0x45, 0xdb, 0x18, 0xe7, 0x73, 0xbe, 0x3b, 0xaf, 0xa0, 0xcf, 0xd3, 0x03, 0x07, 0x16, 0x40, 0x2a, 0xaa, 0x54, 0x3c, 0x91, 0xe4, 0x00, 0x12, +0x53, 0xb1, 0xd2, 0x9d, 0xad, 0xe8, 0x36, 0xd9, 0xeb, 0xcb, 0x8c, 0x46, 0x4d, 0xd8, 0xa9, 0xa1, 0x67, 0x56, 0x5a, 0x2d, 0xae, 0xe0, 0x6d, 0xab, 0xcc, 0xd5, 0x3f, 0xc3, 0x65, 0x70, 0x2f, 0xca, 0xfa, 0x32, 0x6f, 0xfc, 0x80, 0x20, 0xa4, 0x22, +0x34, 0x2a, 0x85, 0x81, 0xba, 0xe8, 0xd1, 0x28, 0xec, 0x1e, 0x8a, 0x3c, 0x35, 0xd7, 0x14, 0xb3, 0x13, 0xb8, 0xab, 0x0a, 0xd4, 0xd3, 0x78, 0x31, 0x40, 0x92, 0x3b, 0xdc, 0x4f, 0x53, 0x93, 0xb0, 0xbe, 0x6e, 0x83, 0xe0, 0x90, 0xcb, 0xbf, 0x74, +0x5a, 0x86, 0x71, 0x47, 0x7b, 0xc5, 0xe2, 0xf1, 0x9a, 0xe7, 0x06, 0xe9, 0x08, 0x23, 0x11, 0xcf, 0x5c, 0x72, 0xac, 0xdf, 0x3a, 0x33, 0xc1, 0x21, 0xef, 0x30, 0xb1, 0x3d, 0x65, 0x68, 0xb5, 0x9c, 0xe6, 0x43, 0xa0, 0xde, 0x39, 0x77, 0x2d, 0x5f, +0xc6, 0xf2, 0xda, 0x97, 0xa3, 0x54, 0xa2, 0x7a, 0xbb, 0xff, 0x62, 0x37, 0x7e, 0xa6, 0xf9, 0x4e, 0x0f, 0xdb, 0x95, 0xe4, 0xad, 0x6a, 0x1d, 0x8c, 0x45, 0xfd, 0x91, 0xb6, 0x09, 0x50, 0x8b, 0x02, 0x27, 0x57, 0xe3, 0x94, 0x98, 0xf3, 0xc0, 0x87, +0xc3, 0xb7, 0x3e, 0x56, 0xd6, 0x41, 0x75, 0x1c, 0xcd, 0x16, 0x96, 0x19, 0x1b, 0x24, 0x36, 0xfb, 0xd8, 0x84, 0xce, 0x46, 0x38, 0xf6, 0x4d, 0x52, 0x12, 0x76, 0xe1, 0x7f, 0xaf, 0xa7, 0x7d, 0x82, 0x2f, 0xd2, 0x6b, 0xbc, 0x5e, 0xa5, 0x69, 0x05, +0x51, 0x17, 0x10, 0xca, 0x5b, 0x2e, 0x18, 0xf5, 0x9d, 0x01, 0x3f, 0x1f, 0x0b, 0x61, 0xcc, 0x64, 0xa9, 0x1a, 0x58, 0x8d, 0x66, 0x49, 0x88, 0xf0, 0x55, 0xf8, 0xc7, 0x42, 0x9f, 0xc2, 0x15, 0x9e, 0x29, 0xeb, 0x59, 0xa1, 0x48, 0x60, 0x07, 0x67, +0x99, 0xd5, 0xe5, 0xdd, 0x63, 0x8f, 0x2b, 0x4a, 0x70, 0xfe, 0xb9, 0x0c, 0x25, 0xd9, 0x7c, 0xea, 0x03, 0xed, 0xbd, 0x4b, 0x6c, 0xa8, 0x0e, 0x0d, 0x44, 0xf4, 0xf7, 0x73, 0x6d, 0x2c, 0xee, 0xd0, 0x5d, 0x79, 0x9b, 0x8e, 0xb4, 0x26, 0xc9, 0x89, +0x04, 0x4c, 0xaa, 0x00, 0xae, 0xc8, 0xc4, 0xb2, 0xc7, 0xd0, 0x11, 0xf2, 0x09, 0x5a, 0x2c, 0x0e, 0x7a, 0x27, 0x28, 0xb6, 0x85, 0x9b, 0xa5, 0xd7, 0x9f, 0x55, 0x02, 0xc1, 0x53, 0xad, 0x6a, 0x9e, 0xb9, 0x4b, 0x56, 0x7f, 0x1a, 0xe6, 0x8d, 0xe5, +0x32, 0x12, 0x9c, 0xdd, 0xfd, 0xba, 0xea, 0x38, 0x92, 0x23, 0xe1, 0xf1, 0x15, 0x0c, 0x73, 0xf3, 0x7d, 0xca, 0x46, 0x3b, 0xcd, 0x17, 0x54, 0xc6, 0xd8, 0xcc, 0x81, 0x6b, 0x2e, 0xf7, 0xd6, 0xb1, 0x0b, 0x44, 0xbf, 0xeb, 0x0d, 0xa3, 0xce, 0xfc, +0x8c, 0x24, 0x4e, 0xfe, 0x83, 0xf4, 0x0a, 0x16, 0xe9, 0xff, 0xec, 0x05, 0x82, 0xb5, 0x0f, 0xbb, 0x34, 0x61, 0x42, 0x69, 0xbd, 0x50, 0x93, 0xb7, 0xb3, 0x1e, 0x1f, 0xe0, 0x7b, 0x29, 0x41, 0x3f, 0xac, 0xa7, 0xc5, 0x63, 0xa8, 0x5d, 0xd5, 0x10, +0x68, 0x8a, 0x07, 0x8b, 0xdc, 0x52, 0xa0, 0xc9, 0xed, 0xf0, 0x71, 0xc8, 0x8f, 0xbe, 0x76, 0x79, 0x14, 0xa6, 0x6d, 0x3c, 0x9a, 0x25, 0xf8, 0x60, 0xfa, 0x4f, 0x91, 0x06, 0xc2, 0x65, 0x47, 0x98, 0xcb, 0xd9, 0xf6, 0x13, 0xfb, 0xb0, 0x96, 0x87, +0xa1, 0x58, 0x2d, 0x88, 0xe2, 0x67, 0x70, 0x78, 0x48, 0x3d, 0xa9, 0xbc, 0xd3, 0x97, 0x89, 0x57, 0x84, 0x8e, 0xb2, 0x2b, 0x3e, 0xaa, 0x01, 0x94, 0xa4, 0xd4, 0x4d, 0x6e, 0x5f, 0x35, 0xab, 0x2f, 0x18, 0x95, 0xb8, 0x22, 0xf5, 0xaf, 0x20, 0x21, +0xcf, 0x99, 0x72, 0xb4, 0xc4, 0x08, 0x51, 0xdb, 0xe8, 0xae, 0x5b, 0x1b, 0x86, 0x75, 0x00, 0xef, 0x4c, 0x66, 0x03, 0x40, 0x90, 0xc0, 0xc3, 0x30, 0x6f, 0x04, 0xa2, 0x45, 0x80, 0x1c, 0x5c, 0x62, 0xdf, 0x49, 0x37, 0x43, 0xd2, 0x64, 0xee, 0xe3, +0x19, 0x2a, 0x59, 0xe4, 0xf9, 0x7e, 0x26, 0x1d, 0xde, 0xda, 0x77, 0x39, 0xe7, 0x6c, 0x3a, 0x5e, 0x7c, 0x9d, 0xd1, 0x4a, 0x33, 0x36, 0x74, 0x31, 0x32, 0xda, 0xdf, 0xa4, 0xb5, 0x7c, 0x4c, 0x69, 0x43, 0xaf, 0xd9, 0x1d, 0x1a, 0xe7, 0x15, 0x49, +0xcb, 0xf5, 0x11, 0x87, 0xc6, 0x58, 0xc2, 0x18, 0x79, 0x1e, 0x3a, 0x2d, 0x21, 0x9c, 0xd5, 0x85, 0x99, 0xc0, 0x97, 0x9e, 0xf1, 0x39, 0x38, 0xe4, 0x93, 0x30, 0x1b, 0xa1, 0xbf, 0xb1, 0x89, 0xd1, 0xb3, 0x28, 0xc9, 0x05, 0x4d, 0xcd, 0xe1, 0x2b, +0xb4, 0x9d, 0xab, 0xec, 0x61, 0x8e, 0x72, 0x76, 0xfe, 0x50, 0xb2, 0x0b, 0x47, 0x55, 0xff, 0x6a, 0xe2, 0xa6, 0xf9, 0x5c, 0xb9, 0x5b, 0x10, 0x0c, 0x73, 0x3e, 0x9f, 0xee, 0x91, 0x5a, 0xc8, 0x81, 0x6b, 0xfb, 0xb8, 0x84, 0x56, 0x80, 0xed, 0xba, +0x7a, 0xd7, 0xb6, 0x92, 0xcf, 0xa5, 0xd8, 0x4f, 0x57, 0xe5, 0x16, 0x17, 0x6e, 0x59, 0x63, 0xc5, 0x7e, 0x64, 0xea, 0x75, 0x2f, 0x37, 0x24, 0xde, 0x00, 0xaa, 0xb0, 0x48, 0xf6, 0x3b, 0x29, 0x51, 0x6d, 0x0f, 0xce, 0xa0, 0xe6, 0x83, 0x0e, 0xa2, +0x8c, 0x62, 0x8f, 0xc3, 0xf3, 0x3d, 0x13, 0xe8, 0xd3, 0x66, 0x23, 0xa7, 0x96, 0x7b, 0xf8, 0x07, 0x06, 0x0d, 0xf0, 0x44, 0x70, 0x2a, 0x03, 0x52, 0xc1, 0xef, 0x74, 0xcc, 0xe3, 0x5d, 0x94, 0x34, 0xe9, 0xeb, 0x2c, 0xdc, 0x35, 0xc4, 0xac, 0xd6, +0x1c, 0x88, 0x8a, 0x6f, 0x02, 0x1f, 0x45, 0x77, 0x36, 0x41, 0x14, 0x98, 0x95, 0x6c, 0x53, 0x8d, 0x7d, 0xbe, 0xb7, 0xae, 0x82, 0x08, 0xd2, 0x33, 0x04, 0x4a, 0x60, 0xa3, 0xad, 0x7f, 0xd0, 0x22, 0x9b, 0x0a, 0x86, 0x5e, 0x90, 0x31, 0xca, 0xa9, +0x09, 0x3c, 0x01, 0x78, 0x65, 0x5f, 0x4e, 0xf2, 0x46, 0xd4, 0xbd, 0xe0, 0x54, 0x20, 0xf4, 0x68, 0x2e, 0xdd, 0x71, 0x42, 0xfa, 0x19, 0xfc, 0x25, 0x9a, 0xbc, 0x67, 0x4b, 0x3f, 0x40, 0xf7, 0x26, 0xbb, 0xdb, 0x8b, 0xfd, 0xc7, 0x12, 0xa8, 0x27, +0x1a, 0xc3, 0x17, 0x4e, 0x48, 0x84, 0x32, 0xe7, 0xd3, 0x36, 0x0b, 0xc6, 0x8b, 0x2d, 0x7e, 0x50, 0x01, 0x62, 0xc8, 0xaf, 0x54, 0x90, 0xe4, 0x6e, 0xd1, 0x9d, 0x87, 0x95, 0xa8, 0xe1, 0x02, 0x09, 0x19, 0x6f, 0xf5, 0x75, 0x45, 0x99, 0x4a, 0xb9, +0xa7, 0x07, 0x2c, 0x9e, 0xe8, 0x10, 0xf0, 0xed, 0x6b, 0x72, 0x28, 0xd5, 0x1d, 0x4d, 0xa5, 0x34, 0xe9, 0xb8, 0x55, 0x18, 0xd8, 0x61, 0x8d, 0x43, 0x14, 0xf2, 0x59, 0x51, 0x70, 0x76, 0x23, 0x5d, 0x9b, 0xd9, 0x44, 0xf3, 0x37, 0xb4, 0x39, 0x7f, +0x1f, 0x9a, 0x15, 0xfe, 0x5f, 0x0d, 0x29, 0x63, 0xd0, 0xad, 0x7c, 0x22, 0x4f, 0x0f, 0x0e, 0x3e, 0xe0, 0x47, 0x65, 0x81, 0x40, 0xce, 0x91, 0x35, 0xb7, 0xf6, 0xfb, 0xda, 0xf4, 0x13, 0x00, 0xbb, 0x80, 0x41, 0x56, 0x89, 0xf1, 0xea, 0x46, 0x2f, +0x9f, 0x93, 0x05, 0x25, 0xa4, 0x06, 0xfd, 0x96, 0xd6, 0x94, 0x33, 0xfa, 0x71, 0xab, 0xe2, 0xd7, 0xee, 0x11, 0x08, 0x98, 0x52, 0xf7, 0xa0, 0xc5, 0x4c, 0x60, 0x20, 0xcf, 0x3c, 0x64, 0x5b, 0xc9, 0xdc, 0xa6, 0xb6, 0x1b, 0x66, 0xf9, 0x38, 0xc1, +0x3f, 0x83, 0xdb, 0xe5, 0xb0, 0xcb, 0x2e, 0xfc, 0xec, 0x82, 0x5e, 0xbc, 0xe6, 0xb1, 0x3d, 0x88, 0xef, 0x73, 0x31, 0x92, 0x2b, 0x6c, 0x27, 0x58, 0x8f, 0x03, 0xd4, 0xcc, 0xc4, 0x53, 0xdd, 0xdf, 0xba, 0x85, 0x67, 0xa2, 0xd2, 0xa1, 0x30, 0x21, +0x97, 0x1e, 0x0c, 0x5a, 0x6d, 0xde, 0xeb, 0xff, 0x16, 0xe3, 0x8a, 0xb2, 0x57, 0x1c, 0x7a, 0x7d, 0xae, 0x68, 0x79, 0xa9, 0xc0, 0x2a, 0x74, 0x77, 0x8e, 0xbf, 0xbd, 0x3b, 0xc7, 0x78, 0xf8, 0x3a, 0x49, 0x0a, 0x24, 0x42, 0xa3, 0xb3, 0x5c, 0x6a, +0x12, 0x26, 0xc2, 0xcd, 0xaa, 0xb5, 0x04, 0x9c, 0x69, 0xbe, 0x86, 0xac, 0x4b, 0x8c, 0xca, 0x7b, 0xd1, 0x50, 0x2d, 0xa2, 0x51, 0x29, 0xa6, 0x75, 0x6b, 0x59, 0xc1, 0x4a, 0xd7, 0xc2, 0xa0, 0x6a, 0xcc, 0x5a, 0x65, 0x8c, 0x96, 0xc5, 0x1b, 0x9f, +0x9b, 0x13, 0xa8, 0x94, 0x61, 0x18, 0xdb, 0xb7, 0xed, 0x02, 0x76, 0x47, 0xd8, 0xc8, 0xfe, 0x07, 0xfb, 0x72, 0xc6, 0xde, 0x37, 0x48, 0xae, 0xdd, 0x8d, 0x8b, 0x35, 0xa4, 0x97, 0xda, 0xb3, 0xf1, 0x67, 0x6c, 0x15, 0xf2, 0xd3, 0x74, 0xb2, 0xd5, +0x33, 0x98, 0x62, 0x00, 0xe6, 0x0e, 0xb1, 0xea, 0x85, 0xcb, 0x27, 0x68, 0x5f, 0xab, 0x1c, 0x58, 0xf9, 0xce, 0x04, 0x09, 0x32, 0x42, 0xe0, 0x03, 0x26, 0x0b, 0x4f, 0x87, 0xf8, 0x46, 0x7e, 0xbe, 0x3b, 0x82, 0x69, 0x2f, 0x05, 0x0d, 0x3a, 0x23, +0xf0, 0x54, 0x93, 0x57, 0x86, 0xca, 0x5c, 0x7d, 0xc3, 0xa5, 0xf3, 0x89, 0xb4, 0xec, 0xe2, 0x20, 0x9a, 0x06, 0x88, 0x4d, 0xeb, 0xff, 0x8e, 0x19, 0x44, 0xb5, 0x7a, 0x52, 0x81, 0xc9, 0x10, 0x1e, 0x2b, 0x3d, 0xe9, 0x9d, 0xcd, 0xa7, 0x12, 0x30, +0x1f, 0x7b, 0x71, 0xdf, 0x1a, 0xd9, 0xa3, 0xd6, 0x55, 0xb9, 0x45, 0x39, 0x95, 0x08, 0x99, 0x77, 0x8a, 0xe1, 0x9e, 0x38, 0x2e, 0xf7, 0x70, 0xaf, 0xd0, 0x0c, 0x40, 0x0a, 0x6f, 0x31, 0x64, 0xc4, 0x4c, 0x22, 0x3f, 0xef, 0xe3, 0xe4, 0x66, 0x1d, +0xbf, 0xb0, 0xcf, 0xf6, 0x4b, 0xee, 0x8f, 0x3e, 0x79, 0xa1, 0x36, 0x0f, 0xbb, 0xd4, 0xc7, 0xb6, 0x24, 0x92, 0xf5, 0x41, 0xaa, 0xbd, 0x60, 0x43, 0xa9, 0xfd, 0x21, 0x25, 0x5e, 0x80, 0xe8, 0x16, 0x56, 0xac, 0x3c, 0xdc, 0x5b, 0x7c, 0xe5, 0x34, +0xf4, 0x01, 0x2a, 0x14, 0xfc, 0x49, 0x84, 0x6e, 0xbc, 0x2c, 0x17, 0xc0, 0x83, 0x9c, 0xe7, 0xd2, 0x6d, 0xb8, 0x63, 0x78, 0x73, 0x7f, 0x90, 0x5d, 0xba, 0xfa, 0x53, 0x4e, 0x11, 0x91, 0x28, 0xad, 0xf2, 0x61, 0xb6, 0xc1, 0xa2, 0x5e, 0x42, 0xb9, +0x3e, 0xe2, 0x1f, 0xc0, 0x8d, 0xb3, 0x90, 0x8f, 0x6c, 0xf3, 0xee, 0xb8, 0xc4, 0xd6, 0x79, 0xfa, 0x86, 0xab, 0x14, 0xf7, 0x2a, 0xc3, 0x12, 0x6b, 0xf9, 0x0c, 0x92, 0xa7, 0xce, 0x84, 0x83, 0x5a, 0xdc, 0x49, 0x2d, 0xf0, 0xb0, 0xaa, 0xe3, 0xa6, +0xca, 0x5c, 0x03, 0x6f, 0x8c, 0x44, 0x9d, 0xed, 0x0a, 0x4b, 0xba, 0x74, 0x75, 0x43, 0x15, 0x99, 0x2c, 0x48, 0x51, 0xbf, 0xa1, 0x41, 0xe8, 0x36, 0x04, 0xde, 0xf4, 0xcc, 0xbc, 0xe5, 0x87, 0xd5, 0x47, 0xfe, 0x3c, 0x1d, 0x00, 0x18, 0x31, 0x21, +0x1b, 0x96, 0x6e, 0x54, 0x98, 0x1a, 0x17, 0x24, 0xe1, 0x20, 0xfd, 0x0e, 0xf5, 0x6d, 0x66, 0xda, 0x06, 0xfc, 0x85, 0x7b, 0x97, 0x39, 0x72, 0xef, 0x0b, 0x02, 0x26, 0x0d, 0x4f, 0xd1, 0x58, 0xae, 0x4c, 0xc5, 0xd0, 0x29, 0xcd, 0x8b, 0xd2, 0x9e, +0x64, 0x63, 0xac, 0x2f, 0x94, 0x11, 0xb7, 0x62, 0xe0, 0x2b, 0x25, 0x57, 0xb5, 0x91, 0x80, 0x5b, 0xad, 0x45, 0xa8, 0xe7, 0x6a, 0xa0, 0x70, 0xf1, 0x05, 0xbe, 0xcb, 0x9a, 0xc9, 0x8a, 0xe9, 0xeb, 0x7f, 0xf8, 0x78, 0x88, 0x4a, 0x27, 0xa5, 0xff, +0xdf, 0x5f, 0x1c, 0x07, 0xb4, 0xcf, 0x35, 0x3a, 0x09, 0xa4, 0xbb, 0x08, 0x2e, 0x67, 0x95, 0x22, 0x3d, 0x28, 0xe6, 0x69, 0x93, 0xc8, 0x7e, 0x30, 0x7a, 0x13, 0x4e, 0x38, 0xd8, 0xec, 0x9f, 0x4d, 0x9c, 0xf6, 0x7d, 0x55, 0x46, 0x37, 0x19, 0xaf, +0xa9, 0x32, 0x0f, 0x50, 0x52, 0x77, 0x10, 0x89, 0xd3, 0xc7, 0xfb, 0x81, 0xd9, 0x9b, 0x5d, 0x56, 0xdd, 0xb2, 0xd4, 0x60, 0xe4, 0xc6, 0xb1, 0x40, 0xd7, 0x1e, 0x68, 0x23, 0xbd, 0x71, 0x01, 0xea, 0x76, 0x3b, 0x82, 0x65, 0xa3, 0x34, 0x59, 0x3f, +0xc2, 0x16, 0x8e, 0x7c, 0x73, 0xdb, 0x33, 0x53, 0x0b, 0xd1, 0x81, 0x69, 0x9f, 0x08, 0x14, 0x0e, 0x64, 0x5e, 0x95, 0xa7, 0x40, 0xb1, 0x78, 0xf4, 0x49, 0xd8, 0x28, 0xc9, 0xa1, 0x8f, 0xf9, 0xcb, 0x55, 0x42, 0xd0, 0x2d, 0x8d, 0x8c, 0x18, 0xd5, +0x98, 0xca, 0xa4, 0x25, 0xbd, 0x5a, 0x82, 0x5f, 0xcc, 0x4e, 0x00, 0x85, 0x6d, 0x02, 0x09, 0x48, 0xed, 0x2f, 0xe5, 0xef, 0xdf, 0xdc, 0x4b, 0xbf, 0xe4, 0xf2, 0x3f, 0xb9, 0x8e, 0xb5, 0xbb, 0x6b, 0xeb, 0x76, 0x72, 0xc5, 0x9e, 0xc1, 0x67, 0xb8, +0x75, 0x33, 0x2b, 0x46, 0x9c, 0xf5, 0x3d, 0x10, 0xc2, 0xc7, 0x8b, 0x5c, 0x51, 0x05, 0x7c, 0x43, 0xbe, 0x79, 0xba, 0xe9, 0x11, 0x62, 0xd7, 0x4d, 0x8a, 0x70, 0xc8, 0x65, 0x6a, 0x4f, 0x63, 0x5d, 0x20, 0xd9, 0x2a, 0xda, 0xe0, 0x32, 0x45, 0x3c, +0x88, 0x1c, 0xc6, 0x66, 0x38, 0xfb, 0x6e, 0x0d, 0xaa, 0x52, 0x84, 0xb3, 0x27, 0xe3, 0x1e, 0xa3, 0x2e, 0xdb, 0xa0, 0x74, 0xa9, 0xea, 0x9b, 0x7b, 0xce, 0xa2, 0xe6, 0xad, 0xa6, 0x7d, 0x1a, 0x0a, 0x97, 0x73, 0x41, 0x34, 0xae, 0xf0, 0x6c, 0x04, +0x96, 0xc3, 0x16, 0xb2, 0xcd, 0xc0, 0x31, 0x01, 0xde, 0x07, 0x56, 0x36, 0x77, 0x26, 0xd4, 0x3a, 0xfd, 0x35, 0x94, 0x58, 0x29, 0xe2, 0x87, 0x3e, 0x06, 0xa5, 0x1f, 0x1b, 0x24, 0xb4, 0x4c, 0x50, 0x23, 0x7e, 0xd3, 0xac, 0xa8, 0x2c, 0xb7, 0xd2, +0x68, 0x93, 0x9a, 0x91, 0xfe, 0x71, 0xee, 0x1d, 0xf3, 0xe1, 0x53, 0x22, 0x30, 0xb0, 0x99, 0x90, 0x47, 0x03, 0xfc, 0xab, 0xff, 0xd6, 0x37, 0x6f, 0x0f, 0x61, 0x5b, 0xb6, 0x15, 0x39, 0xf7, 0x83, 0xc4, 0x57, 0x89, 0x9d, 0x7a, 0x21, 0xf8, 0x60, +0x12, 0x44, 0x3b, 0x13, 0xe8, 0xe7, 0x59, 0xaf, 0x92, 0x19, 0xdd, 0x7f, 0x0c, 0xbc, 0x80, 0x86, 0xf6, 0xfa, 0x54, 0x4a, 0x17, 0xf1, 0xcf, 0xec, 0xf3, 0x4e, 0x00, 0x50, 0x86, 0x08, 0x71, 0xc1, 0x2f, 0x69, 0x5d, 0x39, 0x2e, 0x9a, 0x02, 0x09, +0x21, 0x0b, 0xdf, 0xe4, 0x0d, 0x11, 0x9c, 0x7e, 0x7d, 0x33, 0x98, 0xc7, 0xaa, 0x5f, 0x6a, 0x83, 0xf8, 0x97, 0xfa, 0xb8, 0x4d, 0x01, 0xfd, 0x13, 0x74, 0x89, 0x82, 0xde, 0x65, 0xcc, 0x80, 0x64, 0x31, 0x04, 0xb0, 0xc9, 0x9e, 0xc5, 0x2b, 0x2c, +0xb5, 0x42, 0xf9, 0x3e, 0x59, 0x0e, 0x4f, 0x99, 0xb3, 0xad, 0xcb, 0xb6, 0x47, 0xa2, 0xb2, 0x26, 0xbb, 0x3b, 0x1f, 0xd5, 0xe6, 0x96, 0x8c, 0x53, 0x79, 0xeb, 0x46, 0x1b, 0x81, 0x8b, 0x14, 0x05, 0x52, 0xac, 0x84, 0x94, 0x54, 0xc3, 0x3d, 0x57, +0x55, 0x9d, 0x51, 0x8d, 0x32, 0x29, 0x70, 0xf1, 0x56, 0x66, 0xe7, 0x28, 0x76, 0xce, 0xbe, 0x90, 0xda, 0xbc, 0xa7, 0x8f, 0xf5, 0x0f, 0xd0, 0xc8, 0x3a, 0x1c, 0x87, 0xab, 0x58, 0x67, 0x6e, 0x41, 0xe1, 0xca, 0x20, 0x72, 0x24, 0xe8, 0x38, 0xa3, +0x22, 0x3f, 0xe9, 0xdb, 0xc0, 0xcd, 0xd1, 0xba, 0xbf, 0x12, 0x45, 0x61, 0x1e, 0x5b, 0xb9, 0xef, 0x4c, 0x18, 0x4b, 0x7a, 0x9f, 0x03, 0xa8, 0xdc, 0x5e, 0xe0, 0x1d, 0xbd, 0x6c, 0x60, 0x30, 0xe3, 0x88, 0x63, 0x16, 0x49, 0xdd, 0xd4, 0xed, 0xb4, +0x35, 0xf7, 0xff, 0xb7, 0xf2, 0x23, 0x25, 0x5a, 0x2d, 0x37, 0x6b, 0xf4, 0x75, 0xc6, 0x7b, 0xa0, 0xcf, 0x95, 0x44, 0x15, 0xa4, 0xe5, 0x91, 0x6d, 0xe2, 0xea, 0xfb, 0x8e, 0x68, 0x7f, 0x40, 0x27, 0xae, 0x36, 0x3c, 0xb1, 0x78, 0x8a, 0xa5, 0x77, +0x48, 0x0c, 0x73, 0xd6, 0x6f, 0x85, 0x19, 0x4a, 0xd7, 0xee, 0xf0, 0xf6, 0xd3, 0x17, 0xd8, 0x34, 0x92, 0x5c, 0xfc, 0x07, 0xa9, 0xc4, 0xd9, 0x62, 0xec, 0x7c, 0xc2, 0xfe, 0x0a, 0xa1, 0x93, 0x43, 0x06, 0xd2, 0xaf, 0x9b, 0xa6, 0x1a, 0x2a, 0x10, +0x56, 0xe2, 0x8e, 0xd5, 0x64, 0xd7, 0xab, 0x67, 0xd9, 0xba, 0x27, 0xe1, 0xf3, 0xe5, 0x6d, 0x15, 0x41, 0x51, 0x0d, 0xd1, 0x48, 0xb3, 0x89, 0x04, 0xcc, 0xdf, 0x09, 0x08, 0xcb, 0xd2, 0x29, 0xfe, 0xc4, 0xdc, 0xa3, 0x7c, 0x8f, 0x73, 0xaf, 0x95, +0x66, 0x4f, 0xef, 0x40, 0x85, 0x21, 0x39, 0x8c, 0x33, 0x5c, 0x9d, 0xd3, 0xe4, 0x49, 0xcf, 0x24, 0x96, 0xe8, 0xde, 0xbb, 0x3c, 0x32, 0x90, 0x1b, 0x07, 0xa5, 0x86, 0xc1, 0xd4, 0x50, 0x1f, 0x63, 0xc6, 0xb6, 0x42, 0xb8, 0x91, 0x2d, 0x9b, 0xda, +0xc2, 0x6e, 0x9c, 0xc9, 0xe9, 0xa9, 0x14, 0x4c, 0xfd, 0x79, 0x23, 0x61, 0x98, 0xc7, 0xdb, 0xff, 0x35, 0x30, 0xb0, 0x11, 0xfc, 0x31, 0xad, 0x68, 0x4d, 0x4a, 0xdd, 0xd6, 0x60, 0xfb, 0xe6, 0x3d, 0xcd, 0x7f, 0xc0, 0x46, 0x78, 0xf0, 0x99, 0x5a, +0xf6, 0x3e, 0x1e, 0xe0, 0x9e, 0x06, 0x45, 0x8b, 0x34, 0x2b, 0xe7, 0x5e, 0x58, 0x6b, 0xf9, 0x6a, 0x38, 0x03, 0xae, 0xf2, 0x4e, 0xee, 0x0b, 0x3a, 0x75, 0xfa, 0x3f, 0x1d, 0x70, 0x3b, 0xbe, 0xf7, 0x8a, 0x6f, 0x2f, 0x10, 0x2c, 0x87, 0x93, 0x84, +0xb4, 0xa1, 0xf4, 0x05, 0x9a, 0x53, 0xca, 0x7d, 0xbd, 0x8d, 0x88, 0x1a, 0x16, 0x52, 0x20, 0x19, 0x81, 0xbf, 0xf1, 0xd0, 0x01, 0x83, 0x94, 0xe3, 0xce, 0x18, 0xac, 0x1c, 0x43, 0x28, 0x6c, 0x13, 0x7b, 0x26, 0x0a, 0xc5, 0xed, 0xeb, 0xb2, 0x17, +0xc3, 0xb9, 0x97, 0x12, 0xaa, 0xd8, 0x47, 0x62, 0x0c, 0x82, 0xc8, 0x9f, 0xa0, 0x71, 0x02, 0x0f, 0xf8, 0x65, 0xec, 0x7a, 0xa6, 0x2a, 0x74, 0xb5, 0x5f, 0xa2, 0x54, 0x7e, 0x22, 0x76, 0x4b, 0xf5, 0x44, 0xea, 0x37, 0x5b, 0x00, 0x36, 0x57, 0xa4, +0x72, 0x5d, 0xb1, 0x25, 0x69, 0x0e, 0x77, 0xa7, 0xa8, 0xbc, 0x80, 0x55, 0x92, 0x59, 0xb7, 0x2e, ] +d0x6a094170=[ 0x00000000, 0xc66d13cb, 0x9fc92a95, 0x59a4395e, 0xf8bad241, 0x3ed7c18a, 0x6773f8d4, 0xa11eeb1f, 0xfbc5b169, 0x3da8a2a2, 0x640c9bfc, 0xa2618837, 0x037f6328, 0xc51270e3, 0x9cb649bd, 0x5adb5a76, 0x4e331023, 0x885e03e8, 0xd1fa3ab6, 0x1797297d, +0xb689c262, 0x70e4d1a9, 0x2940e8f7, 0xef2dfb3c, 0xb5f6a14a, 0x739bb281, 0x2a3f8bdf, 0xec529814, 0x4d4c730b, 0x8b2160c0, 0xd285599e, 0x14e84a55, 0xf955fa23, 0x3f38e9e8, 0x669cd0b6, 0xa0f1c37d, 0x01ef2862, 0xc7823ba9, 0x9e2602f7, 0x584b113c, +0x02904b4a, 0xc4fd5881, 0x9d5961df, 0x5b347214, 0xfa2a990b, 0x3c478ac0, 0x65e3b39e, 0xa38ea055, 0xb766ea00, 0x710bf9cb, 0x28afc095, 0xeec2d35e, 0x4fdc3841, 0x89b12b8a, 0xd01512d4, 0x1678011f, 0x4ca35b69, 0x8ace48a2, 0xd36a71fc, 0x15076237, +0xb4198928, 0x72749ae3, 0x2bd0a3bd, 0xedbdb076, 0xb47e830d, 0x721390c6, 0x2bb7a998, 0xeddaba53, 0x4cc4514c, 0x8aa94287, 0xd30d7bd9, 0x15606812, 0x4fbb3264, 0x89d621af, 0xd07218f1, 0x161f0b3a, 0xb701e025, 0x716cf3ee, 0x28c8cab0, 0xeea5d97b, +0xfa4d932e, 0x3c2080e5, 0x6584b9bb, 0xa3e9aa70, 0x02f7416f, 0xc49a52a4, 0x9d3e6bfa, 0x5b537831, 0x01882247, 0xc7e5318c, 0x9e4108d2, 0x582c1b19, 0xf932f006, 0x3f5fe3cd, 0x66fbda93, 0xa096c958, 0x4d2b792e, 0x8b466ae5, 0xd2e253bb, 0x148f4070, +0xb591ab6f, 0x73fcb8a4, 0x2a5881fa, 0xec359231, 0xb6eec847, 0x7083db8c, 0x2927e2d2, 0xef4af119, 0x4e541a06, 0x883909cd, 0xd19d3093, 0x17f02358, 0x0318690d, 0xc5757ac6, 0x9cd14398, 0x5abc5053, 0xfba2bb4c, 0x3dcfa887, 0x646b91d9, 0xa2068212, +0xf8ddd864, 0x3eb0cbaf, 0x6714f2f1, 0xa179e13a, 0x00670a25, 0xc60a19ee, 0x9fae20b0, 0x59c3337b, 0x89e3d0aa, 0x4f8ec361, 0x162afa3f, 0xd047e9f4, 0x715902eb, 0xb7341120, 0xee90287e, 0x28fd3bb5, 0x722661c3, 0xb44b7208, 0xedef4b56, 0x2b82589d, +0x8a9cb382, 0x4cf1a049, 0x15559917, 0xd3388adc, 0xc7d0c089, 0x01bdd342, 0x5819ea1c, 0x9e74f9d7, 0x3f6a12c8, 0xf9070103, 0xa0a3385d, 0x66ce2b96, 0x3c1571e0, 0xfa78622b, 0xa3dc5b75, 0x65b148be, 0xc4afa3a1, 0x02c2b06a, 0x5b668934, 0x9d0b9aff, +0x70b62a89, 0xb6db3942, 0xef7f001c, 0x291213d7, 0x880cf8c8, 0x4e61eb03, 0x17c5d25d, 0xd1a8c196, 0x8b739be0, 0x4d1e882b, 0x14bab175, 0xd2d7a2be, 0x73c949a1, 0xb5a45a6a, 0xec006334, 0x2a6d70ff, 0x3e853aaa, 0xf8e82961, 0xa14c103f, 0x672103f4, +0xc63fe8eb, 0x0052fb20, 0x59f6c27e, 0x9f9bd1b5, 0xc5408bc3, 0x032d9808, 0x5a89a156, 0x9ce4b29d, 0x3dfa5982, 0xfb974a49, 0xa2337317, 0x645e60dc, 0x3d9d53a7, 0xfbf0406c, 0xa2547932, 0x64396af9, 0xc52781e6, 0x034a922d, 0x5aeeab73, 0x9c83b8b8, +0xc658e2ce, 0x0035f105, 0x5991c85b, 0x9ffcdb90, 0x3ee2308f, 0xf88f2344, 0xa12b1a1a, 0x674609d1, 0x73ae4384, 0xb5c3504f, 0xec676911, 0x2a0a7ada, 0x8b1491c5, 0x4d79820e, 0x14ddbb50, 0xd2b0a89b, 0x886bf2ed, 0x4e06e126, 0x17a2d878, 0xd1cfcbb3, +0x70d120ac, 0xb6bc3367, 0xef180a39, 0x297519f2, 0xc4c8a984, 0x02a5ba4f, 0x5b018311, 0x9d6c90da, 0x3c727bc5, 0xfa1f680e, 0xa3bb5150, 0x65d6429b, 0x3f0d18ed, 0xf9600b26, 0xa0c43278, 0x66a921b3, 0xc7b7caac, 0x01dad967, 0x587ee039, 0x9e13f3f2, +0x8afbb9a7, 0x4c96aa6c, 0x15329332, 0xd35f80f9, 0x72416be6, 0xb42c782d, 0xed884173, 0x2be552b8, 0x713e08ce, 0xb7531b05, 0xeef7225b, 0x289a3190, 0x8984da8f, 0x4fe9c944, 0x164df01a, 0xd020e3d1, 0x00000000, 0xd95360d6, 0x045794ed, 0xdd04f43b, +0x4359fdd9, 0x9a0a9d0f, 0x470e6934, 0x9e5d09e2, 0x1e452a0c, 0xc7164ada, 0x1a12bee1, 0xc341de37, 0x5d1cd7d5, 0x844fb703, 0x594b4338, 0x801823ee, 0x1d4f44cb, 0xc41c241d, 0x1918d026, 0xc04bb0f0, 0x5e16b912, 0x8745d9c4, 0x5a412dff, 0x83124d29, +0x030a6ec7, 0xda590e11, 0x075dfa2a, 0xde0e9afc, 0x4053931e, 0x9900f3c8, 0x440407f3, 0x9d576725, 0xa5421ae5, 0x7c117a33, 0xa1158e08, 0x7846eede, 0xe61be73c, 0x3f4887ea, 0xe24c73d1, 0x3b1f1307, 0xbb0730e9, 0x6254503f, 0xbf50a404, 0x6603c4d2, +0xf85ecd30, 0x210dade6, 0xfc0959dd, 0x255a390b, 0xb80d5e2e, 0x615e3ef8, 0xbc5acac3, 0x6509aa15, 0xfb54a3f7, 0x2207c321, 0xff03371a, 0x265057cc, 0xa6487422, 0x7f1b14f4, 0xa21fe0cf, 0x7b4c8019, 0xe51189fb, 0x3c42e92d, 0xe1461d16, 0x38157dc0, +0x68bf2568, 0xb1ec45be, 0x6ce8b185, 0xb5bbd153, 0x2be6d8b1, 0xf2b5b867, 0x2fb14c5c, 0xf6e22c8a, 0x76fa0f64, 0xafa96fb2, 0x72ad9b89, 0xabfefb5f, 0x35a3f2bd, 0xecf0926b, 0x31f46650, 0xe8a70686, 0x75f061a3, 0xaca30175, 0x71a7f54e, 0xa8f49598, +0x36a99c7a, 0xeffafcac, 0x32fe0897, 0xebad6841, 0x6bb54baf, 0xb2e62b79, 0x6fe2df42, 0xb6b1bf94, 0x28ecb676, 0xf1bfd6a0, 0x2cbb229b, 0xf5e8424d, 0xcdfd3f8d, 0x14ae5f5b, 0xc9aaab60, 0x10f9cbb6, 0x8ea4c254, 0x57f7a282, 0x8af356b9, 0x53a0366f, +0xd3b81581, 0x0aeb7557, 0xd7ef816c, 0x0ebce1ba, 0x90e1e858, 0x49b2888e, 0x94b67cb5, 0x4de51c63, 0xd0b27b46, 0x09e11b90, 0xd4e5efab, 0x0db68f7d, 0x93eb869f, 0x4ab8e649, 0x97bc1272, 0x4eef72a4, 0xcef7514a, 0x17a4319c, 0xcaa0c5a7, 0x13f3a571, +0x8daeac93, 0x54fdcc45, 0x89f9387e, 0x50aa58a8, 0x5cec58f3, 0x85bf3825, 0x58bbcc1e, 0x81e8acc8, 0x1fb5a52a, 0xc6e6c5fc, 0x1be231c7, 0xc2b15111, 0x42a972ff, 0x9bfa1229, 0x46fee612, 0x9fad86c4, 0x01f08f26, 0xd8a3eff0, 0x05a71bcb, 0xdcf47b1d, +0x41a31c38, 0x98f07cee, 0x45f488d5, 0x9ca7e803, 0x02fae1e1, 0xdba98137, 0x06ad750c, 0xdffe15da, 0x5fe63634, 0x86b556e2, 0x5bb1a2d9, 0x82e2c20f, 0x1cbfcbed, 0xc5ecab3b, 0x18e85f00, 0xc1bb3fd6, 0xf9ae4216, 0x20fd22c0, 0xfdf9d6fb, 0x24aab62d, +0xbaf7bfcf, 0x63a4df19, 0xbea02b22, 0x67f34bf4, 0xe7eb681a, 0x3eb808cc, 0xe3bcfcf7, 0x3aef9c21, 0xa4b295c3, 0x7de1f515, 0xa0e5012e, 0x79b661f8, 0xe4e106dd, 0x3db2660b, 0xe0b69230, 0x39e5f2e6, 0xa7b8fb04, 0x7eeb9bd2, 0xa3ef6fe9, 0x7abc0f3f, +0xfaa42cd1, 0x23f74c07, 0xfef3b83c, 0x27a0d8ea, 0xb9fdd108, 0x60aeb1de, 0xbdaa45e5, 0x64f92533, 0x34537d9b, 0xed001d4d, 0x3004e976, 0xe95789a0, 0x770a8042, 0xae59e094, 0x735d14af, 0xaa0e7479, 0x2a165797, 0xf3453741, 0x2e41c37a, 0xf712a3ac, +0x694faa4e, 0xb01cca98, 0x6d183ea3, 0xb44b5e75, 0x291c3950, 0xf04f5986, 0x2d4badbd, 0xf418cd6b, 0x6a45c489, 0xb316a45f, 0x6e125064, 0xb74130b2, 0x3759135c, 0xee0a738a, 0x330e87b1, 0xea5de767, 0x7400ee85, 0xad538e53, 0x70577a68, 0xa9041abe, +0x9111677e, 0x484207a8, 0x9546f393, 0x4c159345, 0xd2489aa7, 0x0b1bfa71, 0xd61f0e4a, 0x0f4c6e9c, 0x8f544d72, 0x56072da4, 0x8b03d99f, 0x5250b949, 0xcc0db0ab, 0x155ed07d, 0xc85a2446, 0x11094490, 0x8c5e23b5, 0x550d4363, 0x8809b758, 0x515ad78e, +0xcf07de6c, 0x1654beba, 0xcb504a81, 0x12032a57, 0x921b09b9, 0x4b48696f, 0x964c9d54, 0x4f1ffd82, 0xd142f460, 0x081194b6, 0xd515608d, 0x0c46005b, 0x00000000, 0x4acddda1, 0x47d7fbde, 0x0d1a267f, 0xb28a51a0, 0xf8478c01, 0xf55daa7e, 0xbf9077df, +0x389efe43, 0x725323e2, 0x7f49059d, 0x3584d83c, 0x8a14afe3, 0xc0d97242, 0xcdc3543d, 0x870e899c, 0xb8da36d3, 0xf217eb72, 0xff0dcd0d, 0xb5c010ac, 0x0a506773, 0x409dbad2, 0x4d879cad, 0x074a410c, 0x8044c890, 0xca891531, 0xc793334e, 0x8d5eeeef, +0x32ce9930, 0x78034491, 0x751962ee, 0x3fd4bf4f, 0xdafe657a, 0x9033b8db, 0x9d299ea4, 0xd7e44305, 0x687434da, 0x22b9e97b, 0x2fa3cf04, 0x656e12a5, 0xe2609b39, 0xa8ad4698, 0xa5b760e7, 0xef7abd46, 0x50eaca99, 0x1a271738, 0x173d3147, 0x5df0ece6, +0x622453a9, 0x28e98e08, 0x25f3a877, 0x6f3e75d6, 0xd0ae0209, 0x9a63dfa8, 0x9779f9d7, 0xddb42476, 0x5abaadea, 0x1077704b, 0x1d6d5634, 0x57a08b95, 0xe830fc4a, 0xa2fd21eb, 0xafe70794, 0xe52ada35, 0x52f72dd2, 0x183af073, 0x1520d60c, 0x5fed0bad, +0xe07d7c72, 0xaab0a1d3, 0xa7aa87ac, 0xed675a0d, 0x6a69d391, 0x20a40e30, 0x2dbe284f, 0x6773f5ee, 0xd8e38231, 0x922e5f90, 0x9f3479ef, 0xd5f9a44e, 0xea2d1b01, 0xa0e0c6a0, 0xadfae0df, 0xe7373d7e, 0x58a74aa1, 0x126a9700, 0x1f70b17f, 0x55bd6cde, +0xd2b3e542, 0x987e38e3, 0x95641e9c, 0xdfa9c33d, 0x6039b4e2, 0x2af46943, 0x27ee4f3c, 0x6d23929d, 0x880948a8, 0xc2c49509, 0xcfdeb376, 0x85136ed7, 0x3a831908, 0x704ec4a9, 0x7d54e2d6, 0x37993f77, 0xb097b6eb, 0xfa5a6b4a, 0xf7404d35, 0xbd8d9094, +0x021de74b, 0x48d03aea, 0x45ca1c95, 0x0f07c134, 0x30d37e7b, 0x7a1ea3da, 0x770485a5, 0x3dc95804, 0x82592fdb, 0xc894f27a, 0xc58ed405, 0x8f4309a4, 0x084d8038, 0x42805d99, 0x4f9a7be6, 0x0557a647, 0xbac7d198, 0xf00a0c39, 0xfd102a46, 0xb7ddf7e7, +0x75237db9, 0x3feea018, 0x32f48667, 0x78395bc6, 0xc7a92c19, 0x8d64f1b8, 0x807ed7c7, 0xcab30a66, 0x4dbd83fa, 0x07705e5b, 0x0a6a7824, 0x40a7a585, 0xff37d25a, 0xb5fa0ffb, 0xb8e02984, 0xf22df425, 0xcdf94b6a, 0x873496cb, 0x8a2eb0b4, 0xc0e36d15, +0x7f731aca, 0x35bec76b, 0x38a4e114, 0x72693cb5, 0xf567b529, 0xbfaa6888, 0xb2b04ef7, 0xf87d9356, 0x47ede489, 0x0d203928, 0x003a1f57, 0x4af7c2f6, 0xafdd18c3, 0xe510c562, 0xe80ae31d, 0xa2c73ebc, 0x1d574963, 0x579a94c2, 0x5a80b2bd, 0x104d6f1c, +0x9743e680, 0xdd8e3b21, 0xd0941d5e, 0x9a59c0ff, 0x25c9b720, 0x6f046a81, 0x621e4cfe, 0x28d3915f, 0x17072e10, 0x5dcaf3b1, 0x50d0d5ce, 0x1a1d086f, 0xa58d7fb0, 0xef40a211, 0xe25a846e, 0xa89759cf, 0x2f99d053, 0x65540df2, 0x684e2b8d, 0x2283f62c, +0x9d1381f3, 0xd7de5c52, 0xdac47a2d, 0x9009a78c, 0x27d4506b, 0x6d198dca, 0x6003abb5, 0x2ace7614, 0x955e01cb, 0xdf93dc6a, 0xd289fa15, 0x984427b4, 0x1f4aae28, 0x55877389, 0x589d55f6, 0x12508857, 0xadc0ff88, 0xe70d2229, 0xea170456, 0xa0dad9f7, +0x9f0e66b8, 0xd5c3bb19, 0xd8d99d66, 0x921440c7, 0x2d843718, 0x6749eab9, 0x6a53ccc6, 0x209e1167, 0xa79098fb, 0xed5d455a, 0xe0476325, 0xaa8abe84, 0x151ac95b, 0x5fd714fa, 0x52cd3285, 0x1800ef24, 0xfd2a3511, 0xb7e7e8b0, 0xbafdcecf, 0xf030136e, +0x4fa064b1, 0x056db910, 0x08779f6f, 0x42ba42ce, 0xc5b4cb52, 0x8f7916f3, 0x8263308c, 0xc8aeed2d, 0x773e9af2, 0x3df34753, 0x30e9612c, 0x7a24bc8d, 0x45f003c2, 0x0f3dde63, 0x0227f81c, 0x48ea25bd, 0xf77a5262, 0xbdb78fc3, 0xb0ada9bc, 0xfa60741d, +0x7d6efd81, 0x37a32020, 0x3ab9065f, 0x7074dbfe, 0xcfe4ac21, 0x85297180, 0x883357ff, 0xc2fe8a5e, 0x00000000, 0xe2745f00, 0x41bd8cc1, 0xa3c9d3c1, 0x1ec3e6a3, 0xfcb7b9a3, 0x5f7e6a62, 0xbd0a3562, 0xe3dc5012, 0x01a80f12, 0xa261dcd3, 0x401583d3, +0xfd1fb6b1, 0x1f6be9b1, 0xbca23a70, 0x5ed66570, 0x5d366b62, 0xbf423462, 0x1c8be7a3, 0xfeffb8a3, 0x43f58dc1, 0xa181d2c1, 0x02480100, 0xe03c5e00, 0xbeea3b70, 0x5c9e6470, 0xff57b7b1, 0x1d23e8b1, 0xa029ddd3, 0x425d82d3, 0xe1945112, 0x03e00e12, +0x0e9db826, 0xece9e726, 0x4f2034e7, 0xad546be7, 0x105e5e85, 0xf22a0185, 0x51e3d244, 0xb3978d44, 0xed41e834, 0x0f35b734, 0xacfc64f5, 0x4e883bf5, 0xf3820e97, 0x11f65197, 0xb23f8256, 0x504bdd56, 0x53abd344, 0xb1df8c44, 0x12165f85, 0xf0620085, +0x4d6835e7, 0xaf1c6ae7, 0x0cd5b926, 0xeea1e626, 0xb0778356, 0x5203dc56, 0xf1ca0f97, 0x13be5097, 0xaeb465f5, 0x4cc03af5, 0xef09e934, 0x0d7db634, 0x455e0ac0, 0xa72a55c0, 0x04e38601, 0xe697d901, 0x5b9dec63, 0xb9e9b363, 0x1a2060a2, 0xf8543fa2, +0xa6825ad2, 0x44f605d2, 0xe73fd613, 0x054b8913, 0xb841bc71, 0x5a35e371, 0xf9fc30b0, 0x1b886fb0, 0x186861a2, 0xfa1c3ea2, 0x59d5ed63, 0xbba1b263, 0x06ab8701, 0xe4dfd801, 0x47160bc0, 0xa56254c0, 0xfbb431b0, 0x19c06eb0, 0xba09bd71, 0x587de271, +0xe577d713, 0x07038813, 0xa4ca5bd2, 0x46be04d2, 0x4bc3b2e6, 0xa9b7ede6, 0x0a7e3e27, 0xe80a6127, 0x55005445, 0xb7740b45, 0x14bdd884, 0xf6c98784, 0xa81fe2f4, 0x4a6bbdf4, 0xe9a26e35, 0x0bd63135, 0xb6dc0457, 0x54a85b57, 0xf7618896, 0x1515d796, +0x16f5d984, 0xf4818684, 0x57485545, 0xb53c0a45, 0x08363f27, 0xea426027, 0x498bb3e6, 0xabffece6, 0xf5298996, 0x175dd696, 0xb4940557, 0x56e05a57, 0xebea6f35, 0x099e3035, 0xaa57e3f4, 0x4823bcf4, 0x398de365, 0xdbf9bc65, 0x78306fa4, 0x9a4430a4, +0x274e05c6, 0xc53a5ac6, 0x66f38907, 0x8487d607, 0xda51b377, 0x3825ec77, 0x9bec3fb6, 0x799860b6, 0xc49255d4, 0x26e60ad4, 0x852fd915, 0x675b8615, 0x64bb8807, 0x86cfd707, 0x250604c6, 0xc7725bc6, 0x7a786ea4, 0x980c31a4, 0x3bc5e265, 0xd9b1bd65, +0x8767d815, 0x65138715, 0xc6da54d4, 0x24ae0bd4, 0x99a43eb6, 0x7bd061b6, 0xd819b277, 0x3a6ded77, 0x37105b43, 0xd5640443, 0x76add782, 0x94d98882, 0x29d3bde0, 0xcba7e2e0, 0x686e3121, 0x8a1a6e21, 0xd4cc0b51, 0x36b85451, 0x95718790, 0x7705d890, +0xca0fedf2, 0x287bb2f2, 0x8bb26133, 0x69c63e33, 0x6a263021, 0x88526f21, 0x2b9bbce0, 0xc9efe3e0, 0x74e5d682, 0x96918982, 0x35585a43, 0xd72c0543, 0x89fa6033, 0x6b8e3f33, 0xc847ecf2, 0x2a33b3f2, 0x97398690, 0x754dd990, 0xd6840a51, 0x34f05551, +0x7cd3e9a5, 0x9ea7b6a5, 0x3d6e6564, 0xdf1a3a64, 0x62100f06, 0x80645006, 0x23ad83c7, 0xc1d9dcc7, 0x9f0fb9b7, 0x7d7be6b7, 0xdeb23576, 0x3cc66a76, 0x81cc5f14, 0x63b80014, 0xc071d3d5, 0x22058cd5, 0x21e582c7, 0xc391ddc7, 0x60580e06, 0x822c5106, +0x3f266464, 0xdd523b64, 0x7e9be8a5, 0x9cefb7a5, 0xc239d2d5, 0x204d8dd5, 0x83845e14, 0x61f00114, 0xdcfa3476, 0x3e8e6b76, 0x9d47b8b7, 0x7f33e7b7, 0x724e5183, 0x903a0e83, 0x33f3dd42, 0xd1878242, 0x6c8db720, 0x8ef9e820, 0x2d303be1, 0xcf4464e1, +0x91920191, 0x73e65e91, 0xd02f8d50, 0x325bd250, 0x8f51e732, 0x6d25b832, 0xceec6bf3, 0x2c9834f3, 0x2f783ae1, 0xcd0c65e1, 0x6ec5b620, 0x8cb1e920, 0x31bbdc42, 0xd3cf8342, 0x70065083, 0x92720f83, 0xcca46af3, 0x2ed035f3, 0x8d19e632, 0x6f6db932, +0xd2678c50, 0x3013d350, 0x93da0091, 0x71ae5f91, 0x00000000, 0x816aa6ef, 0x1136f998, 0x905c5f77, 0xd38f5aee, 0x52e5fc01, 0xc2b9a376, 0x43d30599, 0x25e34990, 0xa489ef7f, 0x34d5b008, 0xb5bf16e7, 0xf66c137e, 0x7706b591, 0xe75aeae6, 0x66304c09, +0x2f508b01, 0xae3a2dee, 0x3e667299, 0xbf0cd476, 0xfcdfd1ef, 0x7db57700, 0xede92877, 0x6c838e98, 0x0ab3c291, 0x8bd9647e, 0x1b853b09, 0x9aef9de6, 0xd93c987f, 0x58563e90, 0xc80a61e7, 0x4960c708, 0x888e802c, 0x09e426c3, 0x99b879b4, 0x18d2df5b, +0x5b01dac2, 0xda6b7c2d, 0x4a37235a, 0xcb5d85b5, 0xad6dc9bc, 0x2c076f53, 0xbc5b3024, 0x3d3196cb, 0x7ee29352, 0xff8835bd, 0x6fd46aca, 0xeebecc25, 0xa7de0b2d, 0x26b4adc2, 0xb6e8f2b5, 0x3782545a, 0x745151c3, 0xf53bf72c, 0x6567a85b, 0xe40d0eb4, +0x823d42bd, 0x0357e452, 0x930bbb25, 0x12611dca, 0x51b21853, 0xd0d8bebc, 0x4084e1cb, 0xc1ee4724, 0x6788ba26, 0xe6e21cc9, 0x76be43be, 0xf7d4e551, 0xb407e0c8, 0x356d4627, 0xa5311950, 0x245bbfbf, 0x426bf3b6, 0xc3015559, 0x535d0a2e, 0xd237acc1, +0x91e4a958, 0x108e0fb7, 0x80d250c0, 0x01b8f62f, 0x48d83127, 0xc9b297c8, 0x59eec8bf, 0xd8846e50, 0x9b576bc9, 0x1a3dcd26, 0x8a619251, 0x0b0b34be, 0x6d3b78b7, 0xec51de58, 0x7c0d812f, 0xfd6727c0, 0xbeb42259, 0x3fde84b6, 0xaf82dbc1, 0x2ee87d2e, +0xef063a0a, 0x6e6c9ce5, 0xfe30c392, 0x7f5a657d, 0x3c8960e4, 0xbde3c60b, 0x2dbf997c, 0xacd53f93, 0xcae5739a, 0x4b8fd575, 0xdbd38a02, 0x5ab92ced, 0x196a2974, 0x98008f9b, 0x085cd0ec, 0x89367603, 0xc056b10b, 0x413c17e4, 0xd1604893, 0x500aee7c, +0x13d9ebe5, 0x92b34d0a, 0x02ef127d, 0x8385b492, 0xe5b5f89b, 0x64df5e74, 0xf4830103, 0x75e9a7ec, 0x363aa275, 0xb750049a, 0x270c5bed, 0xa666fd02, 0x9d0c14bb, 0x1c66b254, 0x8c3aed23, 0x0d504bcc, 0x4e834e55, 0xcfe9e8ba, 0x5fb5b7cd, 0xdedf1122, +0xb8ef5d2b, 0x3985fbc4, 0xa9d9a4b3, 0x28b3025c, 0x6b6007c5, 0xea0aa12a, 0x7a56fe5d, 0xfb3c58b2, 0xb25c9fba, 0x33363955, 0xa36a6622, 0x2200c0cd, 0x61d3c554, 0xe0b963bb, 0x70e53ccc, 0xf18f9a23, 0x97bfd62a, 0x16d570c5, 0x86892fb2, 0x07e3895d, +0x44308cc4, 0xc55a2a2b, 0x5506755c, 0xd46cd3b3, 0x15829497, 0x94e83278, 0x04b46d0f, 0x85decbe0, 0xc60dce79, 0x47676896, 0xd73b37e1, 0x5651910e, 0x3061dd07, 0xb10b7be8, 0x2157249f, 0xa03d8270, 0xe3ee87e9, 0x62842106, 0xf2d87e71, 0x73b2d89e, +0x3ad21f96, 0xbbb8b979, 0x2be4e60e, 0xaa8e40e1, 0xe95d4578, 0x6837e397, 0xf86bbce0, 0x79011a0f, 0x1f315606, 0x9e5bf0e9, 0x0e07af9e, 0x8f6d0971, 0xccbe0ce8, 0x4dd4aa07, 0xdd88f570, 0x5ce2539f, 0xfa84ae9d, 0x7bee0872, 0xebb25705, 0x6ad8f1ea, +0x290bf473, 0xa861529c, 0x383d0deb, 0xb957ab04, 0xdf67e70d, 0x5e0d41e2, 0xce511e95, 0x4f3bb87a, 0x0ce8bde3, 0x8d821b0c, 0x1dde447b, 0x9cb4e294, 0xd5d4259c, 0x54be8373, 0xc4e2dc04, 0x45887aeb, 0x065b7f72, 0x8731d99d, 0x176d86ea, 0x96072005, +0xf0376c0c, 0x715dcae3, 0xe1019594, 0x606b337b, 0x23b836e2, 0xa2d2900d, 0x328ecf7a, 0xb3e46995, 0x720a2eb1, 0xf360885e, 0x633cd729, 0xe25671c6, 0xa185745f, 0x20efd2b0, 0xb0b38dc7, 0x31d92b28, 0x57e96721, 0xd683c1ce, 0x46df9eb9, 0xc7b53856, +0x84663dcf, 0x050c9b20, 0x9550c457, 0x143a62b8, 0x5d5aa5b0, 0xdc30035f, 0x4c6c5c28, 0xcd06fac7, 0x8ed5ff5e, 0x0fbf59b1, 0x9fe306c6, 0x1e89a029, 0x78b9ec20, 0xf9d34acf, 0x698f15b8, 0xe8e5b357, 0xab36b6ce, 0x2a5c1021, 0xba004f56, 0x3b6ae9b9, +0x00000000, 0x7aacb049, 0xa036ef24, 0xda9a5f6d, 0x5d22e60e, 0x278e5647, 0xfd14092a, 0x87b8b963, 0xf1e6b8a8, 0x8b4a08e1, 0x51d0578c, 0x2b7ce7c5, 0xacc45ea6, 0xd668eeef, 0x0cf2b182, 0x765e01cb, 0x023e40e6, 0x7892f0af, 0xa208afc2, 0xd8a41f8b, +0x5f1ca6e8, 0x25b016a1, 0xff2a49cc, 0x8586f985, 0xf3d8f84e, 0x89744807, 0x53ee176a, 0x2942a723, 0xaefa1e40, 0xd456ae09, 0x0eccf164, 0x7460412d, 0xf6d865e2, 0x8c74d5ab, 0x56ee8ac6, 0x2c423a8f, 0xabfa83ec, 0xd15633a5, 0x0bcc6cc8, 0x7160dc81, +0x073edd4a, 0x7d926d03, 0xa708326e, 0xdda48227, 0x5a1c3b44, 0x20b08b0d, 0xfa2ad460, 0x80866429, 0xf4e62504, 0x8e4a954d, 0x54d0ca20, 0x2e7c7a69, 0xa9c4c30a, 0xd3687343, 0x09f22c2e, 0x735e9c67, 0x05009dac, 0x7fac2de5, 0xa5367288, 0xdf9ac2c1, +0x58227ba2, 0x228ecbeb, 0xf8149486, 0x82b824cf, 0x50d9da63, 0x2a756a2a, 0xf0ef3547, 0x8a43850e, 0x0dfb3c6d, 0x77578c24, 0xadcdd349, 0xd7616300, 0xa13f62cb, 0xdb93d282, 0x01098def, 0x7ba53da6, 0xfc1d84c5, 0x86b1348c, 0x5c2b6be1, 0x2687dba8, +0x52e79a85, 0x284b2acc, 0xf2d175a1, 0x887dc5e8, 0x0fc57c8b, 0x7569ccc2, 0xaff393af, 0xd55f23e6, 0xa301222d, 0xd9ad9264, 0x0337cd09, 0x799b7d40, 0xfe23c423, 0x848f746a, 0x5e152b07, 0x24b99b4e, 0xa601bf81, 0xdcad0fc8, 0x063750a5, 0x7c9be0ec, +0xfb23598f, 0x818fe9c6, 0x5b15b6ab, 0x21b906e2, 0x57e70729, 0x2d4bb760, 0xf7d1e80d, 0x8d7d5844, 0x0ac5e127, 0x7069516e, 0xaaf30e03, 0xd05fbe4a, 0xa43fff67, 0xde934f2e, 0x04091043, 0x7ea5a00a, 0xf91d1969, 0x83b1a920, 0x592bf64d, 0x23874604, +0x55d947cf, 0x2f75f786, 0xf5efa8eb, 0x8f4318a2, 0x08fba1c1, 0x72571188, 0xa8cd4ee5, 0xd261feac, 0xeb44c8ca, 0x91e87883, 0x4b7227ee, 0x31de97a7, 0xb6662ec4, 0xccca9e8d, 0x1650c1e0, 0x6cfc71a9, 0x1aa27062, 0x600ec02b, 0xba949f46, 0xc0382f0f, +0x4780966c, 0x3d2c2625, 0xe7b67948, 0x9d1ac901, 0xe97a882c, 0x93d63865, 0x494c6708, 0x33e0d741, 0xb4586e22, 0xcef4de6b, 0x146e8106, 0x6ec2314f, 0x189c3084, 0x623080cd, 0xb8aadfa0, 0xc2066fe9, 0x45bed68a, 0x3f1266c3, 0xe58839ae, 0x9f2489e7, +0x1d9cad28, 0x67301d61, 0xbdaa420c, 0xc706f245, 0x40be4b26, 0x3a12fb6f, 0xe088a402, 0x9a24144b, 0xec7a1580, 0x96d6a5c9, 0x4c4cfaa4, 0x36e04aed, 0xb158f38e, 0xcbf443c7, 0x116e1caa, 0x6bc2ace3, 0x1fa2edce, 0x650e5d87, 0xbf9402ea, 0xc538b2a3, +0x42800bc0, 0x382cbb89, 0xe2b6e4e4, 0x981a54ad, 0xee445566, 0x94e8e52f, 0x4e72ba42, 0x34de0a0b, 0xb366b368, 0xc9ca0321, 0x13505c4c, 0x69fcec05, 0xbb9d12a9, 0xc131a2e0, 0x1babfd8d, 0x61074dc4, 0xe6bff4a7, 0x9c1344ee, 0x46891b83, 0x3c25abca, +0x4a7baa01, 0x30d71a48, 0xea4d4525, 0x90e1f56c, 0x17594c0f, 0x6df5fc46, 0xb76fa32b, 0xcdc31362, 0xb9a3524f, 0xc30fe206, 0x1995bd6b, 0x63390d22, 0xe481b441, 0x9e2d0408, 0x44b75b65, 0x3e1beb2c, 0x4845eae7, 0x32e95aae, 0xe87305c3, 0x92dfb58a, +0x15670ce9, 0x6fcbbca0, 0xb551e3cd, 0xcffd5384, 0x4d45774b, 0x37e9c702, 0xed73986f, 0x97df2826, 0x10679145, 0x6acb210c, 0xb0517e61, 0xcafdce28, 0xbca3cfe3, 0xc60f7faa, 0x1c9520c7, 0x6639908e, 0xe18129ed, 0x9b2d99a4, 0x41b7c6c9, 0x3b1b7680, +0x4f7b37ad, 0x35d787e4, 0xef4dd889, 0x95e168c0, 0x1259d1a3, 0x68f561ea, 0xb26f3e87, 0xc8c38ece, 0xbe9d8f05, 0xc4313f4c, 0x1eab6021, 0x6407d068, 0xe3bf690b, 0x9913d942, 0x4389862f, 0x39253666, 0x00000000, 0xaf7ef2bf, 0x128aec61, 0xbdf41ede, +0xb4f6ea3b, 0x1b881884, 0xa67c065a, 0x0902f4e5, 0xc503f4cc, 0x6a7d0673, 0xd78918ad, 0x78f7ea12, 0x71f51ef7, 0xde8bec48, 0x637ff296, 0xcc010029, 0x7ede175f, 0xd1a0e5e0, 0x6c54fb3e, 0xc32a0981, 0xca28fd64, 0x65560fdb, 0xd8a21105, 0x77dce3ba, +0xbbdde393, 0x14a3112c, 0xa9570ff2, 0x0629fd4d, 0x0f2b09a8, 0xa055fb17, 0x1da1e5c9, 0xb2df1776, 0xeef575e3, 0x418b875c, 0xfc7f9982, 0x53016b3d, 0x5a039fd8, 0xf57d6d67, 0x488973b9, 0xe7f78106, 0x2bf6812f, 0x84887390, 0x397c6d4e, 0x96029ff1, +0x9f006b14, 0x307e99ab, 0x8d8a8775, 0x22f475ca, 0x902b62bc, 0x3f559003, 0x82a18edd, 0x2ddf7c62, 0x24dd8887, 0x8ba37a38, 0x365764e6, 0x99299659, 0x55289670, 0xfa5664cf, 0x47a27a11, 0xe8dc88ae, 0xe1de7c4b, 0x4ea08ef4, 0xf354902a, 0x5c2a6295, +0xa318ac1e, 0x0c665ea1, 0xb192407f, 0x1eecb2c0, 0x17ee4625, 0xb890b49a, 0x0564aa44, 0xaa1a58fb, 0x661b58d2, 0xc965aa6d, 0x7491b4b3, 0xdbef460c, 0xd2edb2e9, 0x7d934056, 0xc0675e88, 0x6f19ac37, 0xddc6bb41, 0x72b849fe, 0xcf4c5720, 0x6032a59f, +0x6930517a, 0xc64ea3c5, 0x7bbabd1b, 0xd4c44fa4, 0x18c54f8d, 0xb7bbbd32, 0x0a4fa3ec, 0xa5315153, 0xac33a5b6, 0x034d5709, 0xbeb949d7, 0x11c7bb68, 0x4dedd9fd, 0xe2932b42, 0x5f67359c, 0xf019c723, 0xf91b33c6, 0x5665c179, 0xeb91dfa7, 0x44ef2d18, +0x88ee2d31, 0x2790df8e, 0x9a64c150, 0x351a33ef, 0x3c18c70a, 0x936635b5, 0x2e922b6b, 0x81ecd9d4, 0x3333cea2, 0x9c4d3c1d, 0x21b922c3, 0x8ec7d07c, 0x87c52499, 0x28bbd626, 0x954fc8f8, 0x3a313a47, 0xf6303a6e, 0x594ec8d1, 0xe4bad60f, 0x4bc424b0, +0x42c6d055, 0xedb822ea, 0x504c3c34, 0xff32ce8b, 0xe0d950eb, 0x4fa7a254, 0xf253bc8a, 0x5d2d4e35, 0x542fbad0, 0xfb51486f, 0x46a556b1, 0xe9dba40e, 0x25daa427, 0x8aa45698, 0x37504846, 0x982ebaf9, 0x912c4e1c, 0x3e52bca3, 0x83a6a27d, 0x2cd850c2, +0x9e0747b4, 0x3179b50b, 0x8c8dabd5, 0x23f3596a, 0x2af1ad8f, 0x858f5f30, 0x387b41ee, 0x9705b351, 0x5b04b378, 0xf47a41c7, 0x498e5f19, 0xe6f0ada6, 0xeff25943, 0x408cabfc, 0xfd78b522, 0x5206479d, 0x0e2c2508, 0xa152d7b7, 0x1ca6c969, 0xb3d83bd6, +0xbadacf33, 0x15a43d8c, 0xa8502352, 0x072ed1ed, 0xcb2fd1c4, 0x6451237b, 0xd9a53da5, 0x76dbcf1a, 0x7fd93bff, 0xd0a7c940, 0x6d53d79e, 0xc22d2521, 0x70f23257, 0xdf8cc0e8, 0x6278de36, 0xcd062c89, 0xc404d86c, 0x6b7a2ad3, 0xd68e340d, 0x79f0c6b2, +0xb5f1c69b, 0x1a8f3424, 0xa77b2afa, 0x0805d845, 0x01072ca0, 0xae79de1f, 0x138dc0c1, 0xbcf3327e, 0x43c1fcf5, 0xecbf0e4a, 0x514b1094, 0xfe35e22b, 0xf73716ce, 0x5849e471, 0xe5bdfaaf, 0x4ac30810, 0x86c20839, 0x29bcfa86, 0x9448e458, 0x3b3616e7, +0x3234e202, 0x9d4a10bd, 0x20be0e63, 0x8fc0fcdc, 0x3d1febaa, 0x92611915, 0x2f9507cb, 0x80ebf574, 0x89e90191, 0x2697f32e, 0x9b63edf0, 0x341d1f4f, 0xf81c1f66, 0x5762edd9, 0xea96f307, 0x45e801b8, 0x4ceaf55d, 0xe39407e2, 0x5e60193c, 0xf11eeb83, +0xad348916, 0x024a7ba9, 0xbfbe6577, 0x10c097c8, 0x19c2632d, 0xb6bc9192, 0x0b488f4c, 0xa4367df3, 0x68377dda, 0xc7498f65, 0x7abd91bb, 0xd5c36304, 0xdcc197e1, 0x73bf655e, 0xce4b7b80, 0x6135893f, 0xd3ea9e49, 0x7c946cf6, 0xc1607228, 0x6e1e8097, +0x671c7472, 0xc86286cd, 0x75969813, 0xdae86aac, 0x16e96a85, 0xb997983a, 0x046386e4, 0xab1d745b, 0xa21f80be, 0x0d617201, 0xb0956cdf, 0x1feb9e60, 0x00000000, 0x94840e0f, 0xaec9d126, 0x3a4ddf29, 0xe81a20c6, 0x7c9e2ec9, 0x46d3f1e0, 0xd257ffef, +0xa0828e23, 0x3406802c, 0x0e4b5f05, 0x9acf510a, 0x4898aee5, 0xdc1ca0ea, 0xe6517fc3, 0x72d571cc, 0x1b579fbc, 0x8fd391b3, 0xb59e4e9a, 0x211a4095, 0xf34dbf7a, 0x67c9b175, 0x5d846e5c, 0xc9006053, 0xbbd5119f, 0x2f511f90, 0x151cc0b9, 0x8198ceb6, +0x53cf3159, 0xc74b3f56, 0xfd06e07f, 0x6982ee70, 0xb997e9a2, 0x2d13e7ad, 0x175e3884, 0x83da368b, 0x518dc964, 0xc509c76b, 0xff441842, 0x6bc0164d, 0x19156781, 0x8d91698e, 0xb7dcb6a7, 0x2358b8a8, 0xf10f4747, 0x658b4948, 0x5fc69661, 0xcb42986e, +0xa2c0761e, 0x36447811, 0x0c09a738, 0x988da937, 0x4ada56d8, 0xde5e58d7, 0xe41387fe, 0x709789f1, 0x0242f83d, 0x96c6f632, 0xac8b291b, 0x380f2714, 0xea58d8fb, 0x7edcd6f4, 0x449109dd, 0xd01507d2, 0xb20c0bf6, 0x268805f9, 0x1cc5dad0, 0x8841d4df, +0x5a162b30, 0xce92253f, 0xf4dffa16, 0x605bf419, 0x128e85d5, 0x860a8bda, 0xbc4754f3, 0x28c35afc, 0xfa94a513, 0x6e10ab1c, 0x545d7435, 0xc0d97a3a, 0xa95b944a, 0x3ddf9a45, 0x0792456c, 0x93164b63, 0x4141b48c, 0xd5c5ba83, 0xef8865aa, 0x7b0c6ba5, +0x09d91a69, 0x9d5d1466, 0xa710cb4f, 0x3394c540, 0xe1c33aaf, 0x754734a0, 0x4f0aeb89, 0xdb8ee586, 0x0b9be254, 0x9f1fec5b, 0xa5523372, 0x31d63d7d, 0xe381c292, 0x7705cc9d, 0x4d4813b4, 0xd9cc1dbb, 0xab196c77, 0x3f9d6278, 0x05d0bd51, 0x9154b35e, +0x43034cb1, 0xd78742be, 0xedca9d97, 0x794e9398, 0x10cc7de8, 0x844873e7, 0xbe05acce, 0x2a81a2c1, 0xf8d65d2e, 0x6c525321, 0x561f8c08, 0xc29b8207, 0xb04ef3cb, 0x24cafdc4, 0x1e8722ed, 0x8a032ce2, 0x5854d30d, 0xccd0dd02, 0xf69d022b, 0x62190c24, +0xd33c62f8, 0x47b86cf7, 0x7df5b3de, 0xe971bdd1, 0x3b26423e, 0xafa24c31, 0x95ef9318, 0x016b9d17, 0x73beecdb, 0xe73ae2d4, 0xdd773dfd, 0x49f333f2, 0x9ba4cc1d, 0x0f20c212, 0x356d1d3b, 0xa1e91334, 0xc86bfd44, 0x5ceff34b, 0x66a22c62, 0xf226226d, +0x2071dd82, 0xb4f5d38d, 0x8eb80ca4, 0x1a3c02ab, 0x68e97367, 0xfc6d7d68, 0xc620a241, 0x52a4ac4e, 0x80f353a1, 0x14775dae, 0x2e3a8287, 0xbabe8c88, 0x6aab8b5a, 0xfe2f8555, 0xc4625a7c, 0x50e65473, 0x82b1ab9c, 0x1635a593, 0x2c787aba, 0xb8fc74b5, +0xca290579, 0x5ead0b76, 0x64e0d45f, 0xf064da50, 0x223325bf, 0xb6b72bb0, 0x8cfaf499, 0x187efa96, 0x71fc14e6, 0xe5781ae9, 0xdf35c5c0, 0x4bb1cbcf, 0x99e63420, 0x0d623a2f, 0x372fe506, 0xa3abeb09, 0xd17e9ac5, 0x45fa94ca, 0x7fb74be3, 0xeb3345ec, +0x3964ba03, 0xade0b40c, 0x97ad6b25, 0x0329652a, 0x6130690e, 0xf5b46701, 0xcff9b828, 0x5b7db627, 0x892a49c8, 0x1dae47c7, 0x27e398ee, 0xb36796e1, 0xc1b2e72d, 0x5536e922, 0x6f7b360b, 0xfbff3804, 0x29a8c7eb, 0xbd2cc9e4, 0x876116cd, 0x13e518c2, +0x7a67f6b2, 0xeee3f8bd, 0xd4ae2794, 0x402a299b, 0x927dd674, 0x06f9d87b, 0x3cb40752, 0xa830095d, 0xdae57891, 0x4e61769e, 0x742ca9b7, 0xe0a8a7b8, 0x32ff5857, 0xa67b5658, 0x9c368971, 0x08b2877e, 0xd8a780ac, 0x4c238ea3, 0x766e518a, 0xe2ea5f85, +0x30bda06a, 0xa439ae65, 0x9e74714c, 0x0af07f43, 0x78250e8f, 0xeca10080, 0xd6ecdfa9, 0x4268d1a6, 0x903f2e49, 0x04bb2046, 0x3ef6ff6f, 0xaa72f160, 0xc3f01f10, 0x5774111f, 0x6d39ce36, 0xf9bdc039, 0x2bea3fd6, 0xbf6e31d9, 0x8523eef0, 0x11a7e0ff, +0x63729133, 0xf7f69f3c, 0xcdbb4015, 0x593f4e1a, 0x8b68b1f5, 0x1fecbffa, 0x25a160d3, 0xb1256edc, 0x00000000, 0x9bfa93f7, 0x5b7296ed, 0xc088051a, 0xdcc3e6e1, 0x47397516, 0x87b1700c, 0x1c4be3fb, 0xee277c82, 0x75ddef75, 0xb555ea6f, 0x2eaf7998, +0x32e49a63, 0xa91e0994, 0x69960c8e, 0xf26c9f79, 0xd3d55c42, 0x482fcfb5, 0x88a7caaf, 0x135d5958, 0x0f16baa3, 0x94ec2954, 0x54642c4e, 0xcf9ebfb9, 0x3df220c0, 0xa608b337, 0x6680b62d, 0xfd7a25da, 0xe131c621, 0x7acb55d6, 0xba4350cc, 0x21b9c33b, +0x19280044, 0x82d293b3, 0x425a96a9, 0xd9a0055e, 0xc5ebe6a5, 0x5e117552, 0x9e997048, 0x0563e3bf, 0xf70f7cc6, 0x6cf5ef31, 0xac7dea2b, 0x378779dc, 0x2bcc9a27, 0xb03609d0, 0x70be0cca, 0xeb449f3d, 0xcafd5c06, 0x5107cff1, 0x918fcaeb, 0x0a75591c, +0x163ebae7, 0x8dc42910, 0x4d4c2c0a, 0xd6b6bffd, 0x24da2084, 0xbf20b373, 0x7fa8b669, 0xe452259e, 0xf819c665, 0x63e35592, 0xa36b5088, 0x3891c37f, 0x9ce52e0b, 0x071fbdfc, 0xc797b8e6, 0x5c6d2b11, 0x4026c8ea, 0xdbdc5b1d, 0x1b545e07, 0x80aecdf0, +0x72c25289, 0xe938c17e, 0x29b0c464, 0xb24a5793, 0xae01b468, 0x35fb279f, 0xf5732285, 0x6e89b172, 0x4f307249, 0xd4cae1be, 0x1442e4a4, 0x8fb87753, 0x93f394a8, 0x0809075f, 0xc8810245, 0x537b91b2, 0xa1170ecb, 0x3aed9d3c, 0xfa659826, 0x619f0bd1, +0x7dd4e82a, 0xe62e7bdd, 0x26a67ec7, 0xbd5ced30, 0x85cd2e4f, 0x1e37bdb8, 0xdebfb8a2, 0x45452b55, 0x590ec8ae, 0xc2f45b59, 0x027c5e43, 0x9986cdb4, 0x6bea52cd, 0xf010c13a, 0x3098c420, 0xab6257d7, 0xb729b42c, 0x2cd327db, 0xec5b22c1, 0x77a1b136, +0x5618720d, 0xcde2e1fa, 0x0d6ae4e0, 0x96907717, 0x8adb94ec, 0x1121071b, 0xd1a90201, 0x4a5391f6, 0xb83f0e8f, 0x23c59d78, 0xe34d9862, 0x78b70b95, 0x64fce86e, 0xff067b99, 0x3f8e7e83, 0xa474ed74, 0x2bf9a858, 0xb0033baf, 0x708b3eb5, 0xeb71ad42, +0xf73a4eb9, 0x6cc0dd4e, 0xac48d854, 0x37b24ba3, 0xc5ded4da, 0x5e24472d, 0x9eac4237, 0x0556d1c0, 0x191d323b, 0x82e7a1cc, 0x426fa4d6, 0xd9953721, 0xf82cf41a, 0x63d667ed, 0xa35e62f7, 0x38a4f100, 0x24ef12fb, 0xbf15810c, 0x7f9d8416, 0xe46717e1, +0x160b8898, 0x8df11b6f, 0x4d791e75, 0xd6838d82, 0xcac86e79, 0x5132fd8e, 0x91baf894, 0x0a406b63, 0x32d1a81c, 0xa92b3beb, 0x69a33ef1, 0xf259ad06, 0xee124efd, 0x75e8dd0a, 0xb560d810, 0x2e9a4be7, 0xdcf6d49e, 0x470c4769, 0x87844273, 0x1c7ed184, +0x0035327f, 0x9bcfa188, 0x5b47a492, 0xc0bd3765, 0xe104f45e, 0x7afe67a9, 0xba7662b3, 0x218cf144, 0x3dc712bf, 0xa63d8148, 0x66b58452, 0xfd4f17a5, 0x0f2388dc, 0x94d91b2b, 0x54511e31, 0xcfab8dc6, 0xd3e06e3d, 0x481afdca, 0x8892f8d0, 0x13686b27, +0xb71c8653, 0x2ce615a4, 0xec6e10be, 0x77948349, 0x6bdf60b2, 0xf025f345, 0x30adf65f, 0xab5765a8, 0x593bfad1, 0xc2c16926, 0x02496c3c, 0x99b3ffcb, 0x85f81c30, 0x1e028fc7, 0xde8a8add, 0x4570192a, 0x64c9da11, 0xff3349e6, 0x3fbb4cfc, 0xa441df0b, +0xb80a3cf0, 0x23f0af07, 0xe378aa1d, 0x788239ea, 0x8aeea693, 0x11143564, 0xd19c307e, 0x4a66a389, 0x562d4072, 0xcdd7d385, 0x0d5fd69f, 0x96a54568, 0xae348617, 0x35ce15e0, 0xf54610fa, 0x6ebc830d, 0x72f760f6, 0xe90df301, 0x2985f61b, 0xb27f65ec, +0x4013fa95, 0xdbe96962, 0x1b616c78, 0x809bff8f, 0x9cd01c74, 0x072a8f83, 0xc7a28a99, 0x5c58196e, 0x7de1da55, 0xe61b49a2, 0x26934cb8, 0xbd69df4f, 0xa1223cb4, 0x3ad8af43, 0xfa50aa59, 0x61aa39ae, 0x93c6a6d7, 0x083c3520, 0xc8b4303a, 0x534ea3cd, +0x4f054036, 0xd4ffd3c1, 0x1477d6db, 0x8f8d452c, 0x00000000, 0x8b53edc0, 0x210a48a7, 0xaa59a567, 0x23acd7da, 0xa8ff3a1a, 0x02a69f7d, 0x89f572bd, 0x3c81406c, 0xb7d2adac, 0x1d8b08cb, 0x96d8e50b, 0x1f2d97b6, 0x947e7a76, 0x3e27df11, 0xb57432d1, +0x8ccf1ba6, 0x079cf666, 0xadc55301, 0x2696bec1, 0xaf63cc7c, 0x243021bc, 0x8e6984db, 0x053a691b, 0xb04e5bca, 0x3b1db60a, 0x9144136d, 0x1a17fead, 0x93e28c10, 0x18b161d0, 0xb2e8c4b7, 0x39bb2977, 0x57ffe8f5, 0xdcac0535, 0x76f5a052, 0xfda64d92, +0x74533f2f, 0xff00d2ef, 0x55597788, 0xde0a9a48, 0x6b7ea899, 0xe02d4559, 0x4a74e03e, 0xc1270dfe, 0x48d27f43, 0xc3819283, 0x69d837e4, 0xe28bda24, 0xdb30f353, 0x50631e93, 0xfa3abbf4, 0x71695634, 0xf89c2489, 0x73cfc949, 0xd9966c2e, 0x52c581ee, +0xe7b1b33f, 0x6ce25eff, 0xc6bbfb98, 0x4de81658, 0xc41d64e5, 0x4f4e8925, 0xe5172c42, 0x6e44c182, 0xec612392, 0x6732ce52, 0xcd6b6b35, 0x463886f5, 0xcfcdf448, 0x449e1988, 0xeec7bcef, 0x6594512f, 0xd0e063fe, 0x5bb38e3e, 0xf1ea2b59, 0x7ab9c699, +0xf34cb424, 0x781f59e4, 0xd246fc83, 0x59151143, 0x60ae3834, 0xebfdd5f4, 0x41a47093, 0xcaf79d53, 0x4302efee, 0xc851022e, 0x6208a749, 0xe95b4a89, 0x5c2f7858, 0xd77c9598, 0x7d2530ff, 0xf676dd3f, 0x7f83af82, 0xf4d04242, 0x5e89e725, 0xd5da0ae5, +0xbb9ecb67, 0x30cd26a7, 0x9a9483c0, 0x11c76e00, 0x98321cbd, 0x1361f17d, 0xb938541a, 0x326bb9da, 0x871f8b0b, 0x0c4c66cb, 0xa615c3ac, 0x2d462e6c, 0xa4b35cd1, 0x2fe0b111, 0x85b91476, 0x0eeaf9b6, 0x3751d0c1, 0xbc023d01, 0x165b9866, 0x9d0875a6, +0x14fd071b, 0x9faeeadb, 0x35f74fbc, 0xbea4a27c, 0x0bd090ad, 0x80837d6d, 0x2adad80a, 0xa18935ca, 0x287c4777, 0xa32faab7, 0x09760fd0, 0x8225e210, 0xc76cc3d9, 0x4c3f2e19, 0xe6668b7e, 0x6d3566be, 0xe4c01403, 0x6f93f9c3, 0xc5ca5ca4, 0x4e99b164, +0xfbed83b5, 0x70be6e75, 0xdae7cb12, 0x51b426d2, 0xd841546f, 0x5312b9af, 0xf94b1cc8, 0x7218f108, 0x4ba3d87f, 0xc0f035bf, 0x6aa990d8, 0xe1fa7d18, 0x680f0fa5, 0xe35ce265, 0x49054702, 0xc256aac2, 0x77229813, 0xfc7175d3, 0x5628d0b4, 0xdd7b3d74, +0x548e4fc9, 0xdfdda209, 0x7584076e, 0xfed7eaae, 0x90932b2c, 0x1bc0c6ec, 0xb199638b, 0x3aca8e4b, 0xb33ffcf6, 0x386c1136, 0x9235b451, 0x19665991, 0xac126b40, 0x27418680, 0x8d1823e7, 0x064bce27, 0x8fbebc9a, 0x04ed515a, 0xaeb4f43d, 0x25e719fd, +0x1c5c308a, 0x970fdd4a, 0x3d56782d, 0xb60595ed, 0x3ff0e750, 0xb4a30a90, 0x1efaaff7, 0x95a94237, 0x20dd70e6, 0xab8e9d26, 0x01d73841, 0x8a84d581, 0x0371a73c, 0x88224afc, 0x227bef9b, 0xa928025b, 0x2b0de04b, 0xa05e0d8b, 0x0a07a8ec, 0x8154452c, +0x08a13791, 0x83f2da51, 0x29ab7f36, 0xa2f892f6, 0x178ca027, 0x9cdf4de7, 0x3686e880, 0xbdd50540, 0x342077fd, 0xbf739a3d, 0x152a3f5a, 0x9e79d29a, 0xa7c2fbed, 0x2c91162d, 0x86c8b34a, 0x0d9b5e8a, 0x846e2c37, 0x0f3dc1f7, 0xa5646490, 0x2e378950, +0x9b43bb81, 0x10105641, 0xba49f326, 0x311a1ee6, 0xb8ef6c5b, 0x33bc819b, 0x99e524fc, 0x12b6c93c, 0x7cf208be, 0xf7a1e57e, 0x5df84019, 0xd6abadd9, 0x5f5edf64, 0xd40d32a4, 0x7e5497c3, 0xf5077a03, 0x407348d2, 0xcb20a512, 0x61790075, 0xea2aedb5, +0x63df9f08, 0xe88c72c8, 0x42d5d7af, 0xc9863a6f, 0xf03d1318, 0x7b6efed8, 0xd1375bbf, 0x5a64b67f, 0xd391c4c2, 0x58c22902, 0xf29b8c65, 0x79c861a5, 0xccbc5374, 0x47efbeb4, 0xedb61bd3, 0x66e5f613, 0xef1084ae, 0x6443696e, 0xce1acc09, 0x454921c9, +0x00000000, 0x41fdecfd, 0xecf0f516, 0xad0d19eb, 0x5edeb571, 0x1f23598c, 0xb22e4067, 0xf3d3ac9a, 0x693bb9b8, 0x28c65545, 0x85cb4cae, 0xc436a053, 0x37e50cc9, 0x7618e034, 0xdb15f9df, 0x9ae81522, 0x2452ae7d, 0x65af4280, 0xc8a25b6b, 0x895fb796, +0x7a8c1b0c, 0x3b71f7f1, 0x967cee1a, 0xd78102e7, 0x4d6917c5, 0x0c94fb38, 0xa199e2d3, 0xe0640e2e, 0x13b7a2b4, 0x524a4e49, 0xff4757a2, 0xbebabb5f, 0x75e4da0d, 0x341936f0, 0x99142f1b, 0xd8e9c3e6, 0x2b3a6f7c, 0x6ac78381, 0xc7ca9a6a, 0x86377697, +0x1cdf63b5, 0x5d228f48, 0xf02f96a3, 0xb1d27a5e, 0x4201d6c4, 0x03fc3a39, 0xaef123d2, 0xef0ccf2f, 0x51b67470, 0x104b988d, 0xbd468166, 0xfcbb6d9b, 0x0f68c101, 0x4e952dfc, 0xe3983417, 0xa265d8ea, 0x388dcdc8, 0x79702135, 0xd47d38de, 0x9580d423, +0x665378b9, 0x27ae9444, 0x8aa38daf, 0xcb5e6152, 0x1a6404d3, 0x5b99e82e, 0xf694f1c5, 0xb7691d38, 0x44bab1a2, 0x05475d5f, 0xa84a44b4, 0xe9b7a849, 0x735fbd6b, 0x32a25196, 0x9faf487d, 0xde52a480, 0x2d81081a, 0x6c7ce4e7, 0xc171fd0c, 0x808c11f1, +0x3e36aaae, 0x7fcb4653, 0xd2c65fb8, 0x933bb345, 0x60e81fdf, 0x2115f322, 0x8c18eac9, 0xcde50634, 0x570d1316, 0x16f0ffeb, 0xbbfde600, 0xfa000afd, 0x09d3a667, 0x482e4a9a, 0xe5235371, 0xa4debf8c, 0x6f80dede, 0x2e7d3223, 0x83702bc8, 0xc28dc735, +0x315e6baf, 0x70a38752, 0xddae9eb9, 0x9c537244, 0x06bb6766, 0x47468b9b, 0xea4b9270, 0xabb67e8d, 0x5865d217, 0x19983eea, 0xb4952701, 0xf568cbfc, 0x4bd270a3, 0x0a2f9c5e, 0xa72285b5, 0xe6df6948, 0x150cc5d2, 0x54f1292f, 0xf9fc30c4, 0xb801dc39, +0x22e9c91b, 0x631425e6, 0xce193c0d, 0x8fe4d0f0, 0x7c377c6a, 0x3dca9097, 0x90c7897c, 0xd13a6581, 0x2c6212cb, 0x6d9ffe36, 0xc092e7dd, 0x816f0b20, 0x72bca7ba, 0x33414b47, 0x9e4c52ac, 0xdfb1be51, 0x4559ab73, 0x04a4478e, 0xa9a95e65, 0xe854b298, +0x1b871e02, 0x5a7af2ff, 0xf777eb14, 0xb68a07e9, 0x0830bcb6, 0x49cd504b, 0xe4c049a0, 0xa53da55d, 0x56ee09c7, 0x1713e53a, 0xba1efcd1, 0xfbe3102c, 0x610b050e, 0x20f6e9f3, 0x8dfbf018, 0xcc061ce5, 0x3fd5b07f, 0x7e285c82, 0xd3254569, 0x92d8a994, +0x5986c8c6, 0x187b243b, 0xb5763dd0, 0xf48bd12d, 0x07587db7, 0x46a5914a, 0xeba888a1, 0xaa55645c, 0x30bd717e, 0x71409d83, 0xdc4d8468, 0x9db06895, 0x6e63c40f, 0x2f9e28f2, 0x82933119, 0xc36edde4, 0x7dd466bb, 0x3c298a46, 0x912493ad, 0xd0d97f50, +0x230ad3ca, 0x62f73f37, 0xcffa26dc, 0x8e07ca21, 0x14efdf03, 0x551233fe, 0xf81f2a15, 0xb9e2c6e8, 0x4a316a72, 0x0bcc868f, 0xa6c19f64, 0xe73c7399, 0x36061618, 0x77fbfae5, 0xdaf6e30e, 0x9b0b0ff3, 0x68d8a369, 0x29254f94, 0x8428567f, 0xc5d5ba82, +0x5f3dafa0, 0x1ec0435d, 0xb3cd5ab6, 0xf230b64b, 0x01e31ad1, 0x401ef62c, 0xed13efc7, 0xacee033a, 0x1254b865, 0x53a95498, 0xfea44d73, 0xbf59a18e, 0x4c8a0d14, 0x0d77e1e9, 0xa07af802, 0xe18714ff, 0x7b6f01dd, 0x3a92ed20, 0x979ff4cb, 0xd6621836, +0x25b1b4ac, 0x644c5851, 0xc94141ba, 0x88bcad47, 0x43e2cc15, 0x021f20e8, 0xaf123903, 0xeeefd5fe, 0x1d3c7964, 0x5cc19599, 0xf1cc8c72, 0xb031608f, 0x2ad975ad, 0x6b249950, 0xc62980bb, 0x87d46c46, 0x7407c0dc, 0x35fa2c21, 0x98f735ca, 0xd90ad937, +0x67b06268, 0x264d8e95, 0x8b40977e, 0xcabd7b83, 0x396ed719, 0x78933be4, 0xd59e220f, 0x9463cef2, 0x0e8bdbd0, 0x4f76372d, 0xe27b2ec6, 0xa386c23b, 0x50556ea1, 0x11a8825c, 0xbca59bb7, 0xfd58774a, 0x00000000, 0x65b984c5, 0x459dbbf0, 0x20243f35, +0x4f0bc91b, 0x2ab24dde, 0x0a9672eb, 0x6f2ff62e, 0x21a887aa, 0x4411036f, 0x64353c5a, 0x018cb89f, 0x6ea34eb1, 0x0b1aca74, 0x2b3ef541, 0x4e877184, 0x88c38929, 0xed7a0dec, 0xcd5e32d9, 0xa8e7b61c, 0xc7c84032, 0xa271c4f7, 0x8255fbc2, 0xe7ec7f07, +0xa96b0e83, 0xccd28a46, 0xecf6b573, 0x894f31b6, 0xe660c798, 0x83d9435d, 0xa3fd7c68, 0xc644f8ad, 0xe5a78982, 0x801e0d47, 0xa03a3272, 0xc583b6b7, 0xaaac4099, 0xcf15c45c, 0xef31fb69, 0x8a887fac, 0xc40f0e28, 0xa1b68aed, 0x8192b5d8, 0xe42b311d, +0x8b04c733, 0xeebd43f6, 0xce997cc3, 0xab20f806, 0x6d6400ab, 0x08dd846e, 0x28f9bb5b, 0x4d403f9e, 0x226fc9b0, 0x47d64d75, 0x67f27240, 0x024bf685, 0x4ccc8701, 0x297503c4, 0x09513cf1, 0x6ce8b834, 0x03c74e1a, 0x667ecadf, 0x465af5ea, 0x23e3712f, +0x8ac86a2f, 0xef71eeea, 0xcf55d1df, 0xaaec551a, 0xc5c3a334, 0xa07a27f1, 0x805e18c4, 0xe5e79c01, 0xab60ed85, 0xced96940, 0xeefd5675, 0x8b44d2b0, 0xe46b249e, 0x81d2a05b, 0xa1f69f6e, 0xc44f1bab, 0x020be306, 0x67b267c3, 0x479658f6, 0x222fdc33, +0x4d002a1d, 0x28b9aed8, 0x089d91ed, 0x6d241528, 0x23a364ac, 0x461ae069, 0x663edf5c, 0x03875b99, 0x6ca8adb7, 0x09112972, 0x29351647, 0x4c8c9282, 0x6f6fe3ad, 0x0ad66768, 0x2af2585d, 0x4f4bdc98, 0x20642ab6, 0x45ddae73, 0x65f99146, 0x00401583, +0x4ec76407, 0x2b7ee0c2, 0x0b5adff7, 0x6ee35b32, 0x01ccad1c, 0x647529d9, 0x445116ec, 0x21e89229, 0xe7ac6a84, 0x8215ee41, 0xa231d174, 0xc78855b1, 0xa8a7a39f, 0xcd1e275a, 0xed3a186f, 0x88839caa, 0xc604ed2e, 0xa3bd69eb, 0x839956de, 0xe620d21b, +0x890f2435, 0xecb6a0f0, 0xcc929fc5, 0xa92b1b00, 0xa54c0ddd, 0xc0f58918, 0xe0d1b62d, 0x856832e8, 0xea47c4c6, 0x8ffe4003, 0xafda7f36, 0xca63fbf3, 0x84e48a77, 0xe15d0eb2, 0xc1793187, 0xa4c0b542, 0xcbef436c, 0xae56c7a9, 0x8e72f89c, 0xebcb7c59, +0x2d8f84f4, 0x48360031, 0x68123f04, 0x0dabbbc1, 0x62844def, 0x073dc92a, 0x2719f61f, 0x42a072da, 0x0c27035e, 0x699e879b, 0x49bab8ae, 0x2c033c6b, 0x432cca45, 0x26954e80, 0x06b171b5, 0x6308f570, 0x40eb845f, 0x2552009a, 0x05763faf, 0x60cfbb6a, +0x0fe04d44, 0x6a59c981, 0x4a7df6b4, 0x2fc47271, 0x614303f5, 0x04fa8730, 0x24deb805, 0x41673cc0, 0x2e48caee, 0x4bf14e2b, 0x6bd5711e, 0x0e6cf5db, 0xc8280d76, 0xad9189b3, 0x8db5b686, 0xe80c3243, 0x8723c46d, 0xe29a40a8, 0xc2be7f9d, 0xa707fb58, +0xe9808adc, 0x8c390e19, 0xac1d312c, 0xc9a4b5e9, 0xa68b43c7, 0xc332c702, 0xe316f837, 0x86af7cf2, 0x2f8467f2, 0x4a3de337, 0x6a19dc02, 0x0fa058c7, 0x608faee9, 0x05362a2c, 0x25121519, 0x40ab91dc, 0x0e2ce058, 0x6b95649d, 0x4bb15ba8, 0x2e08df6d, +0x41272943, 0x249ead86, 0x04ba92b3, 0x61031676, 0xa747eedb, 0xc2fe6a1e, 0xe2da552b, 0x8763d1ee, 0xe84c27c0, 0x8df5a305, 0xadd19c30, 0xc86818f5, 0x86ef6971, 0xe356edb4, 0xc372d281, 0xa6cb5644, 0xc9e4a06a, 0xac5d24af, 0x8c791b9a, 0xe9c09f5f, +0xca23ee70, 0xaf9a6ab5, 0x8fbe5580, 0xea07d145, 0x8528276b, 0xe091a3ae, 0xc0b59c9b, 0xa50c185e, 0xeb8b69da, 0x8e32ed1f, 0xae16d22a, 0xcbaf56ef, 0xa480a0c1, 0xc1392404, 0xe11d1b31, 0x84a49ff4, 0x42e06759, 0x2759e39c, 0x077ddca9, 0x62c4586c, +0x0debae42, 0x68522a87, 0x487615b2, 0x2dcf9177, 0x6348e0f3, 0x06f16436, 0x26d55b03, 0x436cdfc6, 0x2c4329e8, 0x49faad2d, 0x69de9218, 0x0c6716dd, 0x00000000, 0x19a0c579, 0xb0a971b6, 0xa909b4cf, 0x595ce22d, 0x40fc2754, 0xe9f5939b, 0xf05556e2, +0x7f618e15, 0x66c14b6c, 0xcfc8ffa3, 0xd6683ada, 0x263d6c38, 0x3f9da941, 0x96941d8e, 0x8f34d8f7, 0xa34c9bf5, 0xbaec5e8c, 0x13e5ea43, 0x0a452f3a, 0xfa1079d8, 0xe3b0bca1, 0x4ab9086e, 0x5319cd17, 0xdc2d15e0, 0xc58dd099, 0x6c846456, 0x7524a12f, +0x8571f7cd, 0x9cd132b4, 0x35d8867b, 0x2c784302, 0xdd8cae64, 0xc42c6b1d, 0x6d25dfd2, 0x74851aab, 0x84d04c49, 0x9d708930, 0x34793dff, 0x2dd9f886, 0xa2ed2071, 0xbb4de508, 0x124451c7, 0x0be494be, 0xfbb1c25c, 0xe2110725, 0x4b18b3ea, 0x52b87693, +0x7ec03591, 0x6760f0e8, 0xce694427, 0xd7c9815e, 0x279cd7bc, 0x3e3c12c5, 0x9735a60a, 0x8e956373, 0x01a1bb84, 0x18017efd, 0xb108ca32, 0xa8a80f4b, 0x58fd59a9, 0x415d9cd0, 0xe854281f, 0xf1f4ed66, 0xd9098073, 0xc0a9450a, 0x69a0f1c5, 0x700034bc, +0x8055625e, 0x99f5a727, 0x30fc13e8, 0x295cd691, 0xa6680e66, 0xbfc8cb1f, 0x16c17fd0, 0x0f61baa9, 0xff34ec4b, 0xe6942932, 0x4f9d9dfd, 0x563d5884, 0x7a451b86, 0x63e5deff, 0xcaec6a30, 0xd34caf49, 0x2319f9ab, 0x3ab93cd2, 0x93b0881d, 0x8a104d64, +0x05249593, 0x1c8450ea, 0xb58de425, 0xac2d215c, 0x5c7877be, 0x45d8b2c7, 0xecd10608, 0xf571c371, 0x04852e17, 0x1d25eb6e, 0xb42c5fa1, 0xad8c9ad8, 0x5dd9cc3a, 0x44790943, 0xed70bd8c, 0xf4d078f5, 0x7be4a002, 0x6244657b, 0xcb4dd1b4, 0xd2ed14cd, +0x22b8422f, 0x3b188756, 0x92113399, 0x8bb1f6e0, 0xa7c9b5e2, 0xbe69709b, 0x1760c454, 0x0ec0012d, 0xfe9557cf, 0xe73592b6, 0x4e3c2679, 0x579ce300, 0xd8a83bf7, 0xc108fe8e, 0x68014a41, 0x71a18f38, 0x81f4d9da, 0x98541ca3, 0x315da86c, 0x28fd6d15, +0xf0448052, 0xe9e4452b, 0x40edf1e4, 0x594d349d, 0xa918627f, 0xb0b8a706, 0x19b113c9, 0x0011d6b0, 0x8f250e47, 0x9685cb3e, 0x3f8c7ff1, 0x262cba88, 0xd679ec6a, 0xcfd92913, 0x66d09ddc, 0x7f7058a5, 0x53081ba7, 0x4aa8dede, 0xe3a16a11, 0xfa01af68, +0x0a54f98a, 0x13f43cf3, 0xbafd883c, 0xa35d4d45, 0x2c6995b2, 0x35c950cb, 0x9cc0e404, 0x8560217d, 0x7535779f, 0x6c95b2e6, 0xc59c0629, 0xdc3cc350, 0x2dc82e36, 0x3468eb4f, 0x9d615f80, 0x84c19af9, 0x7494cc1b, 0x6d340962, 0xc43dbdad, 0xdd9d78d4, +0x52a9a023, 0x4b09655a, 0xe200d195, 0xfba014ec, 0x0bf5420e, 0x12558777, 0xbb5c33b8, 0xa2fcf6c1, 0x8e84b5c3, 0x972470ba, 0x3e2dc475, 0x278d010c, 0xd7d857ee, 0xce789297, 0x67712658, 0x7ed1e321, 0xf1e53bd6, 0xe845feaf, 0x414c4a60, 0x58ec8f19, +0xa8b9d9fb, 0xb1191c82, 0x1810a84d, 0x01b06d34, 0x294d0021, 0x30edc558, 0x99e47197, 0x8044b4ee, 0x7011e20c, 0x69b12775, 0xc0b893ba, 0xd91856c3, 0x562c8e34, 0x4f8c4b4d, 0xe685ff82, 0xff253afb, 0x0f706c19, 0x16d0a960, 0xbfd91daf, 0xa679d8d6, +0x8a019bd4, 0x93a15ead, 0x3aa8ea62, 0x23082f1b, 0xd35d79f9, 0xcafdbc80, 0x63f4084f, 0x7a54cd36, 0xf56015c1, 0xecc0d0b8, 0x45c96477, 0x5c69a10e, 0xac3cf7ec, 0xb59c3295, 0x1c95865a, 0x05354323, 0xf4c1ae45, 0xed616b3c, 0x4468dff3, 0x5dc81a8a, +0xad9d4c68, 0xb43d8911, 0x1d343dde, 0x0494f8a7, 0x8ba02050, 0x9200e529, 0x3b0951e6, 0x22a9949f, 0xd2fcc27d, 0xcb5c0704, 0x6255b3cb, 0x7bf576b2, 0x578d35b0, 0x4e2df0c9, 0xe7244406, 0xfe84817f, 0x0ed1d79d, 0x177112e4, 0xbe78a62b, 0xa7d86352, +0x28ecbba5, 0x314c7edc, 0x9845ca13, 0x81e50f6a, 0x71b05988, 0x68109cf1, 0xc119283e, 0xd8b9ed47, 0x00000000, 0x1a1a33d2, 0x800e5c06, 0x9a146fd4, 0x578bdc1a, 0x4d91efc8, 0xd785801c, 0xcd9fb3ce, 0x30f24342, 0x2ae87090, 0xb0fc1f44, 0xaae62c96, +0x67799f58, 0x7d63ac8a, 0xe777c35e, 0xfd6df08c, 0xe87ec47a, 0xf264f7a8, 0x6870987c, 0x726aabae, 0xbff51860, 0xa5ef2bb2, 0x3ffb4466, 0x25e177b4, 0xd88c8738, 0xc296b4ea, 0x5882db3e, 0x4298e8ec, 0x8f075b22, 0x951d68f0, 0x0f090724, 0x151334f6, +0x68e9f4fe, 0x72f3c72c, 0xe8e7a8f8, 0xf2fd9b2a, 0x3f6228e4, 0x25781b36, 0xbf6c74e2, 0xa5764730, 0x581bb7bc, 0x4201846e, 0xd815ebba, 0xc20fd868, 0x0f906ba6, 0x158a5874, 0x8f9e37a0, 0x95840472, 0x80973084, 0x9a8d0356, 0x00996c82, 0x1a835f50, +0xd71cec9e, 0xcd06df4c, 0x5712b098, 0x4d08834a, 0xb06573c6, 0xaa7f4014, 0x306b2fc0, 0x2a711c12, 0xe7eeafdc, 0xfdf49c0e, 0x67e0f3da, 0x7dfac008, 0xc7e6d018, 0xddfce3ca, 0x47e88c1e, 0x5df2bfcc, 0x906d0c02, 0x8a773fd0, 0x10635004, 0x0a7963d6, +0xf714935a, 0xed0ea088, 0x771acf5c, 0x6d00fc8e, 0xa09f4f40, 0xba857c92, 0x20911346, 0x3a8b2094, 0x2f981462, 0x358227b0, 0xaf964864, 0xb58c7bb6, 0x7813c878, 0x6209fbaa, 0xf81d947e, 0xe207a7ac, 0x1f6a5720, 0x057064f2, 0x9f640b26, 0x857e38f4, +0x48e18b3a, 0x52fbb8e8, 0xc8efd73c, 0xd2f5e4ee, 0xaf0f24e6, 0xb5151734, 0x2f0178e0, 0x351b4b32, 0xf884f8fc, 0xe29ecb2e, 0x788aa4fa, 0x62909728, 0x9ffd67a4, 0x85e75476, 0x1ff33ba2, 0x05e90870, 0xc876bbbe, 0xd26c886c, 0x4878e7b8, 0x5262d46a, +0x4771e09c, 0x5d6bd34e, 0xc77fbc9a, 0xdd658f48, 0x10fa3c86, 0x0ae00f54, 0x90f46080, 0x8aee5352, 0x7783a3de, 0x6d99900c, 0xf78dffd8, 0xed97cc0a, 0x20087fc4, 0x3a124c16, 0xa00623c2, 0xba1c1010, 0x323b9e6a, 0x2821adb8, 0xb235c26c, 0xa82ff1be, +0x65b04270, 0x7faa71a2, 0xe5be1e76, 0xffa42da4, 0x02c9dd28, 0x18d3eefa, 0x82c7812e, 0x98ddb2fc, 0x55420132, 0x4f5832e0, 0xd54c5d34, 0xcf566ee6, 0xda455a10, 0xc05f69c2, 0x5a4b0616, 0x405135c4, 0x8dce860a, 0x97d4b5d8, 0x0dc0da0c, 0x17dae9de, +0xeab71952, 0xf0ad2a80, 0x6ab94554, 0x70a37686, 0xbd3cc548, 0xa726f69a, 0x3d32994e, 0x2728aa9c, 0x5ad26a94, 0x40c85946, 0xdadc3692, 0xc0c60540, 0x0d59b68e, 0x1743855c, 0x8d57ea88, 0x974dd95a, 0x6a2029d6, 0x703a1a04, 0xea2e75d0, 0xf0344602, +0x3dabf5cc, 0x27b1c61e, 0xbda5a9ca, 0xa7bf9a18, 0xb2acaeee, 0xa8b69d3c, 0x32a2f2e8, 0x28b8c13a, 0xe52772f4, 0xff3d4126, 0x65292ef2, 0x7f331d20, 0x825eedac, 0x9844de7e, 0x0250b1aa, 0x184a8278, 0xd5d531b6, 0xcfcf0264, 0x55db6db0, 0x4fc15e62, +0xf5dd4e72, 0xefc77da0, 0x75d31274, 0x6fc921a6, 0xa2569268, 0xb84ca1ba, 0x2258ce6e, 0x3842fdbc, 0xc52f0d30, 0xdf353ee2, 0x45215136, 0x5f3b62e4, 0x92a4d12a, 0x88bee2f8, 0x12aa8d2c, 0x08b0befe, 0x1da38a08, 0x07b9b9da, 0x9dadd60e, 0x87b7e5dc, +0x4a285612, 0x503265c0, 0xca260a14, 0xd03c39c6, 0x2d51c94a, 0x374bfa98, 0xad5f954c, 0xb745a69e, 0x7ada1550, 0x60c02682, 0xfad44956, 0xe0ce7a84, 0x9d34ba8c, 0x872e895e, 0x1d3ae68a, 0x0720d558, 0xcabf6696, 0xd0a55544, 0x4ab13a90, 0x50ab0942, +0xadc6f9ce, 0xb7dcca1c, 0x2dc8a5c8, 0x37d2961a, 0xfa4d25d4, 0xe0571606, 0x7a4379d2, 0x60594a00, 0x754a7ef6, 0x6f504d24, 0xf54422f0, 0xef5e1122, 0x22c1a2ec, 0x38db913e, 0xa2cffeea, 0xb8d5cd38, 0x45b83db4, 0x5fa20e66, 0xc5b661b2, 0xdfac5260, +0x1233e1ae, 0x0829d27c, 0x923dbda8, 0x88278e7a, 0x00000000, 0x786aefa4, 0xadc3af52, 0xd5a940f6, 0xe5517942, 0x9d3b96e6, 0x4892d610, 0x30f839b4, 0xaaf874f2, 0xd2929b56, 0x073bdba0, 0x7f513404, 0x4fa90db0, 0x37c3e214, 0xe26aa2e2, 0x9a004d46, +0x7d59acd6, 0x05334372, 0xd09a0384, 0xa8f0ec20, 0x9808d594, 0xe0623a30, 0x35cb7ac6, 0x4da19562, 0xd7a1d824, 0xafcb3780, 0x7a627776, 0x020898d2, 0x32f0a166, 0x4a9a4ec2, 0x9f330e34, 0xe759e190, 0x8afa023e, 0xf290ed9a, 0x2739ad6c, 0x5f5342c8, +0x6fab7b7c, 0x17c194d8, 0xc268d42e, 0xba023b8a, 0x200276cc, 0x58689968, 0x8dc1d99e, 0xf5ab363a, 0xc5530f8e, 0xbd39e02a, 0x6890a0dc, 0x10fa4f78, 0xf7a3aee8, 0x8fc9414c, 0x5a6001ba, 0x220aee1e, 0x12f2d7aa, 0x6a98380e, 0xbf3178f8, 0xc75b975c, +0x5d5bda1a, 0x253135be, 0xf0987548, 0x88f29aec, 0xb80aa358, 0xc0604cfc, 0x15c90c0a, 0x6da3e3ae, 0xca7c86ca, 0xb216696e, 0x67bf2998, 0x1fd5c63c, 0x2f2dff88, 0x5747102c, 0x82ee50da, 0xfa84bf7e, 0x6084f238, 0x18ee1d9c, 0xcd475d6a, 0xb52db2ce, +0x85d58b7a, 0xfdbf64de, 0x28162428, 0x507ccb8c, 0xb7252a1c, 0xcf4fc5b8, 0x1ae6854e, 0x628c6aea, 0x5274535e, 0x2a1ebcfa, 0xffb7fc0c, 0x87dd13a8, 0x1ddd5eee, 0x65b7b14a, 0xb01ef1bc, 0xc8741e18, 0xf88c27ac, 0x80e6c808, 0x554f88fe, 0x2d25675a, +0x408684f4, 0x38ec6b50, 0xed452ba6, 0x952fc402, 0xa5d7fdb6, 0xddbd1212, 0x081452e4, 0x707ebd40, 0xea7ef006, 0x92141fa2, 0x47bd5f54, 0x3fd7b0f0, 0x0f2f8944, 0x774566e0, 0xa2ec2616, 0xda86c9b2, 0x3ddf2822, 0x45b5c786, 0x901c8770, 0xe87668d4, +0xd88e5160, 0xa0e4bec4, 0x754dfe32, 0x0d271196, 0x97275cd0, 0xef4db374, 0x3ae4f382, 0x428e1c26, 0x72762592, 0x0a1cca36, 0xdfb58ac0, 0xa7df6564, 0x7dab00dc, 0x05c1ef78, 0xd068af8e, 0xa802402a, 0x98fa799e, 0xe090963a, 0x3539d6cc, 0x4d533968, +0xd753742e, 0xaf399b8a, 0x7a90db7c, 0x02fa34d8, 0x32020d6c, 0x4a68e2c8, 0x9fc1a23e, 0xe7ab4d9a, 0x00f2ac0a, 0x789843ae, 0xad310358, 0xd55becfc, 0xe5a3d548, 0x9dc93aec, 0x48607a1a, 0x300a95be, 0xaa0ad8f8, 0xd260375c, 0x07c977aa, 0x7fa3980e, +0x4f5ba1ba, 0x37314e1e, 0xe2980ee8, 0x9af2e14c, 0xf75102e2, 0x8f3bed46, 0x5a92adb0, 0x22f84214, 0x12007ba0, 0x6a6a9404, 0xbfc3d4f2, 0xc7a93b56, 0x5da97610, 0x25c399b4, 0xf06ad942, 0x880036e6, 0xb8f80f52, 0xc092e0f6, 0x153ba000, 0x6d514fa4, +0x8a08ae34, 0xf2624190, 0x27cb0166, 0x5fa1eec2, 0x6f59d776, 0x173338d2, 0xc29a7824, 0xbaf09780, 0x20f0dac6, 0x589a3562, 0x8d337594, 0xf5599a30, 0xc5a1a384, 0xbdcb4c20, 0x68620cd6, 0x1008e372, 0xb7d78616, 0xcfbd69b2, 0x1a142944, 0x627ec6e0, +0x5286ff54, 0x2aec10f0, 0xff455006, 0x872fbfa2, 0x1d2ff2e4, 0x65451d40, 0xb0ec5db6, 0xc886b212, 0xf87e8ba6, 0x80146402, 0x55bd24f4, 0x2dd7cb50, 0xca8e2ac0, 0xb2e4c564, 0x674d8592, 0x1f276a36, 0x2fdf5382, 0x57b5bc26, 0x821cfcd0, 0xfa761374, +0x60765e32, 0x181cb196, 0xcdb5f160, 0xb5df1ec4, 0x85272770, 0xfd4dc8d4, 0x28e48822, 0x508e6786, 0x3d2d8428, 0x45476b8c, 0x90ee2b7a, 0xe884c4de, 0xd87cfd6a, 0xa01612ce, 0x75bf5238, 0x0dd5bd9c, 0x97d5f0da, 0xefbf1f7e, 0x3a165f88, 0x427cb02c, +0x72848998, 0x0aee663c, 0xdf4726ca, 0xa72dc96e, 0x407428fe, 0x381ec75a, 0xedb787ac, 0x95dd6808, 0xa52551bc, 0xdd4fbe18, 0x08e6feee, 0x708c114a, 0xea8c5c0c, 0x92e6b3a8, 0x474ff35e, 0x3f251cfa, 0x0fdd254e, 0x77b7caea, 0xa21e8a1c, 0xda7465b8, +0x00000000, 0xdab4d636, 0x48c99c6f, 0x927d4a59, 0x67584cc2, 0xbdec9af4, 0x2f91d0ad, 0xf525069b, 0xb94093f4, 0x63f445c2, 0xf1890f9b, 0x2b3dd9ad, 0xde18df36, 0x04ac0900, 0x96d14359, 0x4c65956f, 0x15cde235, 0xcf793403, 0x5d047e5a, 0x87b0a86c, +0x7295aef7, 0xa82178c1, 0x3a5c3298, 0xe0e8e4ae, 0xac8d71c1, 0x7639a7f7, 0xe444edae, 0x3ef03b98, 0xcbd53d03, 0x1161eb35, 0x831ca16c, 0x59a8775a, 0x5ee83335, 0x845ce503, 0x1621af5a, 0xcc95796c, 0x39b07ff7, 0xe304a9c1, 0x7179e398, 0xabcd35ae, +0xe7a8a0c1, 0x3d1c76f7, 0xaf613cae, 0x75d5ea98, 0x80f0ec03, 0x5a443a35, 0xc839706c, 0x128da65a, 0x4b25d100, 0x91910736, 0x03ec4d6f, 0xd9589b59, 0x2c7d9dc2, 0xf6c94bf4, 0x64b401ad, 0xbe00d79b, 0xf26542f4, 0x28d194c2, 0xbaacde9b, 0x601808ad, +0x953d0e36, 0x4f89d800, 0xddf49259, 0x0740446f, 0x31b3110c, 0xeb07c73a, 0x797a8d63, 0xa3ce5b55, 0x56eb5dce, 0x8c5f8bf8, 0x1e22c1a1, 0xc4961797, 0x88f382f8, 0x524754ce, 0xc03a1e97, 0x1a8ec8a1, 0xefabce3a, 0x351f180c, 0xa7625255, 0x7dd68463, +0x247ef339, 0xfeca250f, 0x6cb76f56, 0xb603b960, 0x4326bffb, 0x999269cd, 0x0bef2394, 0xd15bf5a2, 0x9d3e60cd, 0x478ab6fb, 0xd5f7fca2, 0x0f432a94, 0xfa662c0f, 0x20d2fa39, 0xb2afb060, 0x681b6656, 0x6f5b2239, 0xb5eff40f, 0x2792be56, 0xfd266860, +0x08036efb, 0xd2b7b8cd, 0x40caf294, 0x9a7e24a2, 0xd61bb1cd, 0x0caf67fb, 0x9ed22da2, 0x4466fb94, 0xb143fd0f, 0x6bf72b39, 0xf98a6160, 0x233eb756, 0x7a96c00c, 0xa022163a, 0x325f5c63, 0xe8eb8a55, 0x1dce8cce, 0xc77a5af8, 0x550710a1, 0x8fb3c697, +0xc3d653f8, 0x196285ce, 0x8b1fcf97, 0x51ab19a1, 0xa48e1f3a, 0x7e3ac90c, 0xec478355, 0x36f35563, 0xf19bdf65, 0x2b2f0953, 0xb952430a, 0x63e6953c, 0x96c393a7, 0x4c774591, 0xde0a0fc8, 0x04bed9fe, 0x48db4c91, 0x926f9aa7, 0x0012d0fe, 0xdaa606c8, +0x2f830053, 0xf537d665, 0x674a9c3c, 0xbdfe4a0a, 0xe4563d50, 0x3ee2eb66, 0xac9fa13f, 0x762b7709, 0x830e7192, 0x59baa7a4, 0xcbc7edfd, 0x11733bcb, 0x5d16aea4, 0x87a27892, 0x15df32cb, 0xcf6be4fd, 0x3a4ee266, 0xe0fa3450, 0x72877e09, 0xa833a83f, +0xaf73ec50, 0x75c73a66, 0xe7ba703f, 0x3d0ea609, 0xc82ba092, 0x129f76a4, 0x80e23cfd, 0x5a56eacb, 0x16337fa4, 0xcc87a992, 0x5efae3cb, 0x844e35fd, 0x716b3366, 0xabdfe550, 0x39a2af09, 0xe316793f, 0xbabe0e65, 0x600ad853, 0xf277920a, 0x28c3443c, +0xdde642a7, 0x07529491, 0x952fdec8, 0x4f9b08fe, 0x03fe9d91, 0xd94a4ba7, 0x4b3701fe, 0x9183d7c8, 0x64a6d153, 0xbe120765, 0x2c6f4d3c, 0xf6db9b0a, 0xc028ce69, 0x1a9c185f, 0x88e15206, 0x52558430, 0xa77082ab, 0x7dc4549d, 0xefb91ec4, 0x350dc8f2, +0x79685d9d, 0xa3dc8bab, 0x31a1c1f2, 0xeb1517c4, 0x1e30115f, 0xc484c769, 0x56f98d30, 0x8c4d5b06, 0xd5e52c5c, 0x0f51fa6a, 0x9d2cb033, 0x47986605, 0xb2bd609e, 0x6809b6a8, 0xfa74fcf1, 0x20c02ac7, 0x6ca5bfa8, 0xb611699e, 0x246c23c7, 0xfed8f5f1, +0x0bfdf36a, 0xd149255c, 0x43346f05, 0x9980b933, 0x9ec0fd5c, 0x44742b6a, 0xd6096133, 0x0cbdb705, 0xf998b19e, 0x232c67a8, 0xb1512df1, 0x6be5fbc7, 0x27806ea8, 0xfd34b89e, 0x6f49f2c7, 0xb5fd24f1, 0x40d8226a, 0x9a6cf45c, 0x0811be05, 0xd2a56833, +0x8b0d1f69, 0x51b9c95f, 0xc3c48306, 0x19705530, 0xec5553ab, 0x36e1859d, 0xa49ccfc4, 0x7e2819f2, 0x324d8c9d, 0xe8f95aab, 0x7a8410f2, 0xa030c6c4, 0x5515c05f, 0x8fa11669, 0x1ddc5c30, 0xc7688a06, ] + +d0x6a08f170=[ 0xa18021a1, 0x817b8d8c, 0x0e1c16f0, 0x544c412e, 0x622fca64, 0x96ccfb84, 0x7b84aa9c, 0x9ff456e2, 0x5cddbc69, 0x7b02abd2, 0x26f046d4, 0x63869a45, 0x964afaca, 0x5a5057de, 0x17317746, 0xcc1aad14, 0xc206bbe4, 0x64a221d3, 0x81fd8cc2, 0xf4e331e0, +0xa70dca16, 0xbe20aba0, 0xfddb9c86, 0xb9821178, 0xe3d246a6, 0xdda631e5, 0x6b176702, 0x20fbac2d, 0x28ec5024, 0xa10620ef, 0x5df2ed06, 0x31c13192, 0xb113ec3f, 0x0e9a17be, 0x36638b4a, 0x387f9dba, 0x30ee60fd, 0x7c261044, 0xdc0f61c4, 0x7431ec4d, +0xc329ea8b, 0xaf9c3751, 0x21d4fd42, 0x0938ad66, 0xf26eda57, 0x3f5b262c, 0x060beaf9, 0xda828a73, 0x55631041, 0x884320ea, 0xe27b1687, 0xa0297180, 0x314730dc, 0xb0babc1e, 0xc280baaa, 0x99ffbc1b, 0x4de721d6, 0xda048b3d, 0x4c4e71f7, 0x1e8fdb6e, +0x54ca4060, 0x6a38366d, 0x1093cd9e, 0x0817fc09, 0xd2137734, 0xe5d9ac5f, 0xfd5d9dc8, 0xaeb3663e, 0x5247abd7, 0x9856ec3a, 0x207dad63, 0x53eefbf6, 0xed485118, 0x01a95021, 0xbf89fb81, 0x2fc8ebb2, 0x2152fc0c, 0x6cb5ddda, 0x43fb3726, 0x9765aba5, +0x91e84012, 0x29c3014b, 0x4576dc91, 0x161e2629, 0x650b71f2, 0x374cda25, 0x44df8cb0, 0x9e5d06c3, 0xb79e0788, 0xebc5baaf, 0xc5220072, 0x5d74ec48, 0xea6cea8e, 0x37cadb6b, 0x52c1aa99, 0x73935695, 0x89ea70cb, 0x5b7f06b1, 0x1f268b4f, 0xd49e9c83, +0x6abe3723, 0x42d46649, 0x16982767, 0x0f33479f, 0xe35447e8, 0x11bc9cf1, 0xfa79265e, 0xeb43bbe1, 0x658d70bc, 0x5ad65690, 0x00000000, 0x731557db, 0xdd2030ab, 0x2f4eeafc, 0x0fb546d1, 0xedce5056, 0xd537cca2, 0x4beccb2f, 0x38f99cf4, 0xbea6aaee, +0xa8b88cc7, 0xfcf4cde9, 0x5bf907ff, 0x98d0ed74, 0x3e747743, 0x8fe19a32, 0xfbd0767f, 0x180230d9, 0x865f361a, 0xb8ad4017, 0xc48b5053, 0x8ececb5d, 0xb82b4159, 0x437d3668, 0x9f7257ac, 0x113a9dbf, 0xd3ba2715, 0xcc9cac5a, 0x1fa08a01, 0xa6a49a37, +0xb9041036, 0xb6b156e7, 0x5368fab8, 0x0891fd47, 0x192d61b6, 0x8f679b7c, 0x4d612098, 0x4cc870b9, 0x7ca0110a, 0x1e09da20, 0x8054dce3, 0xe470fc7e, 0x7d8f4065, 0xd295767a, 0x751ebd22, 0x896c7185, 0xdb2bda52, 0x7598bc6c, 0xfb567731, 0xca1147ed, +0xb63757a9, 0xcdb3fd35, 0x7aabfbf3, 0x90c7117d, 0x916e415c, 0x87706775, 0xc40d511d, 0x44598dfe, 0xa78bcb58, 0x29450005, 0xa997dda8, 0xf54a61c1, 0xa0af70ce, 0xcb3e1682, 0xaf1a361f, 0xf2e8db19, 0x36e58a04, 0x39d6cd9b, 0xec670077, 0x86d93754, +0xae356770, 0xfaff2710, 0x2ee7badd, 0x9979bd55, 0x7d09412b, 0xcbb817cc, 0xd5b1cdec, 0xb03cbd50, 0x90411033, 0x18843197, 0x2676479a, 0xc3afebc5, 0x4ac39a40, 0x07a2bad8, 0x306861b3, 0x0086014e, 0xf3418b38, 0x97e3aaeb, 0x4b6aca61, 0xece10139, +0xa6229b79, 0x09beac28, 0x0724bb96, 0x2e61bb93, 0x63009b0b, 0x286a516a, 0x45f0dddf, 0xa83e8d89, 0x6424209d, 0xb71806c6, 0x6d9a8cb5, 0x068debb7, 0xd33c265b, 0x8e48ca13, 0x19ab60f8, 0xe55fad11, 0x9edb078d, 0xd4189dcd, 0x27df17bb, 0x3fdd2762, +0x6b91664c, 0x87f6663b, 0x275916f5, 0x62a9cb2a, 0xa911dce6, 0x88c521a4, 0x7a2dfabd, 0xf5cc608f, 0x1015ccd0, 0x17b77608, 0xf3c78a76, 0x74b7ed03, 0xcd35fc7b, 0xf46530ae, 0xdbaddb1c, 0x5c5bbd27, 0x72bc07fa, 0x6d1c8dfb, 0x6c33dc94, 0x723a06b4, +0x3950ccd5, 0xe2fd17c9, 0x012f516f, 0xb195ed71, 0x55e5110f, 0x42526707, 0xe4f6fd30, 0x3ef2760d, 0xca9746a3, 0x4a459b0e, 0xdc89608a, 0xeaeaebc0, 0x80d2ddad, 0xfc72cca7, 0xc5a4013c, 0xbf0ffacf, 0xf40b3318, 0x9c883360, 0x391e5769, 0xd2a695ab, +0x43a9ed8e, 0x1edd3ad0, 0xd9cf4888, 0x42c72684, 0x4e67abed, 0xcc7baf7b, 0x32778a4a, 0xcbfbf217, 0x4f406dc1, 0x3fb9cc29, 0xa858226a, 0x84f292f0, 0xb02283fa, 0xec719288, 0xa8112f4c, 0x654d461b, 0xe63f8987, 0x5c531172, 0x45477be8, 0x49aefba7, +0xba2595d3, 0x68830078, 0x26e4ab95, 0x016ecb0a, 0xa2163965, 0xed5654a4, 0x187aa190, 0x0ca08d69, 0xd44803cd, 0x69a4c654, 0xe0d11fe1, 0xb7ebd3b0, 0x5654075b, 0xe7184fab, 0xcd156471, 0xd2ef988d, 0x70f9a1e8, 0x7730f1a2, 0xc7127258, 0x7bd971ed, +0xd4010eeb, 0x43e0e0a8, 0x1e9437f6, 0xb14c48f0, 0xb06b8edc, 0xc75b7f7e, 0x19146a9a, 0x34991c2c, 0xebb8c2c2, 0x323e876c, 0x2164f6f9, 0xf38b6e74, 0x5773c177, 0x50f39c1b, 0x71976ae2, 0x84bb9fd6, 0x3ff0c10f, 0x07805d6c, 0xcadc343b, 0xebf1cfe4, +0x573acc51, 0xafd87f06, 0xf565f812, 0x0b69dd23, 0x2a0d2bda, 0x1833acb6, 0x859c59fa, 0x7afeb7c1, 0x5b9a4138, 0x561d0a7d, 0x63eadd5b, 0x0ce9804f, 0x2caab09a, 0xa5966409, 0x149321df, 0x8fd242f5, 0xed1f5982, 0x7c1021a7, 0xe09812c7, 0x7617378e, +0xea9f04ee, 0xa4f8af03, 0xff2be31d, 0xf2e5a57e, 0xaf917220, 0x0a4e1b0f, 0xead609c8, 0xd98645ae, 0x97a8e365, 0x7b907ccb, 0xb7a2de96, 0x27c36db9, 0x5af48a32, 0xc0922f34, 0xaeb6b40c, 0x5d74d75e, 0x910f7825, 0xf3c26352, 0xd526c8c7, 0x9cc13e46, +0x35beda00, 0x2dc47b90, 0xf8e2b357, 0x48c030ad, 0xa378f26f, 0xf2aca858, 0x3ed70723, 0x0127c62c, 0xc1fce43e, 0xbb0253ff, 0x881b12bf, 0x6e249b38, 0xa936e960, 0x15b4e7f3, 0x2b63e0d0, 0x51d45a37, 0x3e9e0a05, 0x2ce3bdbc, 0xc1b5e918, 0x07c9504a, +0x9b086e0c, 0xba6c98f5, 0xcbb2ff31, 0x9b41632a, 0xf9c5757b, 0x7c592c81, 0x6e6d961e, 0x50ba913d, 0x48893d8b, 0x968f2549, 0xd8a18382, 0x00000000, 0x8ef584d9, 0x4f0960e7, 0x7779fc84, 0x9a66a506, 0x65044b3d, 0x33504c66, 0xa5df692f, 0x4e2ea6cb, +0x212dfbdf, 0x0a071629, 0x71de67c4, 0x49e7f681, 0xf98c785d, 0xdf68d3c8, 0x2d8d76b6, 0x96c6286f, 0xe1bfd4eb, 0xa331ff49, 0x1ffafcfc, 0x62cd1b77, 0x765e3aa8, 0xb10545d6, 0x833bc2ba, 0xaeffb92a, 0xc67cb952, 0xd8e88ea4, 0x26ada6b3, 0x825509b0, +0x85d554dc, 0x450e76ce, 0x13137cb3, 0x646a8037, 0x0dce4663, 0x06ee9666, 0xbc820e93, 0xe751428d, 0xb6cc159c, 0x9daff54c, 0x5bd34c1e, 0x4460bdc4, 0xa97fe446, 0x9061b32f, 0x38709c63, 0x8ebc89ff, 0x0b20d005, 0x6f035d14, 0x1fb3f1da, 0x5abd8714, +0x9028be09, 0x62841651, 0x893cd493, 0x15fdead5, 0xcc32a25d, 0x519d5711, 0x00490d26, 0xd3815387, 0xbdecc599, 0x38399145, 0x135a7195, 0x821c0496, 0xde0618c2, 0x428e2ba2, 0xd3c85ea1, 0xb68518ba, 0x63a3d07d, 0xe1f6d9cd, 0x69edcb72, 0xcd5c6957, +0x7d7eeaad, 0xbccb03b5, 0x6f4a5032, 0xa25f3443, 0x14da2cf9, 0xc0db2212, 0x5c1a1c54, 0x06a79b40, 0xf4423e3e, 0xec389fae, 0x1234ba9f, 0xf8abbe71, 0x8975d9b5, 0x2a4426fc, 0xdf21deee, 0x7d37e78b, 0x278a609f, 0x7ab7bae7, 0x70b0acce, 0xfe452817, +0xca95391d, 0xfe0c2531, 0x200a3df3, 0x35f7d726, 0x8f9b4fd3, 0x127db7b9, 0x9de6f86a, 0x88521f99, 0x9a2fa820, 0x195d67bc, 0x2b2aedf6, 0xa4b1a225, 0xd56fc5e1, 0xe67684a1, 0xc635b474, 0x0d874b45, 0x64238d11, 0xbb4b5ed9, 0x8372cf9c, 0xf52cf534, +0xde4f15e4, 0x91467503, 0xbda5c8bf, 0xff62ee3b, 0x97e1ee43, 0x39575a4f, 0x33194140, 0x5d3dda78, 0x4429b0e2, 0x68ca0d5e, 0x34d0110a, 0x204330d5, 0x2fea01bb, 0x4c71bb12, 0xc21845fe, 0x342c1775, 0x7f5dabcf, 0x0d8633eb, 0x796e9c9c, 0x6f2eb9b9, +0x131823d2, 0x30472179, 0xe7747006, 0xac05ccbc, 0x1bc616ce, 0xd03356d7, 0xc173745a, 0xbd45ee31, 0x2db200e4, 0xe31f460a, 0x273434a7, 0x7d05aa90, 0x4a428c41, 0x91c4de2e, 0x8b31f81b, 0x885ac9bf, 0x046b360c, 0xf36c547c, 0x2ab2074c, 0xb0c3ddda, +0x57b7addc, 0xfeea6797, 0x649bbd01, 0x9b42ea6d, 0x3674162a, 0x18ad276a, 0x122b1329, 0x72db9824, 0x52efab2b, 0xb29bdc85, 0x55efac83, 0x38991465, 0x1418247a, 0xa86efab0, 0x5b02aecc, 0xf00765d8, 0x29d936e8, 0x9a71da96, 0x7a05ad38, 0xfa81519b, +0x055806f7, 0x5e5aa83b, 0xa7b0c804, 0x5a319e37, 0xc89e71bd, 0xdab56294, 0xe22c76f1, 0x4d428be9, 0x3ac1153a, 0x1140228d, 0x46f78f51, 0xc04044a1, 0xfd815633, 0xbf1def6e, 0x429cb95d, 0xba45e999, 0x9d71dd3e, 0x639bbaa9, 0xf25f6487, 0xc67373f2, +0xab05cb14, 0xa2e8cef3, 0x256c35f8, 0x50b7aa74, 0xd3586773, 0x74e8af77, 0x92afef8a, 0x61c3bbf6, 0x28ea0613, 0xbc76deca, 0x0bb504b8, 0xa3dbfe08, 0x16402525, 0xb3a8ec7e, 0x3eaa2336, 0x7b369dc3, 0x81b7cc58, 0x6c45881d, 0xb1f0ed21, 0x2607045c, +0x56849d27, 0xdfed6463, 0x1e9e1039, 0x3f9913cd, 0x8a02c8e0, 0xddb5653c, 0xfbb26160, 0x00000000, 0x71b0a980, 0xb81de8c6, 0x51849a8f, 0x86b7cbf0, 0x96c4d986, 0xaa36fbef, 0x7e6e9b34, 0x1af52635, 0x691d8eea, 0x0fde32b4, 0x8d02cf48, 0x682ebe11, +0xe1474755, 0xf55f632f, 0x8c31ffb3, 0x4b71bcba, 0x332c10dd, 0xd26b5788, 0xefaa451a, 0x4f1a8ab6, 0xe52c7159, 0x3cf22269, 0xa0b0cfac, 0x2c81301f, 0x9c42edc5, 0x85dcfa54, 0xeaf243ed, 0xcead46ee, 0xf7076270, 0xc7404309, 0x54dc9c78, 0x6a76bf4e, +0xbb76d962, 0x0a863443, 0x0258015f, 0x6e1d8942, 0x481a8d1e, 0x9829dbc9, 0x0eed024f, 0x013330fb, 0x459cbef5, 0xa183ff57, 0x08de351c, 0xd56b5020, 0x7c369a6b, 0x245f0503, 0x84efcaaf, 0xb7c3da72, 0xdede5498, 0x939cdf71, 0x53dc9bd0, 0xa683f8ff, +0x9e1aec9a, 0xcf9e7615, 0x6d76b8e6, 0x83efcd07, 0x06333753, 0xc5184256, 0x8e69feec, 0x9f29dc61, 0x321f2026, 0xb59bdb2d, 0x8969f944, 0x73e8a8df, 0x5f6998c0, 0xe07477ae, 0xdb86526f, 0x47c4bfaa, 0x90f7eed5, 0x3dc11292, 0xaf6efd18, 0xee9975e1, +0xa5e8c95b, 0xd6006184, 0xc42b72ad, 0x60f08b0d, 0x177315de, 0xf8d950c4, 0xd9de5330, 0xd45860db, 0xbe2edf95, 0x75db9f8c, 0xc32b7505, 0xf46c53d4, 0x1df5219d, 0xc9ad4146, 0x210703f4, 0x95afe822, 0x351f278e, 0x4e29ba4d, 0x2ed93140, 0x0cb50310, +0xe41f41a2, 0x226c3250, 0xb6f0ea89, 0xd733517f, 0x43af89a6, 0xccf547b1, 0x949cd8d9, 0xebc17316, 0xf634528b, 0x3bf225c1, 0xcbf54019, 0xd8ed63cb, 0x374726d1, 0xae5dcde3, 0x82dcfdfc, 0xffd9576c, 0xa4dbf9a0, 0x991aeb32, 0xb92ed83d, 0x1fad20c2, +0x58699f68, 0xe8aa42b2, 0xf9ea603f, 0xd100662c, 0xcdc6774a, 0xcac670e2, 0xfcb266c8, 0x62a88a52, 0x65a88dfa, 0xa95dca4b, 0x66c3bc5e, 0x8f5ace17, 0x6b458fb5, 0x67f08ca5, 0x10731276, 0x8084fca3, 0x785dac67, 0x41f788f9, 0xecc174be, 0x1cc61166, +0xb4a8ebd6, 0x39aa249e, 0x44af8e0e, 0x97f7e97d, 0x4929bde5, 0x09ed05e7, 0x2034330f, 0x2b8137b7, 0xe9997249, 0x8784fb0b, 0xad36fc47, 0x5c02a964, 0x070007a8, 0x40c4b802, 0x77839ed3, 0xe64740fd, 0x235f02ab, 0x152b1481, 0x199e1791, 0xdc8655c7, +0x5d31999f, 0x595aaf93, 0x76b0ae28, 0x7083997b, 0xedf24445, 0x31741182, 0x036b31a4, 0xf1345523, 0x97c40eed, 0x96d6caf4, 0x26172fc3, 0xe9794659, 0xc9774034, 0xb21c740a, 0xe86b8240, 0x8275cc0f, 0x22d39750, 0x21e907de, 0xb73fcd2a, 0xb51799bd, +0x27f02e70, 0xa27bca62, 0x814f5c81, 0x2705ebda, 0x7c60d989, 0x354a0125, 0xb034209d, 0x7d87d83a, 0x6e2f3376, 0x6de06652, 0xd910fe5c, 0x90cfe35a, 0x7d721d90, 0xfb36aca6, 0x81ba992b, 0x3069b805, 0xa1415aec, 0xdb38aacb, 0x9731cb47, 0xc8904187, +0xdffc1258, 0x061929ae, 0x7b9ef194, 0x167e97c6, 0x93f573d4, 0x34ad0096, 0xf91ef831, 0x211cc274, 0xb126e484, 0x04c4b893, 0x7851a4b0, 0x5d89de57, 0xce896829, 0x7a79f027, 0xb0c1e537, 0x5c9b1a4e, 0x376255b2, 0x0523b920, 0xcb5f14a3, 0x317b7c1c, +0x1067be68, 0xb4055da4, 0xcf6e699a, 0x3241ec92, 0xcdb3f8a7, 0x243f7b54, 0x87a3b085, 0xddd446cf, 0xb2e9b1a0, 0x805d9898, 0x4c09618c, 0x78a4611a, 0x794360a9, 0x3353288b, 0xe98c83f3, 0x6cf2a24b, 0x95ec5a7a, 0x6edaf6dc, 0xd9e53bf6, 0x857e21b8, +0x222652fa, 0x4ae58d88, 0x96230f5e, 0x48381cb5, 0x5a77f64a, 0x318eb9b6, 0x06ecec04, 0xecaf3ad3, 0xb62d0933, 0xde1b13eb, 0x36855401, 0x7ebd48b4, 0xeb5112ce, 0x5b90f7f9, 0x11757a71, 0x1456c351, 0x83670816, 0x04317d39, 0x6a1e4e4f, 0xca4dd0ba, +0xb3fb75b9, 0x24cabefe, 0xea43d6d7, 0xf80c3c28, 0x10927bc2, 0x07fe281d, 0x233496e3, 0x35bfc48f, 0xec5aff79, 0xf8f9f982, 0x68361ad8, 0x49df1d06, 0x58aa6777, 0xee72abee, 0x7a8c358d, 0xb4f0980e, 0x846ce5a1, 0xa28e0fc8, 0x32b42938, 0xce7cad83, +0x5d7c1bfd, 0xed483b60, 0x5a8233e0, 0xc865842d, 0x80a85d32, 0x14a306fb, 0xfad1ad15, 0x59b8a36e, 0xff07d19f, 0xedbdfeca, 0x124feaff, 0x168b526c, 0xdeeed641, 0xa3690e7b, 0x903a26f0, 0xdbcd6f61, 0x4fc634a8, 0x4e21351b, 0x6bf94ffc, 0xfbc3690c, +0xef606ff7, 0x070bedb7, 0xfc3d4111, 0xa64ab75b, 0x6fc832c5, 0x6924dec1, 0x95199fd0, 0x13a8eb4c, 0xd8f7ffef, 0x8392cdbc, 0x68c3df72, 0xa7587342, 0xa585e27f, 0xa0539ef5, 0x92e7b7cd, 0x367091ab, 0x94fe9e63, 0xa7adb6e8, 0xef95aa5d, 0x9128e2e9, +0x02dd913d, 0x4a104822, 0xb7ca0880, 0xdd218365, 0x4cfca426, 0xcc54f914, 0xa39ccbd1, 0x12ba2f55, 0xeab6137d, 0xb6d8cc99, 0x79b6a503, 0xdcc682d6, 0x585fa2dd, 0x03cf5524, 0x252dbf4d, 0x05d67c8a, 0xc982859e, 0xcf9bac30, 0x4bf74991, 0x7c951c23, +0xcd463d0d, 0x6c0767e1, 0xdf09d7f2, 0x828009a5, 0xa6bf72f1, 0x4d1ba595, 0x4ed4f0b1, 0x492ad8ac, 0x3458c53c, 0x15440748, 0x1180bfdb, 0x25d87ae7, 0x594d66c4, 0x48cdd91f, 0x309c7daf, 0xda2a6ed2, 0x7f5a4907, 0xb1d3212e, 0xdadfab78, 0x135d2ee6, +0x92127267, 0xa462e3cc, 0x26e2ea69, 0x7faf8cad, 0x176c53df, 0xcbaad109, 0x8756752f, 0xa57027d5, 0x940b5bc9, 0xfd2f8508, 0x17999675, 0x86b1749c, 0x200e066d, 0xfdda40a2, 0x5c6edfe4, 0x69d11b6b, 0xcca13cbe, 0x7e488d1e, 0x4dee603f, 0x23c15349, +0xa1b49f46, 0x00000000, 0xee876e44, 0x0112c419, 0xdc33477c, 0xfa2468bf, 0x5b653253, 0x20fbc3c7, 0x02285497, 0xa0a65b5f, 0xf9eb3d9b, 0x033a908e, 0xfcc884bb, 0x91dd2743, 0x33a6ed21, 0x858be412, 0x5eb34ed9, 0x01e701b3, 0xfff21435, 0x8644b136, +0x5fa18ac0, 0xeba4d764, 0x4f33f102, 0x37979018, 0xcab81510, 0x5e468b73, 0x00f5c5aa, 0xfe151586, 0xe89e47ea, 0x6aeb8be5, 0xb5e25c17, 0x6b0c8a56, 0x6f3df76f, 0xb30eb013, 0xa4972666, 0x5f544f6a, 0xd8023a45, 0x9300b67e, 0x7b6b343e, 0x8499200b, +0x4b028c3b, 0x15b1c2e2, 0x6d15a3f8, 0xfee0d02c, 0xfd68db10, 0x3cc2b1ca, 0x5cc553e0, 0x2143521e, 0x16fb706a, 0x2d0d5fc0, 0xb06444e2, 0xbc2a493c, 0x6007e22a, 0x6b7b538c, 0x4a380192, 0x85aa39c7, 0x6545231b, 0x935149ad, 0x9a5d8542, 0x16fd5272, +0x7d8601fe, 0x090cccef, 0x4400531d, 0xbb18f544, 0xf350899f, 0xd06584d0, 0xaf95da7f, 0x1ab57db4, 0x0b7cb1a6, 0x0c4e0dde, 0xfa5a6768, 0xdb193576, 0x21457006, 0x1d87c1cc, 0x6c49eff4, 0xb750da82, 0x55c99f0f, 0xcad6db7c, 0xb21439ab, 0x2677cc7e, +0x3eb4ee9b, 0xbc2c6b24, 0x62779f63, 0x5bf7ef98, 0x2f7d2289, 0xfd6ef908, 0x8b944950, 0x2849bce9, 0x9613889c, 0x4d0c9ff2, 0xe0ef1adc, 0xa4e96bd9, 0x37be006c, 0xe5abf9f5, 0x00000000, 0x76fab058, 0xc3da1793, 0x4f7ce2bb, 0x6271bd7b, 0x7ab4bd86, +0x80e8f8f6, 0xc3dc358b, 0x4144b034, 0xb756f89a, 0x4332ef65, 0x35ce7d25, 0x284f9ef1, 0xff18a659, 0x148d2f3b, 0x57bfc05e, 0xeb93ab7a, 0xb52685d3, 0x9463f5d5, 0xc1aa6ada, 0x508d7c26, 0xade3852e, 0xde5bf447, 0x7ff05eaf, 0x3bf00db2, 0x2671ee66, +0xbe5c166d, 0xb06266fa, 0xfa5c4570, 0x0542c131, 0x3cc493d2, 0xb2121bb3, 0x912134e4, 0x8ed68861, 0x6c4fcdec, 0xcf941a4d, 0x2407b137, 0xbe5a3475, 0x6e3fb0a5, 0x6b7d7194, 0x982df80b, 0x55cfbd17, 0x00062218, 0xade5a736, 0x308a9e0c, 0x829885bf, +0xd52167f9, 0xd7511ab0, 0xc8a0842d, 0xb96eaa15, 0x748acd11, 0x982bda13, 0xa4ef49c1, 0xf82a1a21, 0xe29f6795, 0x18c322e5, 0xe9e5f42b, 0xdc2b890e, 0x0544e329, 0x93576bb5, 0x44067105, 0xd063a6c8, 0xdb1f176e, 0xd215f999, 0x89e43419, 0xcf923855, +0x398070fb, 0x308cbc14, 0x2a3fe3b8, 0x3eb2cc83, 0x32fae345, 0xc1ac48c2, 0x11cfee0a, 0x78c2e2d7, 0xc8a6a635, 0x67337c4a, 0xeca7351a, 0xdc2dab16, 0x07349e60, 0x73b87169, 0xf46235e7, 0x398652e3, 0xd213db81, 0xa8a1441f, 0xa3dbd7a1, 0x85ac1bdf, +0xa6991690, 0x1ab35fac, 0xf61248ae, 0x4a3e238a, 0xe7db84bc, 0x4142922c, 0x8ed0aa79, 0xde5dd65f, 0xe9e3d633, 0x4334cd7d, 0xcde46704, 0x690d0cdd, 0x598792d1, 0x690b2ec5, 0x0e38528f, 0xcad0f964, 0x5cc371f8, 0xeca11702, 0xaad71b4e, 0x23350d4f, +0x7ab29f9e, 0x5981b0c9, 0x65430103, 0x57b9e246, 0x7d8023e6, 0xeb958962, 0xe7dda6a4, 0xf82c3839, 0x508b5e3e, 0x2d0b7dd8, 0x46760c4c, 0xaad13956, 0x52fd016f, 0x9465d7cd, 0x9a5ba75a, 0x02707d49, 0x5bf1cd80, 0x13bf9343, 0x87dc6696, 0x9f1f4473, +0xa69f3488, 0xd969483f, 0x5eb52ea9, 0xf126d6ce, 0x090aeef7, 0x52fb2377, 0x484e5ec3, 0x3bf62faa, 0x9f19666b, 0xc698d6a2, 0x0b7a93be, 0x2f7b0091, 0xeed16a4b, 0xc4ee89f3, 0x48487cdb, 0x829ea7a7, 0x1ff7bc85, 0xa8a76607, 0xe5addbed, 0x0732bc78, +0x11c9cc12, 0x76fc9240, 0xff1e8441, 0x148b0d23, 0x9615aa84, 0xaf93f867, 0x2a39c1a0, 0xcde2451c, 0xa1abaae8, 0x9d6f393a, 0x23332f57, 0xf356ab87, 0x71c80c20, 0x912716fc, 0x8ca0d730, 0xeed74853, 0xf120f4d6, 0xd96f6a27, 0x7ff67cb7, 0x0e3e7097, +0xf6146ab6, 0x13b9b15b, 0x02765f51, 0x18c500fd, 0xa3ddf5b9, 0xa1ad88f0, 0x6001c032, 0x4d0abdea, 0xb520a7cb, 0x71ce2e38, 0x73be5371, 0x6e3992bd, 0x46702e54, 0xd75738a8, 0x78c4c0cf, 0x4f7ac0a3, 0xe0e938c4, 0x35c85f3d, 0x9d691b22, 0x8b926b48, +0xbb1ed75c, 0x0c482fc6, 0x748cef09, 0xf46417ff, 0x87da448e, 0x80eedaee, 0x67355e52, 0x8ca6f528, 0x89e21601, 0xc4e8abeb, 0xb968880d, 0xd52745e1, 0x32fcc15d, 0x2401932f, 0x37b82274, 0x1d81e3d4, 0xc69ef4ba, 0x5eb30cb1, 0x1ff19e9d, 0xe299458d, +0xbeac7d5a, 0x4b8ba1f4, 0x6641e72c, 0x93e077df, 0x8317113f, 0x33c0b77d, 0x1307a6d6, 0x3b0048a5, 0x708be951, 0x30b63b16, 0x153ace4b, 0x054be4f6, 0x45f07aec, 0x03f0c036, 0x80e7d109, 0x20c711ab, 0xc3ac8f25, 0xc05c4f13, 0x93663b82, 0x56f7dc3a, +0xb0d7a642, 0x10712abd, 0xe556f613, 0xc591e7b8, 0x2bf72e45, 0x754641fa, 0xab10ff4c, 0x60fac3ec, 0xa020c0a2, 0x2dca46d8, 0x7d00f27f, 0xa5ed6809, 0x7630cd91, 0x50cab4a7, 0x85ac35ff, 0x1bc7590e, 0xadabdb8c, 0xa69be462, 0xb66c8282, 0xee66c9fd, +0x7d86be22, 0xe6207a78, 0x1e0af1a5, 0x20415df6, 0xad2d97d1, 0xf6d71c98, 0x88272ed1, 0x630a03da, 0xdda67e80, 0x2e3a86ee, 0x0d0d5773, 0xd8ed9a76, 0x06bb24c0, 0x3876c4ce, 0xa3d00094, 0xb59c42b4, 0xdb1d5a40, 0xcdd7543d, 0xfd616f2b, 0x00864c5d, +0xb3276674, 0x5b7cc714, 0x00000000, 0x10f766e0, 0x7b3d9ae2, 0xf65150c5, 0x063d689d, 0x3dbb6c65, 0xf82a8bdd, 0xde56beb6, 0xa3564cc9, 0x80619d54, 0xeb2d2d0b, 0x4600bada, 0x73fd653a, 0xd5668158, 0x0efd9745, 0xd35be9c5, 0x357b93bd, 0x2881a22e, +0xe36b9e8e, 0x360d1fd6, 0xf0ea7405, 0x9ba6c45a, 0xed104596, 0xd0ab29f3, 0xfb5c07b6, 0x4e46095f, 0x700da50c, 0xcb6c70fd, 0xfe17e340, 0x9856046c, 0xe09b5eb8, 0x6b4cb05f, 0xd696416e, 0x8bd7eee7, 0xded0f2eb, 0xa8e03f7a, 0x9e6b6cf1, 0x962ddf74, +0x18b1d565, 0x1e8cbdf8, 0x4b0deda9, 0x65376b47, 0x8dea867a, 0x18379938, 0xf8acc780, 0x784b1689, 0xab96b311, 0x368b538b, 0x88a1628c, 0xdb9b161d, 0x6bcafc02, 0xc0da034e, 0x76b681cc, 0x865cf5c9, 0x6df7949f, 0xa56b2454, 0x3346fb20, 0x7ef03249, +0x3e4bac53, 0x1381ea8b, 0x9010b7e9, 0x9eed20ac, 0x26fa7936, 0xe85ba160, 0x2b716218, 0x2807ee73, 0xc661278e, 0x40bb9e1a, 0x68bc7069, 0x1b411553, 0x86dab994, 0x83915d62, 0x164c4220, 0xf06c3858, 0x0b303fee, 0xe8dded3d, 0xbb61d5f1, 0xd86bd62b, +0x43cd1271, 0x2d4c0a85, 0x8b51a2ba, 0xdd2032dd, 0xe3edd2d3, 0x5e3723e2, 0x5dc7e3d4, 0x3030774b, 0x638c4f87, 0x95dd1f42, 0x96ab9329, 0x5eb16fbf, 0xbd5cbd6c, 0xaedd57e7, 0x6e0754a9, 0x15bc8216, 0xa8667327, 0x3ecde00e, 0x56719067, 0x4db6c969, +0xc32ac378, 0xae5b1bba, 0x457636b1, 0x5bfa8b49, 0xeee085a0, 0x0846b385, 0x852a79a2, 0x9d1de09a, 0x9096fbb4, 0xd3dda598, 0x03768c6b, 0x75c00da7, 0x434b5e2c, 0xd6100d33, 0x250ab900, 0x9b208807, 0x08c0ffd8, 0x98d04831, 0x8e1a464c, 0x78cd5ad4, +0xb89115c7, 0xe6a63625, 0x53bc38cc, 0x4ec04502, 0xcea1d856, 0x0d8b1b2e, 0x6d71d8c2, 0x403dd247, 0x65b1271a, 0x588c0722, 0x1dfa3193, 0x55815051, 0x267c356b, 0xc6e76bd3, 0xbddaf131, 0xc89cb0cb, 0x955b531f, 0x487b61c2, 0x737b2967, 0xb51a0ee9, +0xd02d65ae, 0xf39cf86e, 0x3b8604f8, 0xed9609cb, 0x5d41af89, 0x0bb673b3, 0xb817599a, 0xa0a68cff, 0x580a4b7f, 0xc517abe5, 0x607c8fb1, 0xb3a12a29, 0xf527dcae, 0x4d308534, 0x7e767e14, 0xfde72376, 0xb6eacedf, 0xbbe799ac, 0x3d3d2038, 0x8d6cca27, +0xb051ea1f, 0x35fddfe0, 0xf5a190f3, 0xebab6156, 0x4686f687, 0xf31ab433, 0x6e8118f4, 0x683a3c34, 0x66c7ab71, 0xcd511860, 0x258cf55d, 0x55071c0c, 0xe01d12e5, 0xd5e0cd05, 0x9d9bacc7, 0x2ebccab3, 0xcbea3ca0, 0x533a7491, 0xce27940b, 0x0e7bdb18, +0x05cda8ab, 0xfe91af1d, 0xbe2a3107, 0xfbda4beb, 0x8e9c0a11, 0x1d7c7dce, 0x504cf8fa, 0x2337d19d, 0xc81afc96, 0x7bbbd6bf, 0x38f08893, 0x48fd2d9f, 0xa61da83f, 0xe5d0ba4e, 0x23b19dc0, 0x16ca0e7d, 0x6ad0ad96, 0xcfb7417c, 0x4815300a, 0xa1912a8e, +0x860b0800, 0x00000000, 0x9a18c5b0, 0x32437ff5, 0x2ff9cb33, 0x70ee47c9, 0x95ff7294, 0xa4ce959c, 0x371cc0e7, 0xb44877f5, 0x16abc586, 0x055fbf12, 0x01a97976, 0x788dae74, 0x3c0db1a7, 0x9eee03d4, 0x8cb30036, 0xc050f658, 0xba06b9a7, 0x4aced181, +0x996a5d4d, 0xda6e1c07, 0xefa93d6b, 0xeb5ffb0f, 0xc7d4a8c1, 0xb974215a, 0x3f7f295a, 0x201e7c17, 0x02dbe18b, 0x2541c305, 0x0fe7b724, 0x741881ad, 0xdbc76571, 0xf43eae42, 0x1b979329, 0x3a209648, 0x80262fef, 0x33ea0683, 0x522bda55, 0xdc433be8, +0xb3cc296c, 0xd8b5fd8c, 0xecdba596, 0xbc2b9e48, 0x8b375eaf, 0x67ecfb39, 0x87a27176, 0xee00441d, 0x6b79d4e0, 0x515942a8, 0x8e68e1bd, 0x8845c652, 0x593aab15, 0x07845e99, 0x1c13cdb0, 0x287d95aa, 0xf21389ad, 0x0863e9bd, 0x631a3d5d, 0xdf31a315, +0x29d4ecdc, 0xd7524aa8, 0x62b3442b, 0x7924d702, 0xfa706010, 0x1ec82c3b, 0xa85bba45, 0x04f6c664, 0x5406fdba, 0x818f5699, 0x38fb77c3, 0x1dbab4c6, 0x7a564fff, 0x09ca90cb, 0xb117c8e7, 0x7235a642, 0x7f09f0ed, 0x2e50b245, 0x1702bcf0, 0x21b70561, +0xcb418718, 0xaa805bce, 0xe82d63f2, 0x4f916e93, 0xb8dd582c, 0x4304414a, 0xab2922b8, 0x4076d9b7, 0xe33c12b2, 0x76c36026, 0x125d03e2, 0x7dd21166, 0x2c8b53ce, 0x2b0f0d57, 0x4d4a8f18, 0x84d0e98b, 0x4e3817e5, 0xbbafc0d1, 0x776a1950, 0x39520eb5, +0xa2e3b273, 0xd589ab23, 0x82fdce64, 0xb73aef08, 0xfdf43e89, 0xa03853f8, 0xd420d255, 0x236ce4ea, 0x35c7216c, 0x0ab80836, 0x062d27ef, 0x4ce3f66e, 0x90a0cd86, 0x6645824f, 0x5a4833e8, 0xfe86a674, 0xf74c36bf, 0x6f8f1284, 0xd0d61431, 0x9bb1bcc6, +0x3b89ef3e, 0xde98da63, 0x2aa67421, 0x44801fd3, 0x69a2356b, 0x18e50bd4, 0x1a3eea5f, 0xacad7c21, 0x649e63c4, 0xf6e54fc9, 0x1470240d, 0x89ecbf24, 0x15d95d7b, 0xafdfe4dc, 0x465bfe58, 0x9109b4f0, 0x9724931f, 0x0b117140, 0x56dd1c31, 0x47f2872e, +0x65371ab2, 0xe4b84c2b, 0x30989e7e, 0xbd82e73e, 0xc8331fe5, 0x8a9e27d9, 0xd17f6d47, 0x8d1a7940, 0xf0c86826, 0xe2956bc4, 0xae769daa, 0xb693967e, 0xa7bc0d61, 0xb0beb191, 0xfbd91966, 0xad040557, 0x0d3c56af, 0xfc5d47ff, 0xc4a6303c, 0xa6157417, +0x739cdf34, 0xeaf68279, 0x13f47a94, 0xc1f98f2e, 0xed72dce0, 0x9f477aa2, 0x112f9b1f, 0xddea429e, 0x7bff3689, 0xd20df5ba, 0x36b5b991, 0xe663ada0, 0x452966a5, 0xc99a6693, 0xc28b17d3, 0x1f61554d, 0xce1e380a, 0x24e8ba73, 0x71473ebf, 0xe7cad4d6, +0xf3baf0db, 0xf902f8ed, 0x037298fd, 0x3da4c8d1, 0xbf5906b5, 0x8354b712, 0xb5e10e83, 0x3ed6502c, 0xf8ab819b, 0x7c7b6810, 0xf1611150, 0xa9f2c333, 0xe9841a84, 0x8fc198cb, 0xb265501a, 0x55af84cc, 0xcae8fe6e, 0x42ad383c, 0x41dfa0c1, 0xe1e7f339, +0xe511355d, 0x857990fd, 0x9c35e25f, 0xc50f494a, 0xff2fdf02, 0xcd6ca0f7, 0x5f178cfa, 0x5382a323, 0x94560be2, 0xc67dd1b7, 0x61c1dcd6, 0x279a228e, 0x93d2557b, 0x968dea69, 0x5be14a9e, 0x6cfd8a79, 0x0e4ece52, 0xe04e8a4f, 0x22c59d9c, 0x6d54f30f, +0x4b67a8f7, 0x9d9c9b29, 0xa34acb05, 0xd3a48ccc, 0x26335bf8, 0x5ebef58c, 0x0c952fd9, 0xd6fb33de, 0x5893d263, 0x680b4c1d, 0xd91c84fa, 0x7ea0899b, 0xa567ecea, 0x1086e269, 0x194c72a2, 0x346e581a, 0x49bc497c, 0x98c3243b, 0x3131e708, 0xbef07fc3, +0x50f03bde, 0x2d222ab8, 0x75b1f8db, 0xf597d734, 0xc3226ea5, 0xccc5d981, 0x57746547, 0x6e266bf2, 0x5dcc6d71, 0x6068a5a0, 0x927b2c0d, 0x5c651407, 0x4ac3dcf0, 0xbb18635e, 0x39429f34, 0x349ce25a, 0x0dde7d6e, 0x21310aed, 0xe95e9e0b, 0x208f0a47, +0x82cc76e9, 0x20ef34b8, 0x530e4983, 0xa2437cae, 0xe8761422, 0xfcf376bc, 0x9adfddcf, 0xf00581fb, 0x5ed034ed, 0xaf6bb5bc, 0x7e5f3eaa, 0x66ba21f0, 0x6a4cd6b7, 0xb6c61e30, 0x1485629e, 0x9a49574c, 0x1813ab26, 0x8f723578, 0xfd2d48e9, 0xd01c013f, +0xbb785da1, 0x1473d6e2, 0x6b046261, 0xe55edd30, 0xd1348b16, 0x7377f7b8, 0xd0eab543, 0x155b5ccb, 0xdd54f6d2, 0x7fe13e00, 0xf1bb8151, 0xd1a20195, 0xe9a82a77, 0x5eb00a12, 0x52b04929, 0xb630aa4c, 0x9b01e39a, 0x67641fa5, 0x9b976919, 0xf0930b78, +0x96491477, 0xb7781e9a, 0xa30bc878, 0x00603eff, 0x7ea98ad6, 0x3522e2f0, 0x9701a0a1, 0x5f6e3447, 0x4a35688c, 0xae433f95, 0x0d48f7ed, 0x4a555673, 0x1413e81d, 0x39b42b48, 0xb78eaae6, 0x7317c947, 0xfc05c2c0, 0xc527630b, 0x0c607dc4, 0x7f178a7c, +0x823ac295, 0x96df9ef4, 0xdda242ae, 0xfddbfc95, 0x39d415b7, 0xc4f95d5e, 0x6b645c9e, 0xc899209a, 0xfc934843, 0xba50d788, 0x14e55c61, 0xc5d1d777, 0xb7ee9419, 0x8e3a81ae, 0xba30e977, 0x478b2b1d, 0xa2b5c8d2, 0xaffd3f3f, 0x72a9c9ed, 0xaf0b8b43, +0x8e5abf51, 0x0c00433b, 0x4b7ddc5a, 0x21513412, 0x825afc6a, 0x6ada5c34, 0xd08a8bbc, 0x00f6b47c, 0x96292a88, 0xf0f33587, 0xa2d5f62d, 0x0d28c912, 0xbaa663f4, 0x83e4fcc0, 0x664c958c, 0x723f436e, 0x187395d9, 0x4b8b6826, 0x9a2969b3, 0xddc27c51, +0x15ade8b7, 0xd154b5e9, 0x340a68d9, 0x536e777c, 0x52d077d6, 0xf14d352d, 0xaeb58be9, 0x2c19c3ff, 0xa39d42fb, 0x18e51f5a, 0xb6a620cf, 0xe41669e6, 0x66da1f0f, 0xc40fe922, 0xe5a8694c, 0x2d517729, 0xc80faa19, 0x195b1ff0, 0x2dc7fdaa, 0xa2234251, +0xc5b1e988, 0x7f8100ff, 0x5f98803b, 0x4aa3e20f, 0x97619e5e, 0xe4e0dd9a, 0x19cd9573, 0x738143c4, 0x38fc9f9e, 0x8eac0b2d, 0x01de3e55, 0xe53ee3cf, 0x6792abd9, 0x5ff8bec4, 0xb7182065, 0x5246fd55, 0x21a7806e, 0x4b1de2a5, 0x6a2ce848, 0xb65094b3, +0x5e46be6e, 0xf065bf04, 0x201980c4, 0x46551548, 0x725f7d91, 0x46c39fcb, 0x46352bb7, 0x386a151d, 0x19adab8c, 0x01be00aa, 0x35d4568c, 0xc5475df4, 0x97f714dd, 0x3922a1cb, 0x53f8fdff, 0x0dbe4391, 0x193b210f, 0x8f120b87, 0xe9c81488, 0x477d9f61, +0xe5c857b3, 0xc9471ecf, 0x82ac4816, 0x83727643, 0xa3fd7c04, 0x73e17d3b, 0x662cab73, 0x9bf757e6, 0x35b46873, 0x8fe4bffb, 0x188521a5, 0xdceaf678, 0x2da7c355, 0x8f848104, 0xdd34c82d, 0xe8162add, 0x00968a83, 0x831248bc, 0x0c96c9b8, 0x15cdd648, +0x8ecc35d2, 0xc8f91e65, 0xbac65d0b, 0xbb8ee9dd, 0xe8e09ea1, 0x2d3149d6, 0x2c8f497c, 0x5226c3aa, 0x9b61dd65, 0xaed5b516, 0x346a5626, 0x72c9f712, 0x67f29526, 0xc86f94e6, 0xfd4d7616, 0xdc8ac887, 0x0cf6f747, 0x96bfa00b, 0x7ec9b429, 0x21c7be91, +0xc49963a1, 0xc9b1aab3, 0x7e3f0055, 0xe880a05e, 0xe480e365, 0xaf9d01c0, 0xc46fd7dd, 0x5f0e0ab8, 0x5398c300, 0xbbeed722, 0x153b6234, 0xfc65fc3f, 0x6bf2d61d, 0x6704215a, 0x380a2be2, 0x7f77b483, 0xe93ea0f4, 0x389ca161, 0xf12d0bd2, 0x01288a29, +0xa36bf687, 0x2c79fd00, 0x00000000, 0x97972a22, 0xae23016a, 0x0148b4d6, 0xf1dbbfae, 0x46a3a134, 0x471da19e, 0xd1c23f6a, 0x34fcdca5, 0xe4765719, 0x3542dc0f, 0xd07c3fc0, 0xc9d1944c, 0x5e268091, 0x6aba62cb, 0x47eb15e2, 0xdc1c4204, 0xfdbbc26a, +0x8384c23f, 0x9abfe330, 0x2cef7783, 0x2079be3b, 0x6b92e8e2, 0xdc7c7cfb, 0x4beb56d9, 0xc9272030, 0x6a71e3cb, 0x9abff3ae, 0xd5a59815, 0xba061bbb, 0xdb39eafa, 0xf0ce1065, 0x30ec80b6, 0xd40f1873, 0x2e0f8469, 0x5ee5837e, 0xffd2fc7f, 0xc02290d3, +0x656d0fd1, 0xb0e28957, 0xfa2a8289, 0xdab9740f, 0x65471142, 0x74b8f987, 0xb0c897c4, 0xbffe654d, 0xa5658191, 0x3514fe40, 0xbe7efbb8, 0x8e927b0e, 0x800e09e1, 0x54011192, 0x8aea9b0d, 0xfff8e2ec, 0xd1dd7816, 0x2bf7fa9f, 0x3fda723f, 0x6fa383ae, +0xf14e8e90, 0xd58f8686, 0x818e9714, 0xb51af7a1, 0x95890127, 0x64ed9124, 0x3ba2923c, 0x447e67a2, 0xaa796d8b, 0x1ec91a4c, 0xba2c0528, 0x55818f67, 0x00000000, 0xcac6023f, 0x5f4f0318, 0x75386772, 0x85dc6984, 0x1ee304df, 0xb1480931, 0xbfd47bde, +0x0b4e128a, 0x0f1cec1a, 0x15ad1655, 0xc18810b5, 0x542b0f01, 0x353ee0d3, 0x7ba4159d, 0xaa537318, 0x6a5bfd58, 0x314600d0, 0x0b640c19, 0x60957127, 0x45fef957, 0xd1f76685, 0xfe52628a, 0xc45a70d0, 0x8f12e5fb, 0xf5366e93, 0x7e7675f8, 0x70c01984, +0xdb13f469, 0xbe54e52b, 0x94238141, 0x6e231d5b, 0x55ab91f4, 0x05f87ef6, 0x91f1e124, 0x94099fd2, 0x256b8870, 0x0eb66c7c, 0x400687a1, 0x7e5c6b6b, 0x8b401b6b, 0xcf14625a, 0xfe787c19, 0xee2d14ba, 0xfb8002ef, 0x3a08125a, 0x5b1dfd88, 0x5079f191, +0xb530e932, 0x8eb8659d, 0x9eed0d3e, 0x1f639a2a, 0xaf81137d, 0xea7fea2a, 0x8ac0859e, 0xa4cf01f7, 0x905b6142, 0x0ace8c7f, 0xafab0dee, 0xae2b931b, 0x1b1b7a29, 0x85f67717, 0x6115efd2, 0xbbac9bdd, 0xe11be633, 0x90717fd1, 0x0e9c72ef, 0x2a77646a, +0x9b3f6d5b, 0x3e70f259, 0xf0e40ef6, 0x41ac07c7, 0xa1377f01, 0x142d88a0, 0x6f899d3d, 0x4ae2154d, 0xe0b16655, 0x316c1e43, 0x2093f686, 0x71408771, 0x7492e714, 0xa4e51f64, 0x30c69e25, 0xda936a9c, 0x4e9af54e, 0xe131f8a0, 0xe09b78c6, 0x213976e0, +0x20b9e815, 0x3ff06cac, 0x2f8f1a9c, 0x51d371f7, 0xc0088e40, 0x9ec713ad, 0xdf6b146a, 0x64c78fb7, 0x8476e9e2, 0x9a95ed3d, 0x5f651d8b, 0x7fdcf59e, 0xfbaa1c7c, 0x002a1e93, 0x9f6d93cb, 0x6bdb63ad, 0xf1649003, 0x5b37e31b, 0xf4b6f066, 0xa0b7e1f4, +0xfa009c1a, 0xcb469cca, 0xd42506e0, 0x34be7e26, 0x1b3164ba, 0x9f478d58, 0x1ab1fa4f, 0xc4706e43, 0x4f307528, 0x2fa5040f, 0xbb86854e, 0xa09dff67, 0xcebee23c, 0xebff74df, 0x95a31fb4, 0xb49a6954, 0xb16217a2, 0x751279e1, 0x24eb1685, 0xef8794dc, +0x3b888caf, 0xebd56a4c, 0x0ae492ec, 0x1a9be4dc, 0x21136873, 0x6bf17d3e, 0xcb6c8259, 0x7a0e95fb, 0x9b1573c8, 0xea55f4b9, 0x11d5f656, 0xa54f9f02, 0x716a99e2, 0xdeeb8a9f, 0x05d26065, 0x01aa8066, 0x613ff141, 0xcf3e7cc9, 0x0478e003, 0x4b628bb8, +0x402c9932, 0x41861954, 0x0452fe90, 0xee070a29, 0x14079633, 0xb4b077c7, 0x0f36f289, 0x845cf771, 0x107f7630, 0x3e5aecca, 0x158708c6, 0xe4c98656, 0x11ffe8c5, 0x45d4e7c4, 0x2e259afa, 0xabf9f37e, 0xc1a20e26, 0x01809ef5, 0x105568a3, 0x81a48987, +0xe54918a3, 0x7a248b68, 0x4f1a6bbb, 0xd05de6e3, 0x2bdde40c, 0x60bf6fb4, 0x6e0903c8, 0x349460b5, 0x8b6a05f8, 0xe4e398c5, 0x5053ef02, 0xcaec1cac, 0xae018d88, 0x91dbffb7, 0x4ac80bde, 0xc5daee25, 0xa11d6192, 0x44547931, 0x51f96f64, 0x254196e3, +0x5ab77dee, 0xce94fcaf, 0x1f4984b9, 0x5ecf9ded, 0x5a9d637d, 0xefad8a4f, 0xdf410af9, 0xc5f0f0b6, 0xdec1940c, 0xe5630630, 0x4eb0ebdd, 0x2a5d7af9, 0x7ff6eb0d, 0xf51c7000, 0x7b8e0b0e, 0x4b48952b, 0xf49ceef5, 0xabd3eded, 0x8f38fb68, 0x24c10816, +0x3a220cc9, 0x80241772, 0x70ea0717, 0xd077f870, 0x85e3f49d, 0xb7142c8a, 0x6af18376, 0x9dcd69ee, 0x3cc4c26b, 0x89f91001, 0xa8322f16, 0x49134281, 0x8ab0e875, 0xa76133fe, 0x93fe7392, 0x70f6e0e5, 0x9cad6f7a, 0xdde5affc, 0x143479ef, 0x1b676507, +0x90b78be6, 0x97bf1509, 0xa9522982, 0xcd90b088, 0x258a598c, 0x4509a61d, 0xd8c4cff3, 0x5e6ec31a, 0xb17cb4f1, 0xe0416b03, 0x28f0bb84, 0xf15472e3, 0x8db8769a, 0x58065b61, 0x7fa5fc0d, 0x541cbffd, 0x5b4fa315, 0x4a5abaf5, 0xb53dd26a, 0x01600694, +0x085b8207, 0x1e460508, 0xf0347477, 0x78ad62e2, 0x73bf1891, 0xc18a5414, 0x37d6b818, 0xc2c3ac60, 0xd9a4c967, 0x77fe7e0a, 0x6df91d99, 0xcfb94e68, 0x8483f209, 0x46405e69, 0x64c2990a, 0x6fd0e379, 0xc682cafb, 0xc7e2cc6f, 0x23e2c1f7, 0x36b6be8c, +0x87ca0a7d, 0xd09f4df4, 0xbd66506d, 0xdfcc511c, 0x349f406c, 0x0b127a73, 0x72df1e05, 0x3f8d3a1f, 0x32f7d817, 0xbf4fae8d, 0x7d8c02ed, 0x177d819b, 0x2990bd10, 0xf5151478, 0x3eed3c8b, 0xed3b890b, 0x75d780ea, 0x1a076393, 0x125ce194, 0xa3205565, +0xb2354c85, 0xd1ff4b60, 0x8f91887a, 0xfc2e90eb, 0xae5ab76d, 0xe1216d97, 0x69b87b02, 0x30de26f7, 0x2e9823ff, 0x0441669b, 0x6b9185e2, 0x8ef18eee, 0x80c29492, 0xfe076e0b, 0x96df139d, 0x9ba5f195, 0xa069ad11, 0xf86ff670, 0x00000000, 0xcbf828f3, +0x52742786, 0x3397de83, 0x62aa0171, 0x98ec09e1, 0x53142112, 0x43613e66, 0x7be49a96, 0x2ff8256b, 0x1c6ffbe8, 0x68d87d96, 0xced948fc, 0x9e84919a, 0x7196e671, 0xb01cb265, 0xe3089377, 0x3885a4f0, 0xbc0656f9, 0x0c1ae49c, 0x0349f874, 0x0a727ce7, +0x10751f74, 0x505dd966, 0x31be2063, 0x093b8493, 0xe4000d98, 0x194e9be7, 0x07089eef, 0x4c32228e, 0xdb8d3787, 0x513ddff2, 0xee72717f, 0xdeac5788, 0x5a2fa581, 0xd4de2b6f, 0x0e331a7c, 0x20ab3983, 0xf90ff0e4, 0x65a29f9e, 0xa601356a, 0xba6ece82, +0xaf3ab1f9, 0x59665df5, 0xdaed3113, 0x7a849c02, 0x4b3abc61, 0x0f531ce8, 0x4e1bdc6e, 0x420138f2, 0x0521600f, 0x26c3a1f8, 0xc9d1d613, 0xb8473062, 0xa109ab85, 0x39e5a264, 0x24ea5f18, 0x88991695, 0xfb260e04, 0xc0ea5280, 0x9fe4970e, 0x182e9d73, +0x6eb0e5ed, 0xaa1bd1f6, 0x133ce700, 0x7ec5fa99, 0x161d870f, 0x2282c763, 0x79cd6476, 0x6083ff91, 0xb6742a1e, 0x838b6ce6, 0xac73498d, 0x15547f7b, 0x5c473dfa, 0x4f7bdafa, 0xb45dd4fe, 0x5d273b6e, 0x4d52241a, 0x472058fd, 0x7cec0479, 0x4028c612, +0xd3d6b580, 0x929e7506, 0xd797d31b, 0x3bcc5c84, 0x61e3f905, 0x1d0ffd7c, 0xc5cb328f, 0x0d7ae208, 0xa548cd1e, 0xccf0b61c, 0x9ac5f701, 0x111519e0, 0x8bd0eee1, 0xf65cec0c, 0xfa460890, 0xe81ae904, 0x27a3a76c, 0x998c0f75, 0xea3317e4, 0x63ca07e5, +0x769e789e, 0xf73cea98, 0xe629f378, 0x4148c086, 0xb3554a11, 0xec5b8f9f, 0x2bb943f0, 0x82eb6a72, 0x5f0ec58e, 0xe97aef90, 0x3da4c4ff, 0xf47512ec, 0x6c991b0d, 0x4469a089, 0x3aac5a10, 0xeb531170, 0xe749f5ec, 0x81a29206, 0x94f6ed7d, 0xad134f19, +0xd5be2dfb, 0xf21d8a97, 0xbe2fa819, 0x74b7867e, 0xd2b6b314, 0x48734415, 0xa24053f1, 0x21cb3f17, 0xb92736f6, 0xef1277eb, 0xbb0ec816, 0x8cd8700e, 0x5635411d, 0xc8b1d087, 0xe5600b0c, 0xff67689f, 0xdc85a968, 0xc3a3aaf4, 0x57554789, 0xab7bd762, +0xc4ab341b, 0xca982e67, 0xa428cb8a, 0x35ff46f8, 0x1f26039c, 0x66eb67ea, 0xd6f7d58f, 0xf37d8c03, 0x678b617e, 0x2dd1db8b, 0x0668987b, 0xfd4e967f, 0xe26895e3, 0x0229fee0, 0x9596ebe9, 0x557cb969, 0x2cb1dd1f, 0x2ad94564, 0x91d78d72, 0x86aa0ce9, +0x425a3e34, 0x449e640d, 0x0be901a5, 0x9418bea2, 0xa360015f, 0x83690936, 0x7ebcd5dd, 0x6553f41a, 0x26cd5250, 0x2ce0cb8b, 0x6ebaf5bf, 0x4f7765a8, 0x1771b794, 0x53988628, 0x452da9c2, 0x59c24a42, 0x06c45a39, 0x1cefe380, 0x3ce6ebe9, 0x73918e41, +0x3d552626, 0x11b5edad, 0x5eb5ddb4, 0x2d2453f5, 0x21cd9017, 0xfdd5dceb, 0x9e352779, 0x43e9f3fb, 0xb311748c, 0x7555d478, 0xddab8133, 0x0b9e5414, 0xa88900fa, 0x54ef11de, 0x73e6dbf0, 0xc080facd, 0x6253365d, 0x63e0fb92, 0x3778bffd, 0xdb6fdb0a, +0x936f2954, 0x0ce9c3e2, 0xbe3c2f10, 0x277e9f9f, 0xa5d30ed7, 0x2be009cc, 0xb94bb8e6, 0x74914c06, 0x752281c9, 0x831e5c87, 0x0d2d5b9c, 0x5f06107b, 0x841e9ec0, 0xd1351760, 0xb2a2b943, 0xdddcd482, 0x2a2491b2, 0xa460c318, 0x00000000, 0x2709ca2e, +0xf13c1f09, 0x98f17d40, 0xcb69fb68, 0x3be629ae, 0x92abb12a, 0xa8fe554b, 0x36cb7232, 0x555cdc11, 0xd0f18f1e, 0x370fea4c, 0x4ec4a867, 0xe13a3f6b, 0x9e4272c8, 0x1a5cec08, 0x31bce5c4, 0xa41796a9, 0x9942b08f, 0x0a2d99db, 0x007755b1, 0x5498446f, +0xd78618e8, 0x36bc2783, 0x85ad530f, 0xe14d6ada, 0x7222438e, 0x26ba07e1, 0x422d6b85, 0x8e33071b, 0x5ec28805, 0xcc1e6c9e, 0x78788fe4, 0x92dce49b, 0x2c979e3a, 0xedd3fc89, 0xdc6f194d, 0xa2d3cc90, 0xcc69392f, 0x82ad9148, 0xb88f2098, 0x69ba37f8, +0x93187ce5, 0xf14b4ab8, 0xec1764f7, 0x077797f6, 0xe64da89d, 0x1d5c2e4f, 0x85da06be, 0xcada36a7, 0xdc184cfc, 0xf78f1081, 0xa94d9884, 0xc7f76d3b, 0xb93ced57, 0x780fda55, 0x7f784da3, 0xb2d5ecf2, 0xf7f84530, 0x2a53c403, 0x59b51ff3, 0x1b987476, +0x01b3cdcf, 0x8e4452aa, 0x88f75d22, 0x9ff1bf07, 0xcddaf4e0, 0x300f280b, 0x49b33f91, 0xd7f14d59, 0x207e5dd8, 0x79bc179a, 0x522b4be7, 0x79cb422b, 0x5f7145ca, 0x7f0f1812, 0xe0fea715, 0xe089f2a4, 0x6809fa37, 0xc633f545, 0xa93acd35, 0xbff8b76e, +0xfc661124, 0xb5a27b04, 0xc14462b3, 0xe63afd2c, 0x1c98b631, 0x2b975c7d, 0x3c91be58, 0xc644a0f4, 0x49c46a20, 0xfda2895a, 0xd14242d1, 0x687eaf86, 0xcaad6316, 0xf63cdd4e, 0x16c27a5b, 0xcdada151, 0x8f80cad4, 0xbf8fe2df, 0x95dc26dc, 0x7ecb806c, +0xfb66d363, 0xeb60f301, 0x0c9e9653, 0xfb1186d2, 0x06b30f88, 0x8469cb71, 0x1d2b7bfe, 0x9f86eab6, 0x53efd399, 0x439ea64a, 0x2d530644, 0xb5d52eb5, 0x7255163f, 0x21bac5a6, 0x1706e225, 0x4eb3fdd6, 0xeda4a938, 0x10062062, 0x74e619b7, 0xdaab4374, +0xd086daaf, 0x9935e53e, 0xf0f88777, 0xfc114495, 0x525c1e56, 0x88800893, 0x95ab736d, 0x3a22b1d0, 0x8ff79f65, 0x894490ed, 0x82dac4f9, 0x44e931bc, 0x107175d3, 0xaf89c2bd, 0x3b917c1f, 0x64e039d5, 0x3a55e461, 0x64976c64, 0xb466e37a, 0xc1333702, +0xeaa46b7f, 0xc780388a, 0xd6428096, 0x1a2bb9b9, 0x0d5a0e2d, 0x552b89a0, 0xaffe970c, 0xec603146, 0x20090869, 0xf64b88ff, 0x8933c55c, 0xf08fd2c6, 0xb366213d, 0x4877a7ef, 0x30787dba, 0x11c2b81c, 0x3d227397, 0x0a5acc6a, 0x1bef21c7, 0xa2a49921, +0x4800f25e, 0xfaa24b1d, 0xdadc16c5, 0xe7fe6552, 0x455afc73, 0xa31754ee, 0x16b52fea, 0x01c4987e, 0x31cbb075, 0x6ecda00e, 0xae3a0f72, 0xdb188ebb, 0xd635d527, 0x4f003019, 0xb411b6cb, 0xa5a45b66, 0x6524a1ab, 0x6f7e6dc1, 0xc0f7af7c, 0xead33ece, +0xcb1eaed9, 0xae4d5ac3, 0x5806d23c, 0x6397ae23, 0x622463ec, 0xe78930e3, 0x988628f1, 0xbe4b7aa1, 0x6f093870, 0x0700c247, 0x5871878d, 0x69cd6249, 0xfad51eac, 0xeb17a6b0, 0xb8f87529, 0x946feb13, 0x5ad24e95, 0xced0335c, 0x96cc2c84, 0xbdb08c26, +0x6c666d78, 0xc7c51efd, 0xdecb1749, 0x8211826a, 0x3619aefb, 0x246156b5, 0x43dc4721, 0x41bf9b7a, 0x6a6eb6ce, 0x71036321, 0x73cd326c, 0xe5ac93fe, 0x02ce514d, 0xaf65f97e, 0x7ad81fcd, 0x67109c82, 0x8fc22530, 0xdaa010a4, 0x5c771835, 0x2d747b14, +0xa4130884, 0x4ac96a80, 0x9d175068, 0x80725e31, 0x65decdcf, 0x101b2415, 0xe87f34a4, 0xeeda6204, 0x30bcf85b, 0x5e14c46e, 0x7eb31820, 0x2fba2a59, 0x7a7592db, 0x51a4bf6f, 0xe5011ee8, 0xc1cdc54b, 0x1f06d202, 0x20a7dc4e, 0xfe6ccb07, 0x1613ffa3, +0xcc1e6211, 0x347a72a0, 0x29b2f1ef, 0x8ba922dd, 0xdc054604, 0x22c40015, 0x5eb94978, 0xbfd3507d, 0x3f0c835a, 0xf8c99da7, 0xa4be8592, 0x48073bcd, 0xe3a44848, 0xf51a3afd, 0x657340d9, 0x67bd1194, 0xd773b7fe, 0x0263dc5b, 0xa9c0afde, 0x04c68afb, +0xf779e6a6, 0x0dd3a75a, 0x7c7d496d, 0xaba37385, 0xafc87468, 0xea1ce8ff, 0x55623594, 0xd7de3ae8, 0xde669a5f, 0xa0780f69, 0xb4a5a187, 0x4ea26d6d, 0x5cda9523, 0xf7d46bb0, 0xf312e14b, 0xad062525, 0x57ac64d9, 0xd8c3ccff, 0x34d7ffb6, 0xfa07ccea, +0x09b8a0b7, 0x6e05b123, 0xbf7edd6b, 0x4371ca37, 0x0608dbb6, 0x637b9b6f, 0xa670d4df, 0xf3bf6c5d, 0x61184734, 0xab0efe93, 0xa6dd59c9, 0xc8d8e8ea, 0x8b04afcb, 0xc3ae1910, 0x9b1f8bde, 0x291f7cf9, 0x1dc8834f, 0x3bca09a1, 0x9fd90125, 0xe762c2b3, +0xa96d22c8, 0xd17b6c48, 0xadaba833, 0x3dc2d217, 0x4e0fe07b, 0x6ccbe06e, 0x1278f84e, 0x90697a24, 0xb4082c91, 0x756864cc, 0xa21bd332, 0xa2b65e24, 0xb0632b7c, 0x14ddaeee, 0x78bbc396, 0x4c6c3c20, 0x4112166c, 0xb200f727, 0x200a5158, 0x09152da1, +0x471acdda, 0x99d1da93, 0x5a7fc383, 0x10b6a903, 0x77a63581, 0x53c76334, 0xfc0f175c, 0x581c1fd8, 0xb97606dd, 0x867a8587, 0x8da1f96b, 0x3011754d, 0xc3039406, 0xfaaa41fc, 0x12d57558, 0x58b192ce, 0x4cc1b136, 0xd5106ba5, 0x90c4f732, 0xf1713d10, +0x7360bf7a, 0x92a72b69, 0x046b07ed, 0xc76893eb, 0x8d0c747d, 0xe16a1905, 0x7cd0c47b, 0x0b76f1fa, 0x9f748c33, 0x63d61679, 0xb6c67ddc, 0x16be72b5, 0xcabb34b1, 0x2f17a74f, 0xe1c79413, 0x2b7ca0a2, 0x536aee22, 0xccb3ef07, 0xf5b7b7eb, 0xb0cea66a, +0x2dd9f602, 0x0fb07b01, 0x48aab6db, 0x1b6dd5ef, 0x89677390, 0x0d7e2a4c, 0x26028aee, 0x997c5785, 0x3272a916, 0x1bc058f9, 0x390458ec, 0x24ccdba3, 0xeab165e9, 0x78164e80, 0xc50b4fb0, 0xdca8cb12, 0xe7cf4fa5, 0x86d70891, 0xd5bde6b3, 0x8f6fa826, +0xf1dcb006, 0x00ad8d16, 0x55cfb882, 0x9bb206c8, 0x71aeee37, 0xa0d5827f, 0x89cafe86, 0x80dfd327, 0xecb9be5f, 0xfca29a4a, 0x32df2400, 0x1fab5f14, 0x190e09b4, 0x68a0e783, 0xbbb85790, 0x680d6a95, 0x82bc0f7c, 0x3b6784b7, 0x6ac33bd8, 0x2bd12db4, +0xd318b013, 0x841959dc, 0xec143349, 0xfec14611, 0x9661a192, 0xd1d6e15e, 0xf86410b1, 0x147023f8, 0x47b740cc, 0x94aff0df, 0xb9db8bcb, 0xd3b53d05, 0x920aa67f, 0x19a384a2, 0x94027dc9, 0x9dbadd7e, 0xe8d2b9b2, 0x0bdb7cec, 0xce7dbe4a, 0x5701e9cf, +0xca16b9a7, 0x06a556a0, 0xc5a6c2a6, 0x45791181, 0xda0d9db2, 0xbd1d0130, 0x39a9d5fa, 0x770bb897, 0xee77ef12, 0x75c5e9da, 0x45d49c97, 0x36b423ed, 0x7e1e9536, 0x26af07f8, 0xc160485d, 0x4a64e796, 0xe309c55e, 0x1d650e59, 0x22698d03, 0x61b5ca22, +0x51093279, 0xbb15da86, 0xc87565fc, 0x6ea83c35, 0x3d6f5f01, 0xb2ad7a31, 0xd86e41e9, 0x0f1df617, 0x84b4d4ca, 0x00000000, 0xb66bf0ca, 0x3fa10e4c, 0x1ea178fc, 0xac013f47, 0x9c85a590, 0x2139aa0b, 0x40bc0ce8, 0x5ba60c9a, 0x037dab96, 0x9e0a871b, +0x177be3c4, 0x0eeec13d, 0x2e25e22b, 0xe253f292, 0x5c92569f, 0x496697d0, 0xbec1a40d, 0xff8f21f8, 0x57c7ef2c, 0x84e20e74, 0x527c97a2, 0x1c2e5a77, 0xdc39a978, 0x07345a05, 0x00000000, 0xf7a733dd, 0x6f6b67de, 0x56356631, 0x317613ca, 0x0d936aab, +0x38ac88f2, 0x993edd1e, 0x2b9e9aa5, 0xe495218a, 0x2fd76b36, 0xd69e99d6, 0x897164df, 0x62f80d75, 0x879fa5e2, 0x5a548587, 0x4cddef5e, 0x3d17f07c, 0xf161e0c5, 0xf09369d8, 0xfcf28a6e, 0xe12e5904, 0x16896ad9, 0x90e44626, 0xadf3b65a, 0xdf4402ee, +0x28e33133, 0x51013c34, 0x643ede6d, 0xc45e029c, 0x71ca1f22, 0x0c61e3b6, 0x028f228b, 0x0f1c4820, 0xf3eec24e, 0xa9ba47c9, 0xfd000373, 0x2a6c13b8, 0x866d2cff, 0xeb8969aa, 0xea7be0b7, 0xd76c10cb, 0x7dabfc94, 0xb8077715, 0x2caac0a0, 0x60772ffe, +0x7810841a, 0xf21c4b53, 0x1f53f1e1, 0x4be9b55b, 0x2911b82e, 0x3e6a5bea, 0xcc7610b9, 0x9ff80e06, 0xa4292d62, 0x80abffe7, 0xecbd33af, 0xba88559e, 0xbdbc0f9b, 0xb1ddec2d, 0xbb7adc83, 0xd0584ace, 0x199522f9, 0xdb0df37d, 0x34cd6b44, 0x72b7b4b4, +0xd1aac3d3, 0xb5941dbe, 0x0b55b9b3, 0x747167ac, 0xf5281156, 0x13321257, 0x8cca1c51, 0x58dba70c, 0x9d772c8d, 0xddcb2065, 0x69adb4c6, 0x20cb2316, 0x6b22964d, 0x0449f193, 0xa848ced4, 0x6e99eec3, 0x260df00e, 0x478856ed, 0x2482d285, 0xe7e88a1c, +0x30849ad7, 0x353fe259, 0x37b0c0d2, 0x50f3b529, 0x33f93141, 0xbc4e8686, 0x14064852, 0xe8f4c23c, 0x94adb7b5, 0xcd8499a4, 0x7a9fa691, 0x59292e11, 0xcef93232, 0xee321124, 0x7f24de1f, 0xb2a047bb, 0xb9f5fe08, 0x5e1d7414, 0x76fe4527, 0x8e453eda, +0xa75486f4, 0x1867abe4, 0x467adff0, 0x4d2f6643, 0xbf332d10, 0x66b1fce6, 0x43c1a77e, 0xae8e1dcc, 0xefc09839, 0x06c6d318, 0x9bb1ff95, 0x1b1a0072, 0xe3a17b8f, 0x538e1ebf, 0x320bb85c, 0x8a0ccf49, 0xc298d184, 0x2d5849bd, 0xe9064b21, 0xf949f2e0, +0xa6a60fe9, 0x5d60df82, 0xc6d12017, 0x6c16cc48, 0x4fa044c8, 0xf4da984b, 0x27ff7913, 0x7c597589, 0xd5e33240, 0xb02f6530, 0x48941ecd, 0x926b64ad, 0x15f4c14f, 0xc723a90a, 0x8fb7b7c7, 0x11bd30dc, 0xa31d7767, 0x104fb9c1, 0x45077466, 0x73453da9, +0x8d38954c, 0xe567a897, 0x97d01c23, 0xfe7da8e5, 0x685f3ddb, 0x0aa730ae, 0xcf0bbb2f, 0x630a8468, 0xab356542, 0x1ae8896f, 0xaf7c94d1, 0x955f3ea8, 0x2244019d, 0xa19255ec, 0x364249cf, 0xd411bb5d, 0xd2d76845, 0x65cc5770, 0x3f98d2f7, 0xcab0c3a1, +0x8224dd6c, 0xc5ac8b81, 0x83d65471, 0x79e20d07, 0x8883edc2, 0x3ce57961, 0x9622953e, 0x4a1b3c46, 0xa060dcf1, 0x54ba44ba, 0xdeb68bf3, 0x770ccc3a, 0xc1e57a12, 0x25705b98, 0xb352cea6, 0x8bfe4654, 0xe0dcd019, 0x98cc5403, 0x5feffd09, 0x7038963f, +0xfa345976, 0x3a23aa79, 0x85108769, 0xb6e9b628, 0x5548cda7, 0xf655bac0, 0x7b6d2f8c, 0xd325e158, 0x7ed65702, 0x08281225, 0xed4fbab2, 0x6ad01f50, 0x3bd12364, 0xdaff7a60, 0x12c09b4a, 0x674375fb, 0x42332e63, 0x395e01ef, 0xc36a5899, 0xa5dba47f, +0x23b68880, 0x09da9b38, 0xc9cd6837, 0x6de44555, 0x05bb788e, 0x9116cf3b, 0xb71b3f35, 0xe61a0301, 0xd982d1f6, 0xaac7ec5f, 0x7583eeb1, 0xf8bb7bfd, 0xa2effe7a, 0x9399edb0, 0xfbc6d06b, 0x6185a6e3, 0x9a437688, 0xb46694a3, 0x1ddcd36a, 0x815976fa, +0x414e85f5, 0xcb424abc, 0xd87058eb, 0xc017f30f, 0x01f2891d, 0xc83fe12a, 0x44f5fd7b, 0x4e52cdd5, 0x87575a1a, 0xd5319672, 0x2d29387d, 0xd5464598, 0x7ddc969a, 0xafe39fe9, 0x6a627365, 0xe5687742, 0x2a27a77c, 0xf03223d8, 0xe0825926, 0xf2d692bd, +0x45d82997, 0x0f2412d6, 0x070e9f01, 0x6a15a08f, 0x2fcd8918, 0xc7128e03, 0x1254cb9b, 0x38736ce7, 0x909e6c0f, 0x9d5ecfbc, 0x5fa66fdb, 0xbace1899, 0xad072e8c, 0xb000242b, 0x6f885d01, 0x32bd5055, 0x60db9c3d, 0xefa64bf0, 0x5d350d54, 0x7aa5da71, +0xb5ea0a4f, 0x082a8dd7, 0x3a97dd82, 0x8f0a0427, 0x1d70d94d, 0x18ed24c3, 0x75f61b4d, 0xb077f7c1, 0x872089f0, 0xff16310e, 0x227af941, 0xaf944c03, 0x35c41cbe, 0x02e4b165, 0x4a8be8ab, 0x57fb31e6, 0x623f2d58, 0xa0c78d3f, 0xcdab615b, 0x67d5033c, +0xc5f63f66, 0xb77968c0, 0xaa7e6267, 0x7581c8a7, 0x50827d0d, 0xb29346a4, 0x17c93615, 0x2d5eeb97, 0x58a8f0da, 0x6d6cec64, 0xcad22db0, 0xda1584a4, 0x8f7dd7cd, 0x37577e31, 0x48188a24, 0xe8a8d4f1, 0x473c98f2, 0x12231871, 0x10b07afe, 0xd23f0973, +0x2503b5aa, 0xdd1b1ba5, 0x059dfd8e, 0x7836b8fe, 0x85c43895, 0x52111f82, 0x82bd747e, 0x486f59ce, 0x10c7a914, 0xf5d80dbc, 0x152d8770, 0x1a7e464c, 0xf73cbcd9, 0x98c33232, 0xaa09b18d, 0xda62574e, 0x0ab9ef58, 0xe0f58acc, 0x0077d3ea, 0x4045d419, +0x776579c2, 0xc8369cd5, 0x3f7df3e6, 0xea3bb67e, 0x4f161525, 0x7dab4570, 0xfdf2806b, 0x60ac4fd7, 0x302e32da, 0x45affa7d, 0x6886c200, 0x95039181, 0x6d1b3f8e, 0x2a507496, 0xa254efb0, 0xc7655de9, 0xff61e2e4, 0x8059c51b, 0x474b4b18, 0x403207f3, +0xb59dd9a5, 0x927add6a, 0xcddcb2b1, 0x5a4c41bf, 0x551f8083, 0x98b4e1d8, 0x2790d725, 0x4afc3b41, 0x88049b26, 0xf2a14157, 0x085d5e3d, 0x8d9966a8, 0xfd855381, 0x67a2d0d6, 0x220d2aab, 0x802e16f1, 0x6531b259, 0x25746640, 0xfa8bcc80, 0x7712aa28, +0xcaa5fe5a, 0x0f53c13c, 0xe51fa4a8, 0xb2e4954e, 0xd248da99, 0x97e720e4, 0x1f946828, 0x4d8577aa, 0x00000000, 0x20e99bce, 0xea4c6594, 0x50f5aee7, 0x07794ceb, 0x3720addb, 0x8ae02a43, 0xd0dbb816, 0x35b3cf54, 0xc8414f3f, 0x0293628f, 0x155a549a, +0x7f3827ff, 0xbf2436fd, 0x0ace3cb2, 0x728f57a6, 0xf5afde56, 0xe2113ba9, 0x9574426b, 0x5266cc68, 0x55685369, 0xa2233c5a, 0x85b3eb7f, 0xbf53e517, 0xdf88792a, 0xf74b6f33, 0xd0ac6bfc, 0xb70ebb2a, 0xe78cc627, 0xd8f135c1, 0x3f0a200c, 0x27e704cf, +0x9d291c56, 0xb85d7a16, 0xf045f032, 0x4df2a440, 0x3dee9169, 0xc28f738d, 0x189af729, 0x701c3529, 0x1a0995a6, 0x1fe3bbc2, 0xe266e843, 0x32ca83bf, 0x68f111ea, 0xdfffaac0, 0x6fff8eeb, 0x9fcdad33, 0xd886e62b, 0x28c31619, 0xb82aa9fc, 0x3ae00e68, +0x1d070aa7, 0x3d994283, 0xcf3803d4, 0x28b4c5f3, 0xa52da35b, 0xa7c9123e, 0xbdc08798, 0x2fba5af2, 0xf86f7de5, 0xa7bec1d4, 0xc01c1102, 0x8deeb542, 0xa8ed00e8, 0x05ea2e64, 0x5a3b9255, 0xbab9cb73, 0x3059e130, 0x8a97f9a9, 0x578ce20c, 0xdd6cc84f, +0xe7fb15cd, 0x90e9bfe5, 0x9a278357, 0xe8df071b, 0x9a5050bd, 0x42d6b696, 0xbdb75472, 0x0dc0a3b3, 0x6248feb2, 0x887348cc, 0x706be6c3, 0xed35297f, 0x209e4824, 0x78416b14, 0xad70fd66, 0x7ad2099b, 0xa0b05ed5, 0x3804bf0d, 0x654661b3, 0x9fba7ed9, +0x7f4ff415, 0x42a1657c, 0xf818ae0f, 0xa89ad302, 0xed42fa95, 0xcf4fd03e, 0x9790f30e, 0x58df2330, 0x72f8844c, 0xfafc1f6a, 0xefd1981a, 0xc581ec8c, 0x5d42debe, 0x4f61c6cf, 0x0db77059, 0xc06bc2e8, 0xc2f8a067, 0xd7a2f4fd, 0x17bee5ff, 0x82caa794, +0xd7d52717, 0x920d0e80, 0x5fd1bc31, 0xa55a70b1, 0x4136a990, 0x04f3c28a, 0xd0d608c3, 0x0af56c9e, 0x89723c80, 0x5a576128, 0xd4adebf6, 0x7da8e2c7, 0xf0a13d72, 0x9f6e2ef8, 0xbbead9c3, 0x15ef4713, 0x366b27c9, 0x31e39197, 0xb6970303, 0x74aedb32, +0x12efd0f2, 0xec484394, 0x1194a426, 0xddabd203, 0x1be9e907, 0x70d53807, 0x1c615f59, 0x7e5bb7ac, 0xdaab45e2, 0x79d301f2, 0x951363d9, 0x8d09dfb5, 0x91e0a153, 0xc5394fd0, 0xd9581089, 0xefbb16ff, 0x6b3cd100, 0x653a7f14, 0x50a20db6, 0xa703a725, +0x454d4aa5, 0x53d97962, 0x29710c44, 0x4c4b7350, 0xe54e7a61, 0x161c1278, 0x316bb028, 0xb891ad17, 0x4cc352ef, 0x8387501e, 0xd3255da8, 0x4f300784, 0x207735b1, 0x037b74d4, 0x3210c4fc, 0xf3526819, 0x20ff140e, 0x2a0a7890, 0xd75ebe9d, 0x7aa87526, +0x65b25eab, 0x592c15fc, 0xe5c65bde, 0xae059ed0, 0xfadc7053, 0x3b16fd09, 0xeb48d475, 0xc2b1f98e, 0x3298e543, 0x7ed39613, 0x240cd684, 0x41be882f, 0xa78b869a, 0x6cb4675e, 0xf3da49a6, 0x59a43443, 0x46363e71, 0x424ddd44, 0x535158dd, 0xa3f065af, +0xfea79366, 0x2777a250, 0x8e72ab61, 0x2e719ba5, 0xadf6cbbb, 0xf4dade47, 0x48b8b1da, 0x3c166ae8, 0x9c155a2c, 0x68cf846b, 0x98e698a6, 0x070097e1, 0x9668170d, 0xd05e297c, 0xcf4402f1, 0xbf191b49, 0x929bd587, 0xcb3fe1c4, 0x359872a2, 0x73266d6c, +0xfa5451ec, 0x156766ac, 0x5451cf3c, 0x9213f438, 0x238460da, 0x73ae4cd3, 0xd7d69f22, 0x5ea4a3a2, 0xe833a0a1, 0xf92f2538, 0xb5645668, 0xef333740, 0x047be335, 0xc6ca1abb, 0x5adf4097, 0xb264c189, 0xaa7e7de5, 0x45c56b1a, 0x3c9e4b57, 0xae8dbf6f, +0x57a29a57, 0x916880ec, 0xbc626f9d, 0xf452fff8, 0x89fa1d3f, 0x090639f5, 0x96e036b2, 0x61c9bd9e, 0x42c5fcfb, 0x4bc3c50e, 0x775d8e59, 0x6847a5d4, 0xe6bd2f0a, 0x8a094854, 0x2a82592f, 0x2d82cece, 0x502a2c09, 0x4b4be4b1, 0x795b204d, 0xd9d03136, +0x03f3556b, 0xe8bb811e, 0x098e184a, 0x5ddfd776, 0x7d20c378, 0x6f473235, 0xb8198ca8, 0x9fe60f47, 0x6c3c46e1, 0xa3784410, 0x0a7d4d21, 0x18929dd3, 0x705d19b8, 0x986eb919, 0x3f6d1e3c, 0xb19794e2, 0x46be1fce, 0xc142ace5, 0xcfcc234e, 0x62b2c94a, +0xa478d3f1, 0x8a8169eb, 0x5e2c821d, 0xc8449510, 0xde588768, 0xc1ca8d5a, 0x1f920a32, 0x1ce97ee6, 0x5d57f6c9, 0xa9050931, 0x4fb8263b, 0x87749294, 0x9b15cdcd, 0x66410bc0, 0xe24eed80, 0x0788b65e, 0xdd23f3bc, 0x77d5afe6, 0xf9a70487, 0x27ff83ef, +0x2d0aef71, 0xa08b117b, 0x9b9dec72, 0xda23645d, 0x7426fa8d, 0xe1bdb8eb, 0xaaf65c5a, 0x1f1a2b8d, 0x3b9edcb6, 0x008821bf, 0x3fe53f83, 0x840fe640, 0x111c8599, 0x386d89dd, 0xfd54c60d, 0x87fcb32b, 0x8487c7ff, 0x623ae8f5, 0x572abbe8, 0x00000000, +0x6bb4f0bf, 0xbb62f87c, 0xb11fb55d, 0x80740575, 0xccb7579a, 0x36e30676, 0x54d9ee83, 0x3510531d, 0xad7eea04, 0x8d81fe0a, 0x0d7ddac0, 0x169433c7, 0xa00330c4, 0x959b4266, 0x48309065, 0xa98d288e, 0xf7298b2c, 0x0e8e8fab, 0xbcea4e22, 0xf7a1aa93, +0xb5ec77d7, 0x2484f73b, 0x61419c21, 0xe2c6cc3f, 0xa4f0f24e, 0x2ef9ba1a, 0xc6423b04, 0x0e06ae14, 0x1b61c8b8, 0x830f71a1, 0xb2ece036, 0xbf913af6, 0x29f92dfb, 0x9c9d7b93, 0xfe2fb2d9, 0x1267f14d, 0xe6350eb5, 0xd425ca49, 0xfddce7b2, 0xf0291ccd, +0xcc3f7625, 0x7a205499, 0x230c4165, 0xded0a6d7, 0xb61f22bc, 0xc239d831, 0x0df5fb7f, 0x8efa8ade, 0xebc0f5ca, 0x181abc6c, 0x80fc24ca, 0x66c92a7f, 0xecc0622b, 0x38e5a862, 0xcbb7c07b, 0xe1359954, 0xd3ad7c17, 0xc5b16e6f, 0x6fcf138a, 0xc8ccb4af, +0x608ad518, 0xf0af35dd, 0x8ecc15f8, 0x7b981d08, 0x2ab63026, 0xfe15a460, 0x512e2d2e, 0x4aac154a, 0x5bcad3e2, 0x4e628a4f, 0x9b644c55, 0xa0b4badb, 0xc555a29a, 0xe1590301, 0x6afedba0, 0x2f4d0d0b, 0x954e2d9c, 0x7b08ed7c, 0x0bd15ce4, 0x9a51ee7d, +0x30915a1e, 0xe4a23e2c, 0xf10a6781, 0x6ea0b4d1, 0xa5df7782, 0xd596366e, 0xda1905fb, 0xefe392bc, 0x5e31eecf, 0xcbef3327, 0x00000000, 0xaf3b894e, 0xba032097, 0x64d4ba69, 0x2052ceea, 0x1166c6a8, 0xbe5d4fe6, 0xdfe238d6, 0x90b510b1, 0x34cf356f, +0x501b8f06, 0x0f8f3395, 0x4fc7d813, 0x0f1fc3e1, 0xbf68edce, 0x3f8e99ff, 0x81d3d619, 0x4f572867, 0x0e2a61c9, 0x31a4f836, 0xfe855414, 0x2fddfd7f, 0x61bf7730, 0x40d81bf2, 0x9e0f810c, 0xd158a96b, 0x9bf4bc21, 0xb0e7de5b, 0x1a276a38, 0x10c394f4, +0xce84fe7e, 0x44867483, 0xb429415e, 0x2e78af23, 0x452326df, 0x25a9f3c7, 0xf55408f0, 0xf19a97f5, 0xabf5164b, 0x7487dee9, 0x8b3728d5, 0xf03fc5a9, 0x8a028afd, 0x441684f7, 0x3ae554a6, 0xbb3682bf, 0xf5c4f884, 0xd0fdfb37, 0x851d491c, 0x4a3ce53e, +0xc46000b2, 0xde476a8a, 0x8f6947a4, 0xb1428c07, 0x1b12c810, 0xc19b3d9f, 0x3001aa6a, 0x8ba7d8a1, 0x3bd0f68e, 0x7f56820d, 0x2ee85f57, 0x1ab79a4c, 0x9025e0c5, 0x95dedde8, 0x74172e9d, 0xa47a25de, 0x6b5b89fc, 0x0eba91bd, 0xdf72c8a2, 0x045e6f71, +0xd506c61a, 0xaac0b463, 0x1ee9f53d, 0x6e3044a5, 0x45b3d6ab, 0x80e67431, 0x80768445, 0x7e632025, 0x345fc51b, 0xa111e887, 0xef7362c8, 0x4b99b762, 0x417d49ae, 0x3f1e698b, 0x3e2bcba3, 0x15a859ad, 0x9ac11e09, 0x9e9f7178, 0x056bcd59, 0x8428eb34, +0xbff81dba, 0xe5076c70, 0x0a740eb8, 0x2a26c052, 0x7ef3d051, 0x2b83920e, 0x41edb9da, 0x5570425f, 0xe1c9f375, 0x1538a9d9, 0x508b7f72, 0x240ca19b, 0xa54f87f6, 0x04ce9f05, 0x612f8744, 0x253903b3, 0xc10bcdeb, 0x4ef27a3b, 0xd06d0b43, 0x5f044ce7, +0x8ff9b7d0, 0xae0e2b66, 0xafab793a, 0xfa4bcb11, 0xeb2d0db9, 0xc5c552ee, 0xb58c1302, 0x54d51003, 0x6571e835, 0xa18118f3, 0x20c23e9e, 0x6bcb7988, 0x05fb3d2d, 0xe432ce58, 0xf4f15aac, 0x5f94bc93, 0x1fdc5715, 0xf461aad8, 0xa4ead5aa, 0xffb0f63c, +0xeed63094, 0xb0772e2f, 0x140d0bf1, 0x947b8fb4, 0x5ea11ebb, 0x51bedd5a, 0x9faad350, 0xd1c8591f, 0xd4a39446, 0x7a3d4f54, 0x5aff71ca, 0x75b27cc1, 0x601a256c, 0xab65e63f, 0xba93d0e3, 0x7aadbf20, 0xae9edb12, 0xc4f0f0c6, 0xfb7e6939, 0xe06ca129, +0xc0ae9fb7, 0xce140e0a, 0x1e790549, 0x2b13627a, 0x858db968, 0xfadb3b65, 0x249c51ef, 0xa0244aaf, 0xca4a617b, 0xd4336432, 0xc03e6fc3, 0xbba672cb, 0x6f05e68d, 0x01a5525c, 0xcb7fc353, 0xfbee994d, 0xcfb15c56, 0x3a75a4d2, 0x4048eb86, 0x10536480, +0x911042ed, 0x9180b299, 0xcada910f, 0x94eb7fc0, 0x0ae4fecc, 0xcf21ac22, 0xea18af91, 0xdbbc57a7, 0xe0fc515d, 0xe5979c04, 0x55e0b22b, 0xea885fe5, 0x5a6f81be, 0x4b094716, 0x1f4ca761, 0x70d9b198, 0x356a6733, 0x84b81b40, 0x0b41ac90, 0xb4b9b12a, +0x11f636dc, 0x71ec13b0, 0x9f3a2324, 0x704941ec, 0x7fc67279, 0x0135a228, 0x6a6e2bd4, 0xda89f58f, 0x21f79cb6, 0x5b5a2396, 0x6f9516f9, 0x8143266d, 0x717ce3c4, 0xee46c0e0, 0xdb2ca7d3, 0x75228cb5, 0x149dfb85, 0x3b4006fa, 0x8a927a89, 0x21676cc2, +0x1b823864, 0x3ebb3bd7, 0xff200648, 0xb1d27c73, 0xded79afe, 0x5445e077, 0x64444a1d, 0x35fa9747, 0xbecdbf92, 0xb51ce376, 0xebbdfdcd, 0x65e11841, 0x8e5ce58c, 0x0090f074, 0x31340842, 0xaa504417, ] + +d0x6a093170=[ 0xeb, 0x94, 0x6b, 0x12, 0x0b, 0x0a, 0x44, 0x56, 0x13, 0x5c, 0x5f, 0x9a, 0x88, 0x33, 0x68, 0xa7, 0xe0, 0x66, 0xcd, 0x3b, 0x90, 0x9d, 0xa5, 0xe3, 0x76, 0x84, 0xc0, 0x52, 0x86, 0xcb, 0x11, 0x69, 0x83, 0x34, 0x1c, 0x74, 0x6c, 0x37, 0xb1, 0x73, +0x47, 0xff, 0x95, 0x5b, 0x77, 0x98, 0xdf, 0x49, 0x2b, 0x20, 0xac, 0x9e, 0x8b, 0xae, 0xda, 0x79, 0x0f, 0xcf, 0xf9, 0xd8, 0xb0, 0xa1, 0xe9, 0x64, 0x9b, 0xf4, 0x24, 0x28, 0xf2, 0xb9, 0x4f, 0xd5, 0x3f, 0x99, 0x3c, 0x92, 0x27, 0x01, 0x9f, 0x23, +0x1b, 0xd0, 0x3d, 0xc5, 0xa8, 0xa6, 0x4e, 0x3a, 0x9c, 0xe1, 0x80, 0x7c, 0x45, 0x62, 0x65, 0x7a, 0x71, 0x58, 0x2f, 0xf5, 0xdb, 0x7b, 0xe7, 0x09, 0x41, 0x75, 0xe6, 0xc9, 0x15, 0xa3, 0x61, 0x21, 0x03, 0x57, 0x31, 0xc4, 0x5e, 0xfc, 0xef, 0x32, +0xea, 0x91, 0x06, 0x08, 0x2a, 0x70, 0x59, 0xbc, 0xe2, 0xdc, 0xcc, 0xc8, 0x0c, 0xf7, 0x6d, 0x43, 0x48, 0x00, 0x18, 0x1f, 0xd1, 0xf1, 0x4b, 0x39, 0x2e, 0xb6, 0x46, 0x4c, 0xb8, 0x25, 0x5a, 0x04, 0x10, 0xaa, 0x2d, 0xe4, 0x7d, 0x60, 0x51, 0xe5, +0xf6, 0xc6, 0x6a, 0x07, 0xfe, 0xe8, 0xdd, 0xd2, 0x1a, 0x8f, 0x8a, 0x38, 0x7f, 0x4a, 0xbf, 0x6e, 0x40, 0x8d, 0x67, 0x16, 0x97, 0xca, 0x53, 0x81, 0xed, 0x89, 0x19, 0x72, 0xbd, 0x85, 0xa0, 0xb3, 0x3e, 0xb5, 0xb7, 0x50, 0xec, 0xd3, 0x02, 0xd6, +0x42, 0x0e, 0x4d, 0xf3, 0x63, 0xfd, 0xa9, 0xee, 0x6f, 0xfb, 0x05, 0x54, 0x26, 0x7e, 0xc1, 0x29, 0x2c, 0xaf, 0x55, 0xfa, 0xd9, 0x30, 0x93, 0xa2, 0xc2, 0xf8, 0xab, 0x87, 0x35, 0x8c, 0xc7, 0xf0, 0x0d, 0xb2, 0x8e, 0x17, 0xce, 0x1d, 0xd4, 0x96, +0xd7, 0xbb, 0xde, 0xad, 0x82, 0xc3, 0xba, 0xa4, 0x22, 0xbe, 0x78, 0x36, 0x1e, 0xb4, 0x5d, 0x14, 0x5b, 0x9a, 0xd8, 0x13, 0xc5, 0x41, 0xef, 0x2a, 0x9c, 0x26, 0x06, 0x05, 0x92, 0x75, 0xcd, 0x2e, 0x3d, 0x5c, 0x16, 0xb5, 0x09, 0xd0, 0x1a, 0xac, +0x97, 0xde, 0x50, 0xd2, 0xa6, 0xb0, 0x11, 0xa4, 0x12, 0x8d, 0x87, 0x53, 0xd4, 0xa1, 0x02, 0x1f, 0xb7, 0x78, 0x14, 0xe9, 0x3e, 0x6b, 0xf2, 0x0c, 0x7c, 0x20, 0x25, 0x15, 0xaa, 0xba, 0xed, 0xa3, 0xf7, 0xc3, 0xeb, 0xf1, 0x9d, 0xaf, 0x56, 0x5e, +0xc9, 0x91, 0x5d, 0xd5, 0xdf, 0xad, 0x2f, 0xdc, 0x0a, 0x27, 0xb6, 0xfb, 0xfc, 0x03, 0x76, 0xec, 0x28, 0x59, 0x4b, 0x01, 0x57, 0xe8, 0x85, 0x68, 0x19, 0xce, 0x6e, 0x60, 0xcb, 0xf8, 0x73, 0xc4, 0x83, 0x8f, 0xb3, 0x5f, 0x7a, 0x88, 0x39, 0x6f, +0xbe, 0x44, 0x33, 0x34, 0xdb, 0x55, 0xe6, 0x72, 0xa8, 0xf3, 0xfd, 0xe5, 0x80, 0x65, 0x54, 0xe4, 0x84, 0x40, 0xb2, 0x61, 0xbf, 0xfa, 0xc2, 0x10, 0x30, 0x08, 0x52, 0xa2, 0x2c, 0x1b, 0x98, 0x3f, 0x70, 0xd1, 0xa9, 0x0b, 0x8a, 0x9e, 0xf5, 0x63, +0x1e, 0xb1, 0x82, 0xe1, 0x1d, 0x23, 0xc8, 0xea, 0x5a, 0x58, 0xb4, 0x42, 0x4e, 0x6d, 0xca, 0x6c, 0x45, 0x8b, 0xf4, 0xab, 0xdd, 0x89, 0x9f, 0x3a, 0xbd, 0x4a, 0x90, 0xbc, 0x7f, 0xff, 0x2b, 0x4f, 0xc6, 0xe0, 0x8e, 0x49, 0xe3, 0xa5, 0xf6, 0x3c, +0x31, 0xda, 0x77, 0x8c, 0x35, 0x71, 0xe2, 0xd3, 0x07, 0x96, 0x17, 0xd7, 0xf9, 0x7e, 0xa7, 0x7d, 0x21, 0x4d, 0x18, 0x62, 0xd6, 0x64, 0x99, 0xcc, 0x48, 0xb9, 0x24, 0x3b, 0x32, 0x4c, 0x47, 0x46, 0xae, 0xf0, 0xee, 0x36, 0x51, 0xcf, 0x37, 0x74, +0x93, 0x43, 0x69, 0xb8, 0x0f, 0x94, 0x38, 0x79, 0xc7, 0x29, 0xa0, 0xbb, 0x7b, 0x6a, 0x00, 0x1c, 0xe7, 0x66, 0xd9, 0x95, 0xc0, 0x22, 0x04, 0x0e, 0xfe, 0x81, 0x86, 0x2d, 0x67, 0x9b, 0x0d, 0xc1, 0x71, 0x81, 0x4f, 0x83, 0x53, 0x2d, 0x7f, 0x88, +0x36, 0x94, 0x9a, 0x90, 0x8b, 0x15, 0xe1, 0x2f, 0xb4, 0xc2, 0xed, 0xc9, 0xbe, 0xbb, 0xa7, 0x43, 0x7a, 0x69, 0x48, 0x35, 0xd4, 0xc6, 0x1f, 0x25, 0xe2, 0xa9, 0x05, 0x68, 0x42, 0xe8, 0x72, 0xe0, 0xd3, 0x32, 0xee, 0xb9, 0xeb, 0xdd, 0x9b, 0xb0, +0x89, 0xfb, 0x3a, 0x0e, 0xff, 0x5c, 0x4e, 0xda, 0xa8, 0x57, 0xfc, 0xa0, 0x78, 0xfa, 0x8e, 0xd8, 0x1e, 0xc7, 0xac, 0x56, 0x16, 0x9e, 0x5a, 0x52, 0x10, 0x06, 0x9f, 0x93, 0x9c, 0xd1, 0x21, 0x6f, 0x31, 0xef, 0xa1, 0x7d, 0x86, 0x22, 0x0a, 0x59, +0x85, 0xc5, 0x77, 0x3f, 0x19, 0xf1, 0x17, 0x1c, 0xdc, 0x41, 0x63, 0x96, 0x34, 0xdb, 0x33, 0x8d, 0xf3, 0x9d, 0x13, 0x04, 0x3c, 0x29, 0x07, 0x61, 0x73, 0x6c, 0x75, 0x11, 0xa5, 0x92, 0xcc, 0xb3, 0x01, 0xd9, 0xfd, 0x58, 0x2c, 0x38, 0xec, 0x6d, +0xfe, 0xe6, 0x20, 0xc3, 0xde, 0xab, 0x08, 0xdf, 0xf7, 0x24, 0x54, 0x91, 0x03, 0x1b, 0xf5, 0x84, 0x5f, 0x97, 0xa4, 0x5d, 0x80, 0x6a, 0xb7, 0xcb, 0xb2, 0x70, 0xd5, 0x5e, 0x4d, 0xf9, 0x3b, 0x40, 0xb8, 0x51, 0xad, 0x8c, 0xa2, 0x02, 0x0b, 0x0f, +0x95, 0xf2, 0x37, 0x55, 0xe9, 0xc1, 0xaf, 0x2a, 0x6e, 0x28, 0xba, 0xd6, 0x60, 0xb1, 0x76, 0xd0, 0x3d, 0x79, 0xd7, 0x46, 0x50, 0x4b, 0x66, 0x44, 0x2e, 0xb5, 0xcf, 0xcd, 0xa3, 0x64, 0x6b, 0x3e, 0xae, 0xbf, 0xe3, 0x4c, 0x99, 0x62, 0x7c, 0xa6, +0x49, 0xe4, 0x98, 0xf8, 0xbd, 0x14, 0x23, 0xe5, 0x27, 0x39, 0x8a, 0x0c, 0xbc, 0x00, 0xd2, 0x47, 0x7b, 0xc0, 0x7e, 0xe7, 0x18, 0x45, 0x30, 0xc8, 0x12, 0xc4, 0x0d, 0x87, 0x74, 0x26, 0x65, 0xf6, 0xce, 0x1a, 0x1d, 0xaa, 0x82, 0x67, 0xf0, 0x4a, +0x09, 0xf4, 0x5b, 0xb6, 0x8f, 0xca, 0x2b, 0xea, 0x5e, 0x19, 0xb1, 0x52, 0xcb, 0xff, 0x3c, 0x05, 0xea, 0x55, 0xf4, 0xe1, 0x26, 0x9a, 0xb7, 0x5b, 0x30, 0x17, 0xcd, 0x0c, 0x75, 0x3b, 0xfe, 0xae, 0x5f, 0x51, 0xd7, 0xa1, 0x14, 0xfd, 0x86, 0x08, +0x48, 0x42, 0x9f, 0x40, 0x5a, 0x7f, 0x07, 0x96, 0xd6, 0x8b, 0x8a, 0x0a, 0x4d, 0xbb, 0x0d, 0xa9, 0x1d, 0x62, 0x60, 0x69, 0x4b, 0x44, 0x93, 0xc6, 0xeb, 0x29, 0xef, 0xb0, 0x72, 0x4c, 0xb5, 0x54, 0xfa, 0x3e, 0xd2, 0xe8, 0x6c, 0xe9, 0xb6, 0x2c, +0xa3, 0xa5, 0xd5, 0x01, 0x34, 0xed, 0x50, 0x79, 0x95, 0x25, 0xe7, 0x12, 0xe5, 0x85, 0x39, 0x61, 0xc7, 0x7a, 0x22, 0x6b, 0x20, 0xa2, 0xb3, 0xc0, 0xdc, 0xa0, 0x92, 0xaa, 0xe2, 0x28, 0xd4, 0x46, 0xa6, 0x7e, 0x11, 0xd8, 0xcc, 0xbc, 0x04, 0x15, +0x0e, 0x84, 0x6e, 0xf8, 0xd1, 0x3a, 0x97, 0xdf, 0x1a, 0x64, 0x7c, 0x33, 0xac, 0xf5, 0x32, 0xe3, 0xf0, 0x6f, 0x3f, 0x81, 0x41, 0x87, 0x58, 0xee, 0x9d, 0x2e, 0xc5, 0x16, 0xc9, 0x36, 0xf2, 0x5c, 0x89, 0x77, 0x7d, 0x00, 0x94, 0xf6, 0xb8, 0xf1, +0xd3, 0xb9, 0x83, 0x66, 0x10, 0x98, 0xd0, 0x53, 0x80, 0x13, 0x3d, 0x63, 0x74, 0x68, 0x2a, 0x21, 0xec, 0x1c, 0x5d, 0x90, 0xdd, 0xe6, 0xfb, 0xbd, 0xc1, 0x38, 0xcf, 0xce, 0xf3, 0x23, 0xd9, 0xb4, 0x57, 0x43, 0x67, 0x0f, 0x4e, 0xde, 0x8d, 0x76, +0xba, 0x03, 0x49, 0xa4, 0xc4, 0xc8, 0xab, 0x70, 0x65, 0x82, 0x9b, 0x9e, 0x7b, 0xdb, 0xb2, 0xa8, 0x1e, 0xc3, 0x2b, 0xfc, 0x8c, 0x18, 0x0b, 0x9c, 0xc2, 0x09, 0x1f, 0x71, 0x2f, 0x31, 0xaf, 0xbf, 0xda, 0xbe, 0x59, 0x73, 0x8f, 0xf7, 0x45, 0x47, +0x99, 0x2d, 0xe0, 0x02, 0xe4, 0x24, 0xa7, 0x91, 0x37, 0xf9, 0x27, 0x1b, 0x6a, 0x4a, 0x4f, 0x6d, 0x35, 0x8e, 0x06, 0xad, 0xca, 0x78, 0x88, 0x56, 0x6c, 0xe7, 0xa4, 0xde, 0x31, 0xfd, 0x58, 0x77, 0x92, 0xa2, 0xae, 0x8a, 0x48, 0xc7, 0x8e, 0x4b, +0xc4, 0x52, 0xe4, 0x40, 0x9d, 0xb7, 0x23, 0xd8, 0x1d, 0xa1, 0x56, 0xe6, 0xbc, 0x34, 0xc5, 0x7c, 0x9b, 0x1b, 0x83, 0xcb, 0x0c, 0x64, 0x8b, 0x89, 0x61, 0x01, 0xa5, 0x1a, 0xe5, 0xe9, 0xb0, 0xda, 0x20, 0xca, 0xba, 0x54, 0x9e, 0x00, 0xe1, 0x07, +0x6a, 0x0b, 0x18, 0x0a, 0x27, 0x12, 0x6b, 0x1e, 0x04, 0x88, 0x86, 0x29, 0xd3, 0x87, 0x53, 0x8f, 0x51, 0xab, 0x30, 0x5b, 0x79, 0xff, 0xdc, 0xef, 0xaf, 0xd1, 0xb2, 0x97, 0x19, 0xad, 0xb6, 0x66, 0x4d, 0x74, 0x05, 0x45, 0x26, 0x6f, 0xd0, 0xd5, +0xc3, 0xc9, 0xf5, 0xac, 0x35, 0xcc, 0x5f, 0x9f, 0x62, 0x11, 0x84, 0x67, 0x5d, 0x47, 0x4a, 0x37, 0x06, 0x5c, 0x72, 0xb5, 0x78, 0xdf, 0xfe, 0x16, 0xc1, 0x8c, 0x75, 0x81, 0xea, 0x43, 0x69, 0xbb, 0xc6, 0xfb, 0x4f, 0x95, 0xd4, 0x98, 0xf0, 0xa3, +0x3e, 0x36, 0x9a, 0xe3, 0xaa, 0x3f, 0x17, 0x14, 0xdd, 0x2d, 0x80, 0xa0, 0x71, 0xb3, 0x02, 0xc8, 0xf2, 0x65, 0xa8, 0x7b, 0x6d, 0xf7, 0x4c, 0x3a, 0xc0, 0x0e, 0xed, 0xd6, 0x03, 0x7f, 0xcf, 0xf1, 0xe0, 0x4e, 0x68, 0xbf, 0x60, 0xee, 0x82, 0xb8, +0x76, 0x49, 0x93, 0x08, 0x0d, 0xfc, 0xcd, 0x8d, 0x2b, 0x3d, 0xf9, 0x2c, 0xfa, 0x57, 0x96, 0x59, 0xe2, 0x99, 0x7d, 0x5e, 0x63, 0x94, 0x41, 0x10, 0xd7, 0x25, 0x2a, 0xce, 0x73, 0xc2, 0x50, 0x21, 0x24, 0x7a, 0x32, 0xec, 0x15, 0x1c, 0x39, 0x28, +0xb9, 0xa7, 0x0f, 0x90, 0xf6, 0x2f, 0x38, 0x1f, 0xdb, 0x70, 0xd2, 0xd9, 0xeb, 0x22, 0x6e, 0x3b, 0x2e, 0xe8, 0xf8, 0x33, 0xf3, 0xbd, 0x42, 0x44, 0xf4, 0x3c, 0xb4, 0x85, 0xb1, 0x13, 0x09, 0x7e, 0x5a, 0xa9, 0x55, 0x46, 0x9c, 0x91, 0xa6, 0xbe, +0xb3, 0x51, 0x48, 0x3b, 0xa1, 0x01, 0xfd, 0xa4, 0xaa, 0xe4, 0x43, 0x5f, 0x89, 0x80, 0xda, 0x64, 0x9a, 0x10, 0xc3, 0x7a, 0x0c, 0x54, 0x22, 0x20, 0x38, 0x96, 0x28, 0xc9, 0xfe, 0x0e, 0xcf, 0xc1, 0xea, 0x74, 0xab, 0x2f, 0x27, 0xa8, 0xa9, 0x03, +0x37, 0x82, 0x02, 0xd8, 0xb5, 0x4d, 0x25, 0xf0, 0xf4, 0xae, 0xdf, 0xc8, 0x4e, 0xb4, 0x50, 0x76, 0x17, 0x70, 0xed, 0xbc, 0x9e, 0xb2, 0x4f, 0x57, 0x0a, 0x40, 0x68, 0xca, 0xfc, 0xb7, 0x14, 0xa5, 0x09, 0xa6, 0x5c, 0x71, 0x67, 0x93, 0x15, 0x8c, +0xde, 0xb8, 0x86, 0xb9, 0xff, 0xbe, 0x85, 0x8d, 0x31, 0x1e, 0x11, 0x39, 0x90, 0xe5, 0xf9, 0x05, 0x8e, 0x5d, 0x3f, 0x60, 0x98, 0xa3, 0x97, 0x7e, 0x18, 0xf3, 0x7b, 0x77, 0x94, 0x61, 0xdd, 0xf7, 0x45, 0x62, 0x53, 0xc0, 0x65, 0x30, 0x47, 0xf1, +0xd6, 0xe0, 0x7c, 0x0f, 0x35, 0xd2, 0x55, 0x2b, 0xdc, 0x9b, 0x2e, 0xd7, 0xfa, 0x6b, 0xe6, 0xaf, 0xad, 0x73, 0xc2, 0xeb, 0xcb, 0x00, 0xf2, 0x2a, 0xe1, 0x04, 0x4c, 0xcc, 0x41, 0xd1, 0xd3, 0x6f, 0x49, 0x83, 0x52, 0xc6, 0x16, 0x2c, 0x1a, 0x26, +0xbb, 0x9f, 0x8f, 0xfb, 0xf5, 0x1b, 0x32, 0x6e, 0xc5, 0x59, 0xce, 0x63, 0xef, 0x12, 0x88, 0xc4, 0x6d, 0x5e, 0xb6, 0x81, 0x3c, 0xd4, 0x13, 0xbf, 0xa0, 0x06, 0x6a, 0x99, 0xd5, 0xb0, 0xe7, 0x9c, 0xba, 0xf8, 0x79, 0x9d, 0xc7, 0x91, 0x69, 0x58, +0x23, 0x8a, 0x42, 0x2d, 0xe9, 0xbd, 0x1f, 0x5a, 0x21, 0x3e, 0x87, 0x84, 0x75, 0x1c, 0xac, 0xec, 0xd0, 0xb1, 0x56, 0x3a, 0x7d, 0xf6, 0x4b, 0xe3, 0x4a, 0x36, 0xee, 0x33, 0x08, 0x92, 0x29, 0x0b, 0x24, 0xa7, 0xdb, 0x7f, 0x78, 0x6c, 0xa2, 0x1d, +0xcd, 0x66, 0x0d, 0xd9, 0x19, 0x07, 0x34, 0x44, 0x72, 0x46, 0x5b, 0x8b, 0xe2, 0x3d, 0x95, 0xe8, 0x03, 0x39, 0xcf, 0xde, 0xca, 0x47, 0xfa, 0xd6, 0x89, 0x1f, 0x1c, 0x6f, 0xe9, 0x85, 0xd4, 0x3b, 0xa3, 0x11, 0xc0, 0x1d, 0x66, 0xc4, 0xd1, 0x44, +0xb6, 0x16, 0x0e, 0x6a, 0x95, 0xfe, 0xbe, 0x50, 0x87, 0xc6, 0x70, 0xc8, 0xce, 0x00, 0x3c, 0x22, 0xc5, 0xe4, 0x43, 0x74, 0x35, 0x8c, 0xb9, 0x79, 0x25, 0x36, 0xa2, 0x78, 0x65, 0x4c, 0xdf, 0xe7, 0x9d, 0xc9, 0x05, 0x30, 0x69, 0xb8, 0x3e, 0xcb, +0x7b, 0x9f, 0x6c, 0xf7, 0xe0, 0xb0, 0x8f, 0xd0, 0x81, 0x26, 0x27, 0xa8, 0x53, 0xc2, 0x19, 0x0c, 0x9c, 0x1b, 0x13, 0x76, 0xa5, 0x55, 0x2e, 0xe8, 0x5b, 0x73, 0x17, 0xb2, 0x99, 0xf3, 0x91, 0x41, 0x62, 0x7e, 0x04, 0xb7, 0x46, 0xb1, 0xda, 0x77, +0xf8, 0x9a, 0x94, 0x80, 0xa9, 0x5d, 0x2d, 0x57, 0x33, 0x45, 0x82, 0xd7, 0x98, 0xf1, 0xe3, 0x42, 0x0d, 0x8d, 0x59, 0x60, 0x01, 0x1a, 0xfb, 0xec, 0x9e, 0x15, 0x8a, 0xc7, 0xa1, 0xd9, 0xf9, 0x1e, 0x02, 0xcd, 0xeb, 0xba, 0xab, 0x3f, 0x97, 0x2c, +0xad, 0xaa, 0x7d, 0x09, 0xed, 0xac, 0xa7, 0xef, 0x20, 0x6b, 0x07, 0xbd, 0xea, 0x23, 0x34, 0xae, 0x4a, 0x12, 0x92, 0xdd, 0x7a, 0xbf, 0xcc, 0x24, 0x7c, 0xee, 0xdc, 0x08, 0x8b, 0xb4, 0x54, 0xa6, 0x3a, 0x8e, 0xf0, 0xfc, 0x31, 0x5e, 0xe2, 0xff, +0x58, 0x93, 0xe1, 0xc1, 0x32, 0x40, 0x96, 0x6e, 0x86, 0x7f, 0x83, 0x0b, 0xd3, 0x5a, 0xf6, 0x72, 0x4d, 0xd2, 0x5c, 0x67, 0xf2, 0xa4, 0x6d, 0xbb, 0x2f, 0xc3, 0xf4, 0x2b, 0xa0, 0xd5, 0xfd, 0x21, 0x71, 0x90, 0x49, 0x88, 0x0a, 0x37, 0xf5, 0x06, +0x3d, 0x10, 0x4b, 0x52, 0x38, 0xdb, 0x18, 0xbc, 0x48, 0x63, 0xb3, 0x4e, 0x68, 0x61, 0xd8, 0x56, 0xe5, 0x0f, 0xb5, 0x4f, 0x14, 0x84, 0xaf, 0x51, 0x29, 0x2a, 0x28, 0x5f, 0x64, 0x9b, 0xe6, 0x75, 0x38, 0x0f, 0x49, 0x65, 0xbc, 0x46, 0x86, 0x75, +0x30, 0xd7, 0xaa, 0x7e, 0x7b, 0xab, 0x76, 0x23, 0xb2, 0xc4, 0xde, 0xb4, 0xcd, 0x5f, 0xa0, 0xd8, 0x15, 0x28, 0x14, 0xfe, 0xce, 0x43, 0xba, 0x9b, 0x3c, 0x26, 0x3a, 0xe3, 0x1f, 0x1e, 0x1c, 0x63, 0x21, 0xe6, 0x8c, 0xaf, 0x33, 0x84, 0xea, 0xb1, +0x64, 0xf8, 0xf4, 0x5e, 0x68, 0xbd, 0x0b, 0x2f, 0xc2, 0x2b, 0x90, 0x13, 0xcb, 0xb7, 0xdf, 0xf5, 0x1b, 0x8e, 0xf0, 0xc5, 0xa9, 0x7f, 0x20, 0x39, 0xe7, 0xc7, 0x42, 0x0a, 0xf2, 0x41, 0x78, 0x6d, 0xc9, 0x58, 0x56, 0x4a, 0x95, 0x22, 0x40, 0x8b, +0xbb, 0x96, 0xb3, 0xe5, 0xf9, 0xad, 0x3f, 0x9d, 0x6c, 0x50, 0xc6, 0x4c, 0xd3, 0x7d, 0x02, 0xbe, 0xf7, 0x91, 0xb8, 0x10, 0x29, 0x69, 0xd5, 0xfa, 0xb0, 0x62, 0xa3, 0xd2, 0x47, 0x24, 0x94, 0xd0, 0x83, 0x89, 0x2d, 0x73, 0xb6, 0x34, 0x44, 0x54, +0x82, 0xa4, 0x67, 0xc1, 0x3b, 0x08, 0xd4, 0xcc, 0xa6, 0x92, 0xa1, 0x17, 0xf3, 0x8d, 0x70, 0xdb, 0xd9, 0x4e, 0xc8, 0xa8, 0x11, 0xdc, 0x51, 0x0c, 0xae, 0xfd, 0xe2, 0x04, 0x9e, 0x03, 0x57, 0xcf, 0x32, 0xd1, 0x9a, 0x05, 0x3d, 0xec, 0xc3, 0x71, +0xbf, 0x18, 0xdd, 0x2a, 0x52, 0x55, 0x0e, 0x7c, 0x19, 0xe1, 0x6e, 0x1a, 0x31, 0x9c, 0xfb, 0x74, 0x80, 0x5d, 0xfc, 0x09, 0xac, 0x97, 0x5b, 0xff, 0x16, 0x6f, 0x35, 0x27, 0x61, 0xa2, 0x5a, 0x0d, 0x8a, 0x48, 0x7a, 0x12, 0x4f, 0xca, 0x87, 0x5c, +0x6a, 0x88, 0xee, 0x36, 0xd6, 0x9f, 0x6b, 0x25, 0x85, 0xc0, 0x07, 0x4d, 0x2e, 0x81, 0x06, 0x37, 0x72, 0x93, 0x79, 0xe9, 0xda, 0xe0, 0x00, 0xb9, 0x98, 0xf1, 0xa7, 0x8f, 0x3e, 0x01, 0x60, 0xeb, 0xe8, 0xa5, 0x1d, 0xef, 0x53, 0xf6, 0xe4, 0x45, +0x59, 0x99, 0x77, 0x66, 0xb5, 0x4b, 0xed, 0x2c, 0x7a, 0x98, 0xc7, 0x93, 0x4f, 0x47, 0x88, 0x1c, 0xea, 0x60, 0x2a, 0xa1, 0x4b, 0xfa, 0xa4, 0x8d, 0xa0, 0xd9, 0xfd, 0x4e, 0x9d, 0xf0, 0xad, 0x71, 0xa5, 0xd4, 0x2d, 0xec, 0xa2, 0x54, 0xbb, 0xc1, +0x13, 0x76, 0xd6, 0xf1, 0x8b, 0x2f, 0xf3, 0x59, 0x9e, 0x63, 0xc9, 0x1a, 0xbd, 0x6d, 0x0d, 0x2b, 0xf9, 0x6f, 0x5e, 0x1d, 0x3a, 0x48, 0x58, 0x81, 0x82, 0x36, 0xac, 0xfe, 0x50, 0xdd, 0x5a, 0xcd, 0x3c, 0xd0, 0xbe, 0x8e, 0xe6, 0x11, 0x6a, 0x15, +0x1b, 0x79, 0xaf, 0x29, 0x0c, 0x31, 0x0b, 0xc6, 0x34, 0x65, 0xc2, 0xb2, 0x41, 0xb4, 0x53, 0x77, 0xa6, 0x7c, 0xcc, 0xee, 0xed, 0x0a, 0xf6, 0xc5, 0xd1, 0x12, 0xe4, 0xc4, 0xce, 0xcb, 0xaa, 0x45, 0x5d, 0x19, 0x1e, 0x0f, 0xf4, 0x44, 0x94, 0x89, +0xc3, 0x8a, 0x1f, 0x32, 0x9f, 0x80, 0x61, 0x91, 0xeb, 0x57, 0x5c, 0x74, 0x90, 0xd2, 0xb5, 0xbc, 0x00, 0x39, 0x28, 0x06, 0x55, 0x83, 0xd5, 0x17, 0x56, 0xde, 0xc8, 0x6b, 0xa3, 0x02, 0x20, 0x7e, 0x3e, 0x7f, 0x51, 0x9b, 0xd8, 0x64, 0x3d, 0x78, +0xcf, 0x84, 0xfc, 0x22, 0x2e, 0x97, 0x18, 0xb0, 0x92, 0xb1, 0xdb, 0x69, 0x4a, 0xa7, 0xd3, 0x16, 0x43, 0x10, 0x9c, 0x0e, 0xff, 0x42, 0x05, 0x6e, 0xb8, 0x3b, 0xba, 0x35, 0x8c, 0xf7, 0x24, 0xb7, 0x07, 0x33, 0xf2, 0x08, 0x7b, 0x37, 0x95, 0xca, +0x66, 0x4c, 0xe2, 0x96, 0x5f, 0x38, 0xfb, 0xe5, 0xf8, 0x86, 0xd7, 0xe0, 0xc0, 0x75, 0x25, 0xbf, 0xe8, 0xb3, 0xdf, 0x40, 0x21, 0xda, 0x52, 0x49, 0xef, 0x72, 0x46, 0x30, 0x03, 0x26, 0xe1, 0x68, 0x9a, 0x99, 0xe7, 0xe9, 0x27, 0xb6, 0x01, 0xae, +0x4d, 0xa9, 0xdc, 0x62, 0x73, 0xe3, 0x87, 0xa8, 0x23, 0x6c, 0x09, 0x85, 0x2c, 0xb9, 0x70, 0xf5, 0x3f, 0x5b, 0x67, 0xab, 0x8f, 0x7d, 0x04, 0x14, 0x60, 0xee, 0xd1, 0xbc, 0x04, 0xcc, 0x24, 0x39, 0x19, 0xaa, 0xc5, 0xcf, 0x09, 0x4d, 0xb5, 0x80, +0x22, 0xe1, 0xbe, 0xf3, 0x63, 0xa2, 0x33, 0x5b, 0x8e, 0x7f, 0xaf, 0x40, 0xcb, 0x0d, 0xfd, 0x0b, 0xb9, 0x61, 0x95, 0x2c, 0x9d, 0xf4, 0x59, 0xf6, 0xe3, 0x3d, 0x54, 0x0c, 0xb2, 0xb1, 0xa6, 0x3f, 0x8b, 0x6f, 0x88, 0x74, 0x1c, 0xd6, 0x42, 0xe2, +0x48, 0x1e, 0x84, 0xab, 0xfc, 0xc0, 0x07, 0x72, 0xc3, 0x5c, 0x1b, 0x46, 0xc1, 0x92, 0x7b, 0x7c, 0xc8, 0x98, 0x36, 0xcd, 0x03, 0x82, 0xff, 0x94, 0x99, 0x79, 0x4a, 0x8f, 0x68, 0x97, 0x9f, 0xba, 0x13, 0x30, 0x85, 0xa4, 0x5e, 0x28, 0x6d, 0x6c, +0x35, 0x17, 0x2b, 0x58, 0x14, 0x71, 0x47, 0xd9, 0x89, 0xf5, 0xac, 0x4b, 0x69, 0x9a, 0xe6, 0x4c, 0x05, 0xa8, 0xe4, 0xc2, 0xd8, 0x73, 0xdc, 0x29, 0x6b, 0x96, 0xb0, 0xea, 0x5d, 0x2d, 0x32, 0x3e, 0x7d, 0xc7, 0x34, 0xb8, 0x55, 0x5a, 0x2f, 0xa7, +0xf1, 0x64, 0xe0, 0x83, 0xb3, 0xed, 0xbb, 0xae, 0x93, 0x51, 0x78, 0x86, 0x20, 0xd2, 0x27, 0x70, 0x0f, 0x49, 0xf0, 0xc9, 0x62, 0xda, 0xc4, 0x08, 0x91, 0xa0, 0x4e, 0x66, 0x6a, 0x50, 0xf2, 0x10, 0x44, 0x06, 0x2a, 0x5f, 0xdb, 0x4f, 0x23, 0x7a, +0xfa, 0xd3, 0x43, 0x41, 0xb6, 0xa9, 0x3a, 0xce, 0xd4, 0x1f, 0x16, 0x9c, 0x2e, 0x6e, 0xca, 0xe7, 0xfe, 0x8c, 0x67, 0x81, 0xec, 0x21, 0xf9, 0x1a, 0x9e, 0x8d, 0x26, 0x65, 0xe9, 0xd7, 0xd5, 0xb7, 0xbf, 0xb4, 0x9b, 0x77, 0x11, 0xde, 0xa5, 0xf7, +0x01, 0x7e, 0x3c, 0x56, 0xf8, 0x75, 0xdf, 0x18, 0xef, 0xa3, 0x15, 0x02, 0xfb, 0xe5, 0x00, 0xeb, 0x31, 0xad, 0x12, 0xe8, 0x87, 0x53, 0x1d, 0x37, 0x57, 0x8a, 0x3b, 0x45, 0xd0, 0x76, 0x52, 0xdd, 0x0a, 0x90, 0x38, 0x0e, 0xbd, 0xc6, 0xa1, 0x25, +0xbf, 0x7e, 0xe4, 0x1b, 0x67, 0x35, 0x5c, 0x0b, 0x5b, 0x58, 0xbe, 0x4d, 0x2c, 0x06, 0xf0, 0xa9, 0x5e, 0x79, 0x84, 0x2a, 0x99, 0xcd, 0xf7, 0x19, 0x4a, 0xd7, 0x8a, 0x8e, 0x95, 0xf1, 0x3d, 0xec, 0xd9, 0x8f, 0xde, 0x23, 0xcf, 0xf9, 0xe5, 0x6f, +0x33, 0xbd, 0xa7, 0x38, 0xee, 0x08, 0x26, 0xaa, 0xf3, 0xfe, 0x6d, 0x14, 0x16, 0xd6, 0x74, 0xe2, 0x32, 0xdb, 0x6c, 0xd2, 0x07, 0x6b, 0x6e, 0x59, 0xea, 0x9d, 0xe8, 0xd5, 0x68, 0x72, 0x87, 0x37, 0xa5, 0x44, 0x86, 0x15, 0x51, 0x0d, 0x8c, 0xc9, +0x60, 0xc6, 0x9e, 0x81, 0x78, 0xd8, 0x57, 0xa2, 0xaf, 0x91, 0x52, 0x0c, 0xff, 0xca, 0xf4, 0x9f, 0x80, 0x89, 0x70, 0x4b, 0x1e, 0x2d, 0x1a, 0x7b, 0x5d, 0x8b, 0xfa, 0xd1, 0x25, 0xc8, 0xa6, 0x24, 0xbb, 0xc4, 0xab, 0xed, 0xfd, 0x12, 0xc2, 0xe3, +0xef, 0xa3, 0xb3, 0x82, 0xd0, 0x69, 0x64, 0x17, 0xc7, 0xb6, 0xb2, 0xa4, 0xc3, 0x77, 0xae, 0xe6, 0x7f, 0x71, 0xe0, 0x56, 0xb4, 0xc0, 0x28, 0x47, 0x4c, 0x29, 0x2f, 0x46, 0x31, 0xd3, 0x88, 0x63, 0xda, 0xac, 0xf8, 0x3e, 0xdd, 0x11, 0xce, 0x09, +0xd4, 0x9a, 0xdc, 0x0f, 0xa8, 0x40, 0x13, 0x98, 0xa0, 0x92, 0xba, 0xe1, 0x27, 0x5f, 0x53, 0x1c, 0x48, 0x18, 0xe9, 0x5a, 0x1f, 0x7c, 0xb1, 0xf2, 0x83, 0x2e, 0x97, 0x73, 0x03, 0x01, 0x85, 0xfb, 0x05, 0x0a, 0xb7, 0x7a, 0x9c, 0x9b, 0x49, 0x54, +0xfc, 0xbc, 0x90, 0xeb, 0x3c, 0x30, 0x39, 0x0e, 0x45, 0x10, 0x96, 0x66, 0x4e, 0xe7, 0x65, 0x41, 0xb8, 0x3f, 0x6a, 0xcb, 0x94, 0x4f, 0x04, 0xb9, 0x42, 0x00, 0x43, 0xdf, 0x22, 0xc5, 0xad, 0xf5, 0x34, 0xf6, 0x2b, 0x20, 0xb0, 0x75, 0x76, 0x3b, +0x36, 0xc1, 0x3a, 0xa1, 0x50, 0x55, 0x02, 0x62, 0x93, 0xcc, 0x61, 0x7d, 0x1d, 0xb5, 0x21, 0x8d, 0x6e, 0xb7, 0xca, 0xac, 0xbc, 0x9d, 0x88, 0x51, 0x2a, 0x59, 0xf3, 0x46, 0x72, 0x6f, 0xb3, 0xb5, 0x2f, 0x2d, 0x0b, 0x40, 0x28, 0x7a, 0x00, 0xce, +0xde, 0xf4, 0x4b, 0x67, 0x1b, 0x78, 0x86, 0xa6, 0x54, 0x0e, 0x3b, 0x64, 0x17, 0xe1, 0x4d, 0x3a, 0x39, 0x96, 0xd9, 0x38, 0xfe, 0xa3, 0x89, 0x7e, 0x01, 0x8e, 0xea, 0x5c, 0x03, 0xfd, 0x83, 0xfa, 0x68, 0x1d, 0x50, 0xee, 0x8a, 0xe8, 0xb4, 0xa2, +0x3d, 0xe5, 0x1f, 0x94, 0x55, 0x06, 0xa5, 0x74, 0x9b, 0xeb, 0xff, 0x11, 0xf6, 0x07, 0x0d, 0x42, 0xd3, 0x47, 0x98, 0x31, 0x79, 0x6a, 0x02, 0xef, 0x3f, 0xe2, 0x6d, 0x5e, 0x65, 0x97, 0xb9, 0x62, 0xa9, 0xcc, 0x7c, 0xc3, 0xbe, 0x30, 0xd7, 0xf9, +0xba, 0xec, 0x8f, 0x33, 0x35, 0x43, 0xad, 0x1a, 0xaa, 0x36, 0x61, 0xb1, 0x93, 0xcd, 0x25, 0x3c, 0x80, 0x9f, 0x9a, 0x63, 0x95, 0x9e, 0x6b, 0x70, 0x60, 0x82, 0x1e, 0x21, 0xd4, 0x32, 0x45, 0xf7, 0x14, 0x22, 0x05, 0xdf, 0x6c, 0xa0, 0x13, 0xa8, +0xc1, 0x99, 0x4a, 0xfb, 0xae, 0xc5, 0x04, 0xc0, 0xaf, 0x5a, 0xfc, 0xe4, 0x24, 0x69, 0xf2, 0x77, 0x29, 0x3e, 0x85, 0x56, 0x81, 0x09, 0x75, 0x71, 0x19, 0x34, 0xa1, 0x0f, 0xb0, 0xda, 0xbd, 0xe6, 0x2e, 0x84, 0x76, 0x23, 0x4e, 0x44, 0xf1, 0x27, +0x7b, 0x87, 0xbf, 0xb6, 0xc6, 0xe3, 0x48, 0xcf, 0xe7, 0x2c, 0x73, 0xdb, 0x58, 0xd5, 0x8b, 0x91, 0x49, 0x57, 0xa4, 0xf8, 0x7d, 0xc7, 0xf5, 0xf0, 0x18, 0xd2, 0x7f, 0x10, 0xbb, 0x5b, 0x5f, 0xc9, 0xc4, 0xb8, 0x2b, 0x1c, 0x16, 0x52, 0x90, 0xd8, +0xe9, 0x92, 0xd6, 0xc2, 0x4c, 0x0a, 0xd0, 0x0c, 0xd1, 0xe0, 0x37, 0xa7, 0xab, 0x66, 0xb2, 0x15, 0x8d, 0x20, 0x26, 0x12, 0x5d, 0x9c, 0x41, 0x53, 0xc8, 0xcb, 0x08, 0x4f, 0xdc, 0x8c, 0xdd, 0xed, 0xcc, 0xe6, 0x9d, 0xfb, 0x98, 0x1c, 0xb7, 0x47, +0x93, 0x82, 0xc0, 0xc7, 0x54, 0x50, 0x88, 0xad, 0x32, 0x1e, 0xa0, 0x41, 0x1d, 0x3a, 0x70, 0xe9, 0x4f, 0x18, 0x3f, 0xa8, 0xa5, 0x2d, 0x35, 0xb2, 0x31, 0xfe, 0xfd, 0x99, 0x9b, 0x56, 0x6c, 0x7e, 0xc1, 0x68, 0x95, 0xe5, 0xd8, 0x49, 0x94, 0x67, +0xa7, 0x1a, 0x45, 0x8d, 0x90, 0x37, 0xcf, 0x0e, 0xe0, 0x74, 0x84, 0x6a, 0x83, 0xc3, 0xfc, 0x7f, 0xff, 0x43, 0x6b, 0xf7, 0x42, 0x2e, 0x76, 0xec, 0x4d, 0xd2, 0x5d, 0xf8, 0xed, 0x0d, 0x01, 0x04, 0x53, 0x05, 0xa1, 0x71, 0xbf, 0x61, 0x8f, 0x23, +0x33, 0xab, 0x3b, 0xf9, 0xd6, 0x40, 0x2c, 0x96, 0x97, 0x0c, 0x2a, 0xc6, 0x1f, 0x9a, 0xac, 0x4a, 0x86, 0xdc, 0x73, 0xcd, 0x39, 0xde, 0x87, 0x25, 0xb8, 0xd5, 0x9c, 0x91, 0xbd, 0xf0, 0x59, 0xeb, 0x63, 0x3c, 0x08, 0x7d, 0x10, 0xc5, 0x69, 0xe3, +0xb0, 0x6f, 0xf6, 0x12, 0xfa, 0xc9, 0x2b, 0xf3, 0xc8, 0x8e, 0xd4, 0xe4, 0xba, 0x2f, 0x51, 0x29, 0xa3, 0xef, 0x92, 0x77, 0xca, 0x17, 0x24, 0xaf, 0x7a, 0xa6, 0xe1, 0xb1, 0xe7, 0x65, 0x20, 0x03, 0x8a, 0xd1, 0x55, 0x5f, 0x27, 0xee, 0x1b, 0xf4, +0xc2, 0xea, 0x9f, 0xa4, 0xbb, 0xb9, 0x00, 0xb5, 0x5c, 0x36, 0xb6, 0x60, 0x44, 0x07, 0x8c, 0x5b, 0x4c, 0x02, 0x16, 0x30, 0xbe, 0xf5, 0x81, 0xf2, 0x14, 0xb4, 0x19, 0x48, 0xdd, 0x72, 0xe8, 0x5e, 0xcb, 0x0f, 0x66, 0xaa, 0x15, 0x28, 0xbc, 0xa9, +0x5a, 0x52, 0xb3, 0x58, 0x64, 0x85, 0xc4, 0x4b, 0x89, 0xe2, 0xd9, 0x62, 0x79, 0x78, 0xa2, 0xd3, 0x57, 0x13, 0x22, 0x38, 0x11, 0xd7, 0x09, 0x80, 0xae, 0xda, 0x7c, 0x46, 0xf1, 0x4e, 0x3e, 0x21, 0x75, 0x3d, 0x8b, 0x06, 0xce, 0x6d, 0x0a, 0x34, +0x7b, 0xd0, 0x9e, 0xdb, 0x0b, 0x6e, 0xdf, 0x26, 0xc3, 0xb6, 0xd5, 0x41, 0x21, 0x58, 0xa5, 0x7e, 0x37, 0xfa, 0xae, 0xf8, 0xa0, 0xa6, 0xb0, 0x9e, 0x70, 0xf9, 0x63, 0xaa, 0xc8, 0x6e, 0x64, 0x1a, 0x72, 0x0a, 0xce, 0xf3, 0xba, 0x98, 0x09, 0x97, +0x10, 0x53, 0x1b, 0x25, 0xbf, 0x47, 0x60, 0xc4, 0x2f, 0x2e, 0xa4, 0x87, 0x02, 0x91, 0xc1, 0x29, 0x52, 0xfb, 0x9c, 0x22, 0x94, 0x66, 0x7f, 0x81, 0xe3, 0x5f, 0x4c, 0x2a, 0xec, 0x62, 0x4d, 0x50, 0x68, 0x32, 0xe2, 0x92, 0x5a, 0xad, 0x7a, 0xab, +0xcf, 0xe5, 0xe4, 0x78, 0x54, 0x9a, 0x0e, 0x15, 0x7b, 0xd8, 0xea, 0x3d, 0xeb, 0x82, 0xb5, 0x0c, 0x4b, 0xc9, 0xca, 0xbb, 0xf7, 0xde, 0x19, 0xed, 0xcb, 0x24, 0x8e, 0x48, 0x1c, 0x56, 0xee, 0xa7, 0xbd, 0xa8, 0x42, 0xd7, 0x85, 0x8b, 0x3a, 0x5b, +0xb7, 0x59, 0x9f, 0xc0, 0x3c, 0x6f, 0x45, 0x18, 0xbc, 0x6c, 0xd2, 0xfe, 0x14, 0x1f, 0x67, 0x35, 0xdd, 0x7d, 0xda, 0x3e, 0x06, 0x16, 0x1e, 0xcc, 0xa1, 0x89, 0xaf, 0x95, 0xe9, 0xdb, 0x61, 0xd1, 0x6a, 0xfc, 0xf2, 0x75, 0x2b, 0x57, 0x86, 0x2c, +0x74, 0xd3, 0x5d, 0xef, 0x7c, 0x07, 0x79, 0x4f, 0xf5, 0xd0, 0x8d, 0x6d, 0xe7, 0xb2, 0x9b, 0xac, 0xc6, 0x20, 0x84, 0x49, 0xdf, 0x05, 0x03, 0x17, 0xe1, 0x04, 0xe0, 0xe8, 0x11, 0xa2, 0x44, 0x71, 0x0f, 0x4a, 0x4e, 0x00, 0x01, 0xb9, 0xcd, 0xf4, +0xf6, 0x1d, 0xff, 0xb3, 0xb4, 0x26, 0xd9, 0x33, 0x8f, 0xa9, 0x69, 0xc2, 0x6b, 0x40, 0x93, 0x27, 0x46, 0x43, 0x8c, 0x88, 0xb8, 0x73, 0xdc, 0xf1, 0x31, 0x23, 0x96, 0x13, 0x3b, 0x38, 0x9d, 0xc5, 0x80, 0x08, 0x83, 0x39, 0x5e, 0xf0, 0xfd, 0x55, +0x8a, 0xc7, 0x90, 0x51, 0xa3, 0x12, 0x77, 0x30, 0xd4, 0x0b, 0x65, 0x34, 0x99, 0xe6, 0x76, 0xb1, 0x5c, 0x28, 0x36, 0x0d, 0x3f, 0xbe, 0xd6, 0x2d, 0xf1, 0x9f, 0x26, 0xf2, 0x19, 0x20, 0xbd, 0xf4, 0xda, 0xd3, 0x83, 0xdd, 0xef, 0xd9, 0x70, 0xa1, +0xb0, 0x96, 0x2c, 0xa5, 0x80, 0x22, 0x9d, 0x55, 0x47, 0x0a, 0xf0, 0x59, 0xe8, 0xb3, 0xa3, 0xc6, 0xc3, 0x4f, 0xa9, 0xfd, 0xee, 0xc5, 0x24, 0x82, 0x65, 0x72, 0x30, 0x87, 0x7e, 0xcf, 0x7b, 0x89, 0xe2, 0xac, 0x8e, 0x48, 0xb5, 0x52, 0x28, 0x95, +0x99, 0x2b, 0x21, 0x51, 0x35, 0x3f, 0x13, 0xea, 0xeb, 0xd7, 0xfa, 0xc2, 0x8a, 0x2e, 0xf7, 0x0c, 0x61, 0x17, 0xd8, 0x0b, 0xa6, 0x7d, 0x98, 0xc0, 0xbb, 0x18, 0xde, 0xf6, 0x67, 0xa8, 0x04, 0xd1, 0xb9, 0x57, 0xa2, 0x44, 0x36, 0x29, 0x50, 0x86, +0x27, 0x03, 0x02, 0xc7, 0x8d, 0xe4, 0x46, 0x74, 0x43, 0x5a, 0x90, 0x6c, 0x6d, 0x3e, 0x25, 0xff, 0xb6, 0x88, 0xf3, 0xc8, 0xb1, 0xd5, 0x9a, 0x10, 0xfe, 0x6a, 0x3d, 0xb8, 0x92, 0x2d, 0x16, 0x7c, 0x56, 0xb2, 0x38, 0x49, 0xca, 0x66, 0x5b, 0x5c, +0x8b, 0x6b, 0x60, 0x4c, 0x8f, 0x53, 0x3c, 0x93, 0x6f, 0xaf, 0x5e, 0x07, 0x1d, 0x62, 0x76, 0xe5, 0xf5, 0xc1, 0xe7, 0x85, 0xb4, 0x7f, 0x6e, 0x68, 0xc4, 0x1b, 0x3a, 0x3b, 0xcc, 0x12, 0xbc, 0xad, 0x00, 0x05, 0xe1, 0xba, 0x23, 0x73, 0xce, 0x78, +0x91, 0xe3, 0x79, 0x1e, 0xe6, 0x34, 0x97, 0x63, 0x06, 0x37, 0xc9, 0xbe, 0xab, 0x9c, 0x84, 0xd6, 0x32, 0x0f, 0xa0, 0xec, 0x64, 0x33, 0x81, 0xed, 0x1c, 0x7a, 0xfb, 0x41, 0x9b, 0x14, 0x94, 0xa4, 0xdc, 0xd0, 0xdf, 0xbf, 0x1f, 0x11, 0xf9, 0x4a, +0x0e, 0xf8, 0xd2, 0x42, 0x69, 0xa7, 0x71, 0x0d, 0x58, 0x4d, 0xae, 0x4b, 0x09, 0x9e, 0xd4, 0x4e, 0x75, 0x5f, 0xcb, 0x5d, 0xe0, 0x01, 0x31, 0x77, 0xcd, 0x8c, 0xe9, 0x2a, 0xdb, 0x45, 0x40, 0xaa, 0x39, 0x2f, 0x1a, 0xb7, 0x08, 0x15, 0xfc, 0x54, +0xef, 0xd3, 0x4c, 0x57, 0xb8, 0xd8, 0xc7, 0xc4, 0xae, 0xe4, 0x54, 0x36, 0x01, 0xc6, 0xf1, 0xf8, 0x5e, 0xca, 0x29, 0xb1, 0xf0, 0x66, 0x9a, 0xda, 0x0d, 0x46, 0x91, 0x90, 0x1d, 0x76, 0x5a, 0x14, 0xf7, 0x25, 0x53, 0x4d, 0x5d, 0xfb, 0xb9, 0xf6, +0xec, 0x84, 0x81, 0x5b, 0x2b, 0xc2, 0xb6, 0xab, 0x0b, 0xd7, 0xbd, 0x16, 0x9c, 0xf9, 0x60, 0xe2, 0x24, 0xac, 0xaa, 0x7f, 0x92, 0xcd, 0x35, 0x62, 0x82, 0x1f, 0xad, 0xf5, 0xcf, 0xe0, 0xe8, 0x26, 0xe1, 0x9e, 0x68, 0x07, 0xc9, 0x80, 0x7a, 0x69, +0xf2, 0x75, 0xa4, 0x2e, 0xee, 0x9b, 0xfa, 0x6d, 0x1a, 0x4a, 0x0c, 0x49, 0x3a, 0xc3, 0x30, 0x13, 0xaf, 0xd1, 0x43, 0x34, 0x55, 0x45, 0xf4, 0xe3, 0x09, 0x2d, 0x40, 0xce, 0x28, 0xeb, 0x64, 0x70, 0x10, 0x63, 0x1b, 0x6a, 0xa2, 0x19, 0xb0, 0x96, +0x67, 0x89, 0x86, 0x44, 0x5c, 0xe6, 0x4b, 0xc8, 0x11, 0x59, 0xdf, 0x93, 0xd9, 0x04, 0x94, 0x37, 0x88, 0xc5, 0x50, 0x77, 0x97, 0xbb, 0xcb, 0xa6, 0xcc, 0x7c, 0x71, 0xdc, 0x8b, 0xa9, 0x48, 0x51, 0x6b, 0xe7, 0xd2, 0x87, 0xdb, 0xbc, 0x8a, 0x74, +0x6e, 0x38, 0x08, 0xb5, 0x15, 0xb2, 0x23, 0xfd, 0x8e, 0x6f, 0x9d, 0xde, 0x0f, 0x65, 0x47, 0x4f, 0xbe, 0xfc, 0xea, 0x3b, 0x03, 0x85, 0x99, 0x52, 0x1c, 0x12, 0x5f, 0x7e, 0xa3, 0x58, 0xb3, 0x8c, 0x00, 0x8f, 0xdd, 0x0a, 0xba, 0x6c, 0xd5, 0x3e, +0xd6, 0x06, 0xd0, 0x18, 0x32, 0xf3, 0xd4, 0x78, 0x3f, 0xa1, 0x41, 0x61, 0xbf, 0x8d, 0xb7, 0x42, 0x73, 0x0e, 0x17, 0xe5, 0x3c, 0x33, 0x4e, 0x79, 0xc0, 0x72, 0x31, 0xa8, 0x3d, 0xa5, 0x27, 0x2a, 0xb4, 0x39, 0x98, 0x7d, 0xa7, 0x2c, 0xff, 0xc1, +0xed, 0x83, 0x02, 0x2f, 0x7b, 0x22, 0xe9, 0x1e, 0x21, 0xa0, 0x05, 0x95, 0xfe, 0x9f, 0x20, 0x56, ] + +d0x6a099e48=[ 0x56a78bad, 0x0ca4e7a2, 0x574b5dd6, 0xbc131cff, 0x393258e7, 0xf27b8d21, 0x1b2bfa22, 0x03e4e051, 0xf3944ac8, 0xfcd44d3b, 0x7a12f8e0, 0xff33bcf8, 0xeab49752, 0x0f431661, 0x9e09afa8, 0x6e790531, 0x347978ac, 0x3ad5a924, 0x4f875637, 0x5becabe6, +0x2ebd4567, 0xf19c7ce2, 0xb0b4eacf, 0x79f618b1, 0x40c751c4, 0x00031192, 0xbdfcdb16, 0x9c028810, 0xe61070f0, 0xf2789cb3, 0xd386cfb5, 0x8a625279, 0xdecdeffe, 0x23f6652c, 0x58084bb7, 0xcb49d5c6, 0x0d4b204b, 0xfedc7b11, 0x84ce83f1, 0xe5f490a1, +0x7a11e972, 0xbff4ed3c, 0xbff7fcae, 0xc941e3ec, 0x74be2968, 0x21fe5306, 0xd269085c, 0xb2bfcd77, 0xeb5b50bb, 0x54acac15, 0x2f51931c, 0x146bfdd1, 0x2cb5734d, 0x74bd38fa, 0x9149a85b, 0xa738e6dd, 0x872a63a0, 0x914ab9c9, 0x775ac939, 0x3595aed7, +0x3b3a6ecd, 0x0ca7f630, 0x379d98fd, 0xe7fca68b, 0xa87bf0bc, 0x5a036c0f, 0xab9f10ed, 0x178c0c12, 0x76b61f42, 0xc40ac3a7, 0x2d59a536, 0x6f95d34a, 0xc601e41f, 0xe9507703, 0x38de8e9c, 0x38dd9f0e, 0xdf222817, 0xc5e5044e, 0xd0622fe4, 0x6f96c2d8, +0x18cf1a73, 0x55407a6e, 0xc7ed3264, 0x79f50923, 0xcb4ac454, 0xcaa6122f, 0x379e896f, 0xe41b5748, 0x4d8c718f, 0x9fe66841, 0x01efc7e9, 0x6c71331b, 0x1b28ebb0, 0xfd389b40, 0x1923cc08, 0x00000000, 0x020b27b8, 0x8522558a, 0xc409d235, 0x42cf67ee, +0x7819df58, 0xdd2a1e3d, 0x92ae5998, 0x4128962d, 0x21fd4294, 0x90a57e20, 0x92ad480a, 0x8a6143eb, 0x580b5a25, 0x221ab357, 0x39314975, 0x85214418, 0x3596bf45, 0x6d9de560, 0x6332257a, 0xc5e615dc, 0x18cc0be1, 0xa533c165, 0xa6d430a6, 0x9fe579d3, +0x03e7f1c3, 0x8b8d9590, 0x886975c1, 0x0eacd188, 0x40c44056, 0xbc100d6d, 0x2f52828e, 0xe8bfb0ea, 0x4c60a7f4, 0x7bfe2e9b, 0x62def301, 0xa878e12e, 0x4c63b666, 0x4320a007, 0x3b397f5f, 0xab9c017f, 0xbe183b47, 0x0d4831d9, 0x1920dd9a, 0xe41846da, +0xf070aa99, 0x86c5a449, 0x201194ef, 0x15872baa, 0x347a693e, 0x93428fe3, 0xa6d72134, 0x84cd9263, 0x613902c2, 0xa530d0f7, 0x613a1350, 0xa9943755, 0x2219a2c5, 0xdecefe6c, 0x5befba74, 0xcaa503bd, 0x9e0abe3a, 0x7759d8ab, 0xd26a19ce, 0x60d5d4b9, +0xff30ad6a, 0xf3975b5a, 0xdf213985, 0xdcc6c846, 0x5a007d9d, 0x0eafc01a, 0x36714e86, 0xc8ae2405, 0x4d8f601d, 0x2d5ab4a4, 0x7552ff13, 0x93419e71, 0xb3531b0c, 0xd0613e76, 0xbdffca84, 0x4f8447a5, 0xa73bf74f, 0x42cc767c, 0xfcd75ca9, 0x8986b228, +0xc8ad3597, 0x87297232, 0x6d9ef4f2, 0xb15b2d26, 0x178f1d80, 0x6e7a14a3, 0xfd3b8ad2, 0x59e78c5e, 0xb3500a9e, 0xa4dc068c, 0xbe1b2ad5, 0x86c6b5db, 0x9c019982, 0x6c722289, 0x1ac72c59, 0x23f574be, 0xeb584129, 0x2cb662df, 0xe5f78133, 0x1663cbfb, +0x7551ee81, 0x9ded4ff9, 0x0208362a, 0x59e49dcc, 0xe6136162, 0xe8bca178, 0x2ebe54f5, 0xaa73c696, 0x76b50ed0, 0xeab786c0, 0x7bfd3f09, 0xa4df171e, 0xc7ee23f6, 0x4e6b804c, 0x90a66fb2, 0xf19f6d70, 0x781aceca, 0x1468ec43, 0xb1583cb4, 0xf073bb0b, +0x4323b195, 0x1ac43dcb, 0x3ad6b8b6, 0x60d6c52b, 0xb0b7fb5d, 0xfedf6a83, 0xaa70d704, 0x633134e8, 0xdcc5d9d4, 0x4e6891de, 0x15843a38, 0xd385de27, 0xe7ffb719, 0xb2bcdce5, 0xc602f58d, 0x1660da69, 0x412b87bf, 0xe9536691, 0x54afbd87, 0x36725f14, +0x8985a3ba, 0x55436bfc, 0x2012857d, 0xd18ef99f, 0x0f4007f3, 0xd18de80d, 0x886a6453, 0x56a49a3f, 0x9dee5e6b, 0xdd290faf, 0x8b8e8402, 0xa99726c7, 0x01ecd67b, 0x57484c44, 0xc942f27e, 0x62dde293, 0x4304e3e5, 0x91383ecf, 0x16e5fcbf, 0x13c00848, +0xc81abb21, 0x5fb88dfa, 0xd4a6d53e, 0xc3d2b020, 0x875bfd5b, 0x4de91c13, 0x0eedfff6, 0x87ddc270, 0xdcd122dc, 0x8a8fc165, 0x44894d7b, 0xde7978b5, 0xd688b07c, 0x827e09ac, 0xce068c1e, 0xd23cdd2a, 0x547086fb, 0x4d6f2338, 0xc766dd76, 0xdc571df7, +0x4e56e0f0, 0x0d520315, 0x97a236db, 0x89303d86, 0x5e29145b, 0x107ff4ab, 0x4ae28da6, 0x5c077119, 0x42957a44, 0x188e3c62, 0x8c15c971, 0x5f3eb2d1, 0x8faa3592, 0xc0eb73e8, 0xd71929dd, 0x4ed0dfdb, 0x9201fd07, 0x57cf7a18, 0x0cc39ab4, 0x939064a6, +0xc45f1ebe, 0x592285ee, 0x4c7885b2, 0x1d2df7be, 0x5b0ce0ac, 0x00000000, 0x1f85add7, 0x9fd5c139, 0xccaed677, 0xdfe8e114, 0x0b4e342a, 0x4213456f, 0x412a86a7, 0xc4d92195, 0x5d10d793, 0xdeff479e, 0x54f6b9d0, 0x8d026ffb, 0xd8e370a1, 0x9cec02f1, +0x061c373f, 0xd012b868, 0x070b91b5, 0x9be79344, 0x155a005c, 0x19999ae8, 0x0525f4f7, 0x5a1b4626, 0x5d96e8b8, 0x0877f7e2, 0x8a09fe4e, 0x17f25a35, 0x59a4bac5, 0x125191e9, 0x40bb1f06, 0x902f9845, 0x0e6bc0dd, 0x03bffce3, 0x078dae9e, 0x09e66e43, +0x8f2c0ab9, 0x05a3cbdc, 0xd5b173b4, 0x0f7c6657, 0x403d202d, 0xcdb970fd, 0x11ee6d0a, 0x484ad7cf, 0x99c9f606, 0x9e445898, 0x0a5992a0, 0x1f0392fc, 0x8ebd9318, 0xd420ea15, 0xc6f744d7, 0x81c1f54f, 0x4a64b28d, 0xdb5c8c42, 0xd2bae201, 0x1c3a5134, +0x50c4ebad, 0x88279b0c, 0x0c45a59f, 0x1e143476, 0xd8654f8a, 0x9d7d9b50, 0x5b8adf87, 0x46a72839, 0xcab2e148, 0x10f9cb80, 0x80506cee, 0x5155720c, 0x51d34d27, 0xca34de63, 0x8147ca64, 0x4f41467a, 0x949bf513, 0xc2432981, 0x1a26660b, 0xd972e900, +0x4fc77951, 0xd18321c9, 0x864c5bd1, 0xcb2378e9, 0x5042d486, 0xc2c516aa, 0x02a85a69, 0x019199a1, 0x98586fa7, 0xdacd15e3, 0x4cfeba99, 0x9f53fe12, 0x52ea8eef, 0x85f3a732, 0x4b731407, 0x8369af26, 0x08f1c8c9, 0x11685221, 0xdbdab369, 0x58b31c4f, +0x56d8dc92, 0x9287c22c, 0x83ef900d, 0x972409f0, 0x93165b8d, 0xcf9715bf, 0x49db4e6e, 0xc89c840a, 0x1b31c081, 0x14cb99fd, 0xce80b335, 0x8e3bac33, 0x18080349, 0xc17aea49, 0xd79f16f6, 0xd3ad448b, 0x55672071, 0x47b08eb3, 0xcf112a94, 0xcd3f4fd6, +0x0bc80b01, 0xda4b2ac8, 0xcba547c2, 0x069a0814, 0x4736b198, 0x958c5399, 0x4518d4da, 0x5eaf2b70, 0xd32b7ba0, 0xdf6ede3f, 0x85759819, 0x90a9a76e, 0x84623e93, 0xd60e8f57, 0x09605168, 0x9c6a3dda, 0x1774651e, 0x15dc3f77, 0x41acb98c, 0xd1051ee2, +0x8c93f65a, 0x9633af7a, 0x1bb7ffaa, 0xcc28e95c, 0x86ca64fa, 0x0adfad8b, 0x4382dcce, 0x89b602ad, 0x1e920b5d, 0x00863f2b, 0x53fd2865, 0x0dd43c3e, 0x84e401b8, 0x4bf52b2c, 0x440f7250, 0xdd40bb7d, 0x8d8450d0, 0xd5374c9f, 0x526cb1c4, 0x022e6542, +0xc3548f0b, 0x0432527d, 0x941dca38, 0x9dfba47b, 0x96b59051, 0x565ee3b9, 0x1cbc6e1f, 0x459eebf1, 0xd0948743, 0x950a6cb2, 0x1663c394, 0x9b61ac6f, 0x13463763, 0x58352364, 0x9a760ae5, 0x9af035ce, 0x537b174e, 0x98de508c, 0x82f83687, 0xc5ce871f, +0x57494533, 0x1dabc895, 0x5a9d790d, 0x191fa5c3, 0x144da6d6, 0x8b9867ef, 0xd9f4d62b, 0xc548b834, 0x48cce8e4, 0x8b1e58c4, 0xc7e0e25d, 0x46211712, 0xddc68456, 0x0339c3c8, 0x88a1a427, 0xc98b2280, 0x495d7145, 0x994fc92d, 0xc1fcd562, 0xc06d4cc3, +0x9ec267b3, 0x91be01e4, 0x5c814e32, 0x0ffa597c, 0x55e11f5a, 0x80d653c5, 0x1aa05920, 0xc6717bfc, 0x0117a68a, 0x12d7aec2, 0xc90d1dab, 0x04b46d56, 0x8c9991bc, 0xc2bf6f3f, 0xac321cf3, 0x04c7102f, 0x6e3a0dea, 0x79555a73, 0x82d18781, 0xc7a70f33, +0x8d46e19f, 0xc2081119, 0x24dbe346, 0xb4ca2d74, 0xed34fa48, 0x4f4ef086, 0x4b89e0a9, 0x3dfca2e2, 0x32dcbada, 0x0f201838, 0xff43cddd, 0x9f86a82c, 0x20ab8d4f, 0xa27a0ace, 0x9b41b803, 0x9011ce32, 0x5d8eb935, 0x79e22455, 0x4ae1eeac, 0x9a29b606, +0x5949a91a, 0x656a7bdb, 0xb0ba437d, 0xfb33a3d4, 0xba35456f, 0xf4a4c5ca, 0x877e99ab, 0x25b3ed43, 0x00000000, 0xc9586728, 0xdb982e9b, 0x5371d12e, 0x65dd05fd, 0x176f5799, 0x184f4fa1, 0x57b6c101, 0x12c049b3, 0x44a9f891, 0x9f31d60a, 0x01df7023, +0x3c94ace7, 0x56decf04, 0x9a9ec820, 0x8981f1b0, 0xbef25540, 0x52aea10d, 0xe70c827c, 0x40d99698, 0x2f8b9577, 0xc7107115, 0x60721bd7, 0xa99d02d9, 0xd4b836a3, 0xe37cec75, 0x13a847b6, 0x1de0518b, 0xde804e97, 0x830ef7a2, 0x0be70817, 0xba823b49, +0x1607599c, 0x2ee39b72, 0x16b027ba, 0x3853bcc8, 0x2b4c8558, 0x131f3990, 0x86a1e988, 0x00b77e26, 0xd1a056af, 0x61ad6bf4, 0x87c9e78d, 0x7d924a5c, 0x9bf6c625, 0x861697ae, 0xec5cf44d, 0x0b507631, 0x640275de, 0xc887170b, 0xf5cccbcf, 0xed83846e, +0x6b9513c0, 0xfa5badd1, 0x05af1e2a, 0xb47d5352, 0xe6648c79, 0xd40f4885, 0xb5155d57, 0x885e8193, 0xe9f3ea67, 0x1c3f21a8, 0x6a4a63e3, 0xaded6cd0, 0x5896d939, 0x3c23d2c1, 0xc9ef190e, 0x88e9ffb5, 0x94d6de1d, 0xbf9a5b45, 0xccf77902, 0x406ee8be, +0x0f97661e, 0xfe2bc3d8, 0xa7626ac2, 0x8df19fb9, 0x41b1989d, 0x611a15d2, 0x457688b2, 0x5701bf27, 0x4a56908a, 0x73da5c61, 0x783d5476, 0xf413bbec, 0xe89be462, 0x8266f9a7, 0x7cfa4459, 0x1c885f8e, 0x6e8d73cc, 0x393bb2cd, 0xa3a57aed, 0xc830692d, +0x3773a4f0, 0xc6787f10, 0xdaf0209e, 0x771d4c4e, 0x36acd4d3, 0xf1bca5c6, 0xe82c9a44, 0x9eeea629, 0xcc400724, 0x6b226de6, 0x72052c42, 0x5c51c916, 0x76c23c6d, 0xa8f50cdc, 0xa60a64c7, 0x12773795, 0xb165335e, 0xe3cb9253, 0x0e48163d, 0x7c4d3a7f, +0xda475eb8, 0xeceb8a6b, 0xf0d4abc3, 0x3303caf9, 0xa84272fa, 0x33b4b4df, 0xdf5f3eb4, 0x9461a03b, 0x5669b122, 0xdfe84092, 0x4b3e9e8f, 0x441e86b7, 0x53c6af08, 0x60c565f1, 0x4106e6bb, 0x9179c037, 0xac8562d5, 0xa6bd1ae1, 0xcd9f7707, 0xc3601f1c, +0xd5674680, 0x95bed018, 0x9e59d80f, 0x77aa3268, 0xcd280921, 0x9509ae3e, 0x2174fd6c, 0x7d25347a, 0x64b50bf8, 0xf063d5e5, 0x1d572fad, 0x192741a4, 0x59fed73c, 0xe7bbfc5a, 0x04706e09, 0xe2a39c56, 0x6fe57dc9, 0xa7d514e4, 0xd07f268c, 0x83b98984, +0xdb2f50bd, 0x8c2eef9a, 0x17d829bf, 0x6afd1dc5, 0x0eff681b, 0xb1d24d78, 0x201cf369, 0x45c1f694, 0x246c9d60, 0x18f83187, 0xbf2d2563, 0x90a6b014, 0x361baaf5, 0x2f3ceb51, 0x37c4dad6, 0xbbea354c, 0x0a8f0612, 0x4e9180a5, 0xd0c858aa, 0x0518600c, +0x91cebe11, 0x736d2247, 0x89368f96, 0x4ff98ea0, 0xd5d038a6, 0x7675424b, 0x38e4c2ee, 0xfaecd3f7, 0x2e54e554, 0x2a93f57b, 0x3d4bdcc4, 0x2bfbfb7e, 0x6f5203ef, 0xb00d3d5b, 0xe6d3f25f, 0x0a387834, 0xf57bb5e9, 0xfe9cbdfe, 0xde3730b1, 0xf10bdbe0, +0xc6cf0136, 0xa2cd74e8, 0xe9449441, 0x19903f82, 0xbe452b66, 0x25049365, 0xfb84ddf2, 0x2a248b5d, 0x5d39c713, 0x326bc4fc, 0x21c3834a, 0x5821a71f, 0x788a2a50, 0xa31204cb, 0xe214e270, 0x72b25264, 0xb5a22371, 0x01680e05, 0x4e26fe83, 0x398ccceb, +0xc3d7613a, 0x5ce6b730, 0xfff4b3fb, 0xbb5d4b6a, 0xad5a12f6, 0x5219df2b, 0xa92a7cff, 0xd1172889, 0xee124abf, 0xb85342f0, 0x06cdaa3e, 0x93266118, 0x0cc412bf, 0x3618b366, 0x108959a2, 0xe41bf23e, 0xdff1aa3c, 0xa9fac0c1, 0x8574b0cc, 0x0a1f9ac9, +0x616f42f2, 0xc3bce121, 0x372e4abd, 0x47e88a7e, 0xc9b559a0, 0x7ad95a0a, 0xe8c9c2c9, 0x41330208, 0x30d51958, 0x67a2e8cc, 0x6b66fa73, 0xd335b883, 0xfe9b131d, 0xee0468f7, 0x4b2c98c1, 0x9ff451ef, 0x3d27f23c, 0xcf78f39e, 0x7c14f034, 0xb36c03aa, +0x00162248, 0x6dab504d, 0x509a8039, 0xf5a45247, 0xa9ece289, 0x30c33b10, 0x6c9da996, 0x828fe329, 0xa4082ba5, 0x2691eac4, 0x216ab921, 0xd81cdb91, 0xef24b364, 0x9ed48a7c, 0xd5f812bd, 0xf5b2700f, 0x11bfa079, 0xd80af9d9, 0x07ed71ad, 0x66941117, +0x8f7d084d, 0x7c02d27c, 0xe9ff3b12, 0xe2d65800, 0x83b91af2, 0xb497504f, 0x2c8e700d, 0x217c9b69, 0x5761d3dc, 0x773d9326, 0x4013d99b, 0xa528f036, 0x109f7bea, 0x1764280f, 0xae17b16c, 0x1d6d908e, 0x95fde96e, 0xe2c07a48, 0x1644f39c, 0x3bfc7a4a, +0x7befa3d1, 0xce4e0a45, 0xffadeac6, 0x1ba03ab0, 0x8299c161, 0xae019324, 0x9ec2a834, 0x94dd32fd, 0xa3e55a08, 0x0b3f415a, 0x46c851ed, 0xd2156310, 0x06db8876, 0xa8da1b52, 0x2db889d6, 0xb5a1a994, 0x617960ba, 0x4a0c4352, 0xe3e0a1db, 0x85629284, +0xe8dfe081, 0x56572a07, 0x2c985245, 0x0df2eb64, 0x4cd7cb24, 0x4cc1e96c, 0xa53ed27e, 0xe52d0be5, 0x772bb16e, 0x4b3aba89, 0x3bea5802, 0x760b6afd, 0x360e912e, 0x1a80e123, 0x5c5e9286, 0x2687c88c, 0x5ba5c163, 0xded171af, 0x8f6b2a05, 0x27a7131f, +0xa3f37840, 0xbe88ca86, 0x70c6c0c3, 0x992fd999, 0xb84560b8, 0xe3f68393, 0x5a9338b8, 0xc29c3ab2, 0xdec753e7, 0xb4817207, 0x2a55f87b, 0xc5676957, 0x00000000, 0x0120db93, 0xb965bb2b, 0x1c4d4b1d, 0x8e4bf196, 0x0b296312, 0xf492ab9c, 0x88865ba8, +0x6b70d83b, 0x5777f194, 0x4df710b7, 0x89b0a273, 0x5641084f, 0xdfe78874, 0x67b4ca84, 0xe9e9195a, 0xf48489d4, 0x98192042, 0xf25f01a2, 0xf96040f8, 0xfe8d3155, 0x0de4c92c, 0x3c110be7, 0x1c5b6955, 0xc883a07b, 0x6a4621e0, 0xb37a21e2, 0x47fea836, +0x0cd230f7, 0x95ebcb26, 0xc3aac369, 0x6059bb29, 0x07fb53e5, 0x31f5c2cb, 0x9939fbd1, 0xd5ee30f5, 0xc9a37be8, 0x93304350, 0xbe9ee8ce, 0x5d686b5d, 0x604f9961, 0x9fe273a7, 0xa41e09ed, 0x71e61b50, 0x94cb10b5, 0x2daeab9e, 0xc8958233, 0x1d7bb2c6, +0x51ba5baa, 0x83af38ba, 0x2b7523e8, 0x71f03918, 0x1a96c36b, 0x84546b5f, 0x7acf7842, 0x4a1a611a, 0x51ac79e2, 0x3adca1d9, 0x0136f9db, 0x1652d1d4, 0x761d48b5, 0x3d31d074, 0xbfa81115, 0xb24cd839, 0x8e5dd3de, 0xef32912c, 0xc28a18fa, 0xb25afa71, +0x27b13157, 0xf8409b6b, 0x3c0729af, 0x508ca271, 0x5bb3e32b, 0x7d342ba7, 0x6c8b8bde, 0xa2c5819b, 0xd4d8c92e, 0x0a09b881, 0x4de132ff, 0x11a98231, 0x7bf98199, 0xc447b2c4, 0x70d0e28b, 0xb9739963, 0x46de73a5, 0xaf2148b7, 0x5c48b0ce, 0xd2034158, +0xd92a224a, 0x6682335f, 0x6a5003a8, 0xf97662b0, 0x7d2209ef, 0xcf6ed1d6, 0x3aca8391, 0x1bb618f8, 0xbfbe335d, 0xf37fda31, 0x41252040, 0x980f020a, 0x2a43da33, 0xa8cc391a, 0xf24923ea, 0xaf376aff, 0xf856b923, 0x204a62b2, 0xffbbc88e, 0x6dbd7205, +0x205c40fa, 0x31e3e083, 0x373868f5, 0xf369f879, 0xd4ceeb66, 0xce58280d, 0xc451908c, 0x89a6803b, 0xb5b78bdc, 0x921098c3, 0xd93c0002, 0x5a851af0, 0xc5714b1f, 0xd3239acb, 0x4005fbd3, 0x9206ba8b, 0x5d7e4915, 0xe40dd076, 0xe53b29ad, 0x17720a47, +0xa2d3a3d3, 0x2b6301a0, 0x84424917, 0x889079e0, 0xd710c843, 0x2cda04c7, 0x3a965ec3, 0x5068e5a3, 0xfc08d3c6, 0x369fcbf7, 0x287ef9aa, 0x0fad51ea, 0x4242643b, 0x4624bfa7, 0x77796b12, 0x80781453, 0x24b54a6f, 0xcd550773, 0xdfbda01a, 0x8f176348, +0x80ba32a2, 0xf86e085a, 0x3d966770, 0x8fd545b9, 0x12e8a769, 0x00000000, 0xa7699ae2, 0x2377552d, 0x41e6a0e5, 0xf00146f2, 0x6998594f, 0xafc4f2bb, 0x0366e22f, 0x319ff244, 0x5b614924, 0x2011b702, 0xee22525e, 0x7c70c795, 0xc5f86f2a, 0xa069a351, +0x57aafae1, 0xa806edf9, 0xce33e55c, 0x0b09ac87, 0x74ddafcc, 0x122a8198, 0xb5813d8b, 0x53cc217d, 0x15e89eda, 0xdcdb4235, 0x8b71b8d4, 0x663508a5, 0x323b369a, 0xaf06d44a, 0xcef1c3ad, 0x070039b3, 0x913477e4, 0xd0d2d701, 0xa7abbc13, 0xffac1718, +0xd7d2eeb2, 0xf4679d6e, 0x4d2d1320, 0x831ef67c, 0x23b573dc, 0x741f893d, 0x925295cb, 0xed44b071, 0x3ef0855f, 0x96f668a6, 0x8c718167, 0x5807ab0b, 0x0f6f771b, 0xb625f955, 0x6553ea8a, 0x2fbce6e8, 0x1a45cf30, 0x0466db9c, 0x61353116, 0xe14d2545, +0x5ca35666, 0x353b0f29, 0xac603665, 0x0ccbb3c5, 0x84dce93e, 0xbaee4a90, 0x5c617097, 0xfbcacc84, 0xc933dcef, 0x87ba0b11, 0x841ecfcf, 0xf7017f41, 0x88175afb, 0x00c226f1, 0xcd972182, 0x6291f5c8, 0x1ee1325d, 0x0bcb8a76, 0x118e4546, 0xc23a7068, +0x315dd4b5, 0xeee074af, 0xc53a49db, 0xca971831, 0x4989ee4d, 0xab600fd6, 0x91f65115, 0x3e32a3ae, 0x35f929d8, 0xa0ab85a0, 0xa8c4cb08, 0x707952a1, 0x28bcdf5b, 0xb125c0e6, 0x61f717e7, 0x164c5a04, 0xa4cd5e3c, 0xb6e7dfa4, 0x1d87d072, 0x20d391f3, +0xf8ac2eab, 0xff6e31e9, 0xe22bc76a, 0x1a87e9c1, 0x6afebb60, 0x88d57c0a, 0xe5e9d828, 0xd4b40c9d, 0xdb195d77, 0x58c58dfa, 0x5fc5b449, 0x6a3c9d91, 0x4e4bf10f, 0x4e89d7fe, 0x114c63b7, 0x3a547832, 0xea4489c2, 0x39329a1d, 0x7fd4034b, 0x2b181b85, +0x27d3a840, 0x8bb39e25, 0x41248614, 0x03a4c4de, 0x4aef0c62, 0xc69e8d05, 0x1e2314ac, 0xa40f78cd, 0x6591cc7b, 0x428042ca, 0x70bb7450, 0x731fb08e, 0x995b394c, 0xe2e9e19b, 0x695a7fbe, 0xdc1964c4, 0xbe4ab7fd, 0x96344e57, 0x24776c9e, 0x9e99260e, +0x5ba36fd5, 0x39f0bcec, 0xba2c6c61, 0xf367a4dd, 0xc15c9247, 0x3d544181, 0x04a4fd6d, 0x50aac352, 0x2f7ec019, 0x78161c09, 0x27118eb1, 0xaba22927, 0xc2f85699, 0x2c182236, 0xe52bfed9, 0xed869680, 0x086f4ea8, 0x32f9106b, 0xe68f3a07, 0x08ad6859, +0xfccaf537, 0x0c099534, 0xc19eb4b6, 0x9dffc421, 0x152ab82b, 0x5768dc10, 0x7b70fe26, 0xe18f03b4, 0x45425d88, 0x87782de0, 0x494bc8bc, 0x540e3e3f, 0xc9f1fa1e, 0x9afffd92, 0xd4762a6c, 0x7cb2e164, 0xe9226bed, 0xca553ec0, 0xb1e7e617, 0x9a3ddb63, +0xbe88910c, 0xf3a5822c, 0xb94a8e4e, 0x9d3de2d0, 0xaca21094, 0x8cb3a796, 0x46e69956, 0x45807b79, 0x19e10bee, 0xb988a8bf, 0xbd2c55d2, 0x9290b33a, 0xfb08ea75, 0xdbdb7b86, 0xf0c36003, 0x530e078c, 0xb24322c9, 0x19232d1f, 0xf4a5bb9f, 0x5f0792b8, +0xd87fbf58, 0xd37613df, 0x365ded06, 0x6e9860fc, 0x99991fbd, 0xf7c359b0, 0x6253d339, 0x168e7cf5, 0xea86af33, 0x9552ac78, 0xc65cabf4, 0xdf7f86eb, 0x7f1625ba, 0x73dd967f, 0xd010f1f0, 0x07c21f42, 0xd3b4352e, 0x1d45f683, 0x6d3ca422, 0x77bb4de3, +0x83dcd08d, 0x6e5a460d, 0x7bb2d8d7, 0x54cc18ce, 0xd8bd99a9, 0xb5431b7a, 0xbdee7323, 0x4def35d1, 0x4a2d2a93, 0x66f72e54, 0x2bda3d74, 0x6dfe82d3, 0xa3cd678f, 0xb2810438, 0xa30f417e, 0xe9e04d1c, 0x78d43af8, 0x9e5b00ff, 0x95908a89, 0xe64d1cf6, +0xdedc2ae0, 0xf2d0692d, 0x3fd81da1, 0x9b865f3f, 0x0695555f, 0xe791621e, 0xeb0cf031, 0x708aaf0e, 0x761ffa51, 0x2b5d83d6, 0xa8c3d0b1, 0xb1b28c8b, 0xd241b8cf, 0x7beb381c, 0xc669e39e, 0x0aa50256, 0x49c7e7f0, 0x97b60836, 0xcd08748c, 0xed346048, +0x50b6bbca, 0x13799b4a, 0x0d59076b, 0xcccce1c8, 0x1f49cc43, 0x5d427987, 0xbad31b99, 0x2d6513af, 0xecf0f50c, 0x5defbca1, 0x971bcd10, 0x850b0638, 0xd98deafb, 0x85a6c31e, 0x501b7eec, 0x3889ddba, 0xed99a56e, 0x0bcc5234, 0xd3852d8b, 0xd4d4ed90, +0x276dd4df, 0xf8d8ae5d, 0x7cbaf807, 0xf52c6c10, 0x1fe40965, 0x5abe7cba, 0x9c7a5a02, 0x69563612, 0x45f7b0f9, 0xbd82db82, 0x6892a356, 0x65cba43d, 0xeba13517, 0x8f03c148, 0x394d48fe, 0x14859e77, 0x4362e5a6, 0xbceb8be0, 0xb727d9d4, 0x13d45e6c, +0xaf9210aa, 0x0751c01b, 0xb0dbdce9, 0x640f3179, 0xd51078d4, 0xa59ad7da, 0xff896e46, 0x89969417, 0x9aef0f5d, 0xc195e6a3, 0x34144f95, 0xa266d2e7, 0x39e08dd8, 0x215544a6, 0x4e3be2cd, 0x57e77bd1, 0x6237a100, 0x1e8d5907, 0xc0fcb6c1, 0x825ac623, +0x6e07f609, 0x51dfeba8, 0x5bd72cd8, 0x7a82687e, 0x6f6ea66b, 0xf314fc69, 0x2a34d3b4, 0xf3b9394f, 0x9cd79f24, 0x3e1c88e5, 0xb07619cf, 0x714e3a4a, 0xd5bdbdf2, 0xa4f387b8, 0x3f75d887, 0xcb30e4f5, 0x07fc053d, 0xbc464ec6, 0x7a2fad58, 0x496a22d6, +0xa30f8285, 0x19715c3a, 0x8462565a, 0x15ecce15, 0xaefb40c8, 0x2091d1e2, 0xf91c3b19, 0xc05173e7, 0xb6e34c90, 0x9d130a60, 0x629a6426, 0xd2ec7de9, 0x06389079, 0xa3a247a3, 0xf8756b7b, 0xcb9d21d3, 0x90e7c82d, 0xdfb57a82, 0x34b98ab3, 0xe0c0a205, +0xb64e89b6, 0x42a670e2, 0x322cdfec, 0x839e5367, 0xbb178edd, 0x443325bd, 0xb11f49ad, 0xde71efc6, 0x5a13b99c, 0x568e2bb3, 0x4e9627eb, 0x7b46fd3a, 0x33e84aa8, 0x0df4c24d, 0xe1a9f267, 0x9b2b9a19, 0x18180c58, 0x6566611b, 0x1e209c21, 0x4f52b2af, +0xa45e429e, 0xa86e1597, 0x14285b51, 0xbbba4bfb, 0x6eaa332f, 0x76b23f77, 0x0c305709, 0x35d0dad1, 0x19dc991c, 0x7776aa33, 0x8e6a912a, 0x904a0d0b, 0x9dbecf46, 0x0b619712, 0xec5d302a, 0x7d7e6d43, 0xb78a1cf2, 0x77db6f15, 0x5b7ae9fe, 0x12bd0e0e, +0x7c173d21, 0x8fae046e, 0xc700b3fc, 0xcda5b1aa, 0x420bb5c4, 0xc1382385, 0xe73ca738, 0x01c49544, 0xa9aa80d3, 0x71e3ff6c, 0x64a2f45f, 0x893b5131, 0x5c86ecc3, 0xa2cb17c1, 0x2c0c43cd, 0x4fff7789, 0x918e984f, 0x635ef162, 0x00adc526, 0xba7edebf, +0x96df5854, 0xf4453c72, 0xf27dac0b, 0x32811aca, 0x48aeb792, 0x00000000, 0xa90745f5, 0x2bf046f0, 0x449ee09b, 0x2a991692, 0x3eb14dc3, 0x88ffc475, 0x21f88180, 0x27c011f9, 0x2ca186eb, 0x8ec7540c, 0xe06d6723, 0xfee03e24, 0x203c14c4, 0xf581a936, +0x480372b4, 0xf4e8f954, 0xd8e4ba99, 0xea65a053, 0x260484bd, 0xe1043741, 0x51722e8e, 0xd8497fbf, 0x01695062, 0xd47928b6, 0xc6c426b8, 0x26a9419b, 0x63f33444, 0x9a42ca7b, 0xae5685ee, 0x88520153, 0x6fc3634d, 0x3824189c, 0xf9b1fe3f, 0x96729d72, +0x7dd3a865, 0x70276a28, 0x84cf937c, 0xff24ab60, 0x574abef7, 0xa53712fc, 0xe655f75a, 0x18b5c97e, 0xd328e8ad, 0x83339641, 0x69fbf334, 0x683f6670, 0xcc6124ee, 0x357d1ff7, 0xeac86575, 0x33458f8e, 0xaf3fd58c, 0xca59b497, 0x5c2b29e5, 0x91235d69, +0x15410b33, 0x0a08c770, 0xd9202fdd, 0x43cf2080, 0xdf18bfa4, 0x455a75df, 0xcaf471b1, 0xbd2f1ea4, 0x0c9d922f, 0x5623ee95, 0x82f70305, 0xe6f8327c, 0xc7ad76da, 0x2dc8d689, 0x1210cb28, 0xfe4dfb02, 0x62d36a80, 0x1e2b8ddc, 0xafb473dc, 0xf77b0389, +0x42b449bd, 0xc43510db, 0x82d1ed52, 0xb8958331, 0x55cdcde6, 0x58cf7055, 0x78b97432, 0xd7557358, 0x9ca21438, 0x75bbc981, 0x589704e3, 0xed584ed7, 0x42ec3d0b, 0x5cc7b0d7, 0x95f01dbf, 0x5c9fc461, 0x1a6a1eb2, 0xc065a4ef, 0x8b92c38f, 0x66ca8d58, +0xd71c20b4, 0x6f9884df, 0x1721f0ed, 0x4fa7d354, 0x71a22e59, 0xb19ffe00, 0x7ce9c006, 0x334e1352, 0x330740be, 0x0408c082, 0x2d3dea38, 0xafa55486, 0x71b30903, 0xe44314bc, 0x13606383, 0x78a85368, 0x42a56ee7, 0x4bf76760, 0xb5de6d6e, 0xed49698d, +0xa6f75d01, 0x0441936e, 0x6683deb4, 0x4be6403a, 0x4baf13d6, 0xd34c9480, 0x2426b053, 0x51c50d64, 0xb8cdf787, 0x20760467, 0x71fa5aef, 0x203f578b, 0x335f3408, 0x628b1e36, 0x46bc893f, 0xf362e451, 0x0d4bee5f, 0x29352aba, 0x8f8b2457, 0x6bc830eb, +0xabe4c7e8, 0x82c0ca08, 0xc97efe84, 0xa6af29b7, 0x24379709, 0x8298bebe, 0xcd3f6dea, 0xd305c76c, 0xc47c4337, 0xd35db3da, 0x6f89a385, 0x8f9a030d, 0x8b83e4d5, 0xfa79be3a, 0x13381735, 0x2067233d, 0xbc9d43b3, 0xe013a088, 0x6b90445d, 0x78e10084, +0xd314e036, 0xf7325065, 0xfa30edd6, 0x5cd6978d, 0xfe290a0e, 0xcd67195c, 0x370f803c, 0x75e3bd37, 0x005874b6, 0xb5cf4a34, 0x3e14da57, 0xf33a90e7, 0x62c24dda, 0xa6e67a5b, 0x95a86909, 0xc937ad68, 0x3a554939, 0xd7445402, 0x86815966, 0x0d02bdb3, +0xabbcb35e, 0x66dbaa02, 0x09520987, 0x091b5a6b, 0xbc8c64e9, 0x98e38756, 0xe40a4750, 0x55dceabc, 0x3e4caee1, 0x75f29a6d, 0x46adae65, 0x202e70d1, 0xb8dcd0dd, 0x3e05fd0d, 0x090a7d31, 0xc07483b5, 0x3e5d89bb, 0xde165d85, 0x55849e0a, 0x8fd350e1, +0xbcc53705, 0xc96fd9de, 0xf76a24d3, 0x0419e7d8, 0xe41b600a, 0xf32bb7bd, 0x98aad4ba, 0xb1c78ab6, 0xf723773f, 0xd70d07ee, 0xb5973e82, 0xe05af364, 0x1e62de30, 0x98f2a00c, 0x1768a301, 0xabf5e0b2, 0x137144d9, 0x0d139ae9, 0x4bbe348c, 0x6692f9ee, +0x86907e3c, 0x3757f48a, 0x2d2ccd62, 0x246fe3bf, 0x588623b9, 0x4fee80b8, 0x91f8dd3d, 0xe04bd43e, 0xfa689960, 0x371ea766, 0xb18ed95a, 0x1a7b39e8, 0x004953ec, 0x828999e4, 0x1a234d5e, 0x95b94e53, 0x1a326a04, 0x00000000, 0x0011275a, 0x86d92dd0, +0x0d5ac905, 0xc9268a32, 0x58de570f, 0x3a1c1ad5, 0xf373c30b, 0x9ceb47d4, 0xda1e9d07, 0x75aaeedb, 0x1730d7b7, 0x1e3aaa86, 0xb58619d8, 0x4fb6f40e, 0xda0fba5d, 0x7cb1b4b0, 0xa2b6ce6f, 0xaffd2030, 0x8bcab739, 0x29240de0, 0xb884a46b, 0xfe717eb8, +0xfe382d54, 0xde5f0e69, 0xc46d646d, 0xa2a7e935, 0x7cf8e75c, 0x6fd1d733, 0x6b816307, 0x95e13ae5, 0x519d79d2, 0x297c7956, 0x9cb33362, 0xcd2e4ab0, 0x6bd917b1, 0xe9508e55, 0x2d74b9d4, 0xed111d3b, 0x4fffa7e2, 0xb1d6adec, 0x518c5e88, 0xde4e2933, +0x46f5dad3, 0xda46e9b1, 0xe45233e6, 0xe00287d2, 0xc02cf703, 0xc4243781, 0x7ca093ea, 0x331667e4, 0x0450b434, 0xc03dd059, 0x09432edd, 0xa6be0eed, 0x3a0d3d8f, 0x91b18ed1, 0x629a396c, 0x91a0a98b, 0x8fc277bb, 0x78f027de, 0xafec076a, 0x8bdb9063, +0xcd763e06, 0xed003a61, 0x86c80a8a, 0xfe6059e2, 0x1e73f96a, 0x2d659e8e, 0x3a446e63, 0xa2eebad9, 0xde077adf, 0xbcd4105f, 0xe941a90f, 0xe919ddb9, 0x42fd1a51, 0x98bbf3e0, 0x46e4fd89, 0x91e9fa67, 0x3746d3d0, 0x71eb7db5, 0xe908fae3, 0xda57ceeb, +0xabad9404, 0x9cfa608e, 0x51d42a3e, 0x296d5e0c, 0xa2ff9d83, 0x1779845b, 0x247ec4e5, 0x5c8ee33b, 0x5595b950, 0x1329306f, 0xfa21ca8c, 0x6fc0f069, 0x1d2b170d, 0x8bf8fc02, 0x4c8469b7, 0xa240205a, 0x832fe3b3, 0xe28e81a5, 0xda5782b8, 0xc2d5014c, +0x3493cb55, 0x00000000, 0x50aa50b1, 0xbf6b3757, 0x831e8eb8, 0x19b6c0f4, 0x755844a1, 0x60952116, 0xce9fc904, 0xfe91d5a8, 0xca021efd, 0x09d231ba, 0xf743e412, 0xf2db1de0, 0x1064f14e, 0xea599e14, 0x1c2e3906, 0x934b12fd, 0x5978610b, 0x8accbf02, +0x587d4f00, 0x35a78855, 0x6debaa5e, 0xaa973feb, 0xd62c27fb, 0x0d4fe643, 0xb78d45ed, 0x5cd1f5f2, 0x313a5fac, 0xe7167857, 0x14c84bbc, 0xf7728919, 0xaaa652e0, 0x2989b153, 0x39ed401d, 0x68423ea7, 0xff94fba3, 0xab9211e0, 0x8afdd209, 0x18b3eeff, +0x2c2025aa, 0xd72909f0, 0x0c4ac848, 0x509b3dba, 0x6408f6ef, 0x5dd4dbf9, 0x64399be4, 0xdefb384a, 0xdb63c1b8, 0xb321ff1f, 0xe3bac2a5, 0xe613565c, 0x41fae2ff, 0xf677a712, 0x6cee8455, 0x4819be4e, 0xca3373f6, 0x8f5446f0, 0x29b8dc58, 0x1d1a7a06, +0x1161df45, 0x694710ac, 0x97d6c504, 0x3c44d4e4, 0xfb092c5a, 0x9bad6047, 0xefc167e6, 0xfa3d6f5a, 0x8686774a, 0x87b2344a, 0x54378748, 0x6ddac755, 0x3d7097e4, 0xe727155c, 0xb6b906ed, 0x97e7a80f, 0xa6ec9aa8, 0x0598f9f2, 0x4828d345, 0xa2714d51, +0xe38bafae, 0x10559c45, 0x4db02ab7, 0x288c9f58, 0x687353ac, 0xdb52acb3, 0x14f926b7, 0x51af7eba, 0xa6ddf7a3, 0x38e86e16, 0x205b80e9, 0xae3b8519, 0xc77c95b5, 0x7826cfe9, 0xceaea40f, 0x2c1148a1, 0x70f1d058, 0x01052e0b, 0xbf5a5a5c, 0xcfab8a04, +0x24c65710, 0x79128ce9, 0xd71864fb, 0xcb0730f6, 0x303f71a7, 0x08e672ba, 0x216fc3e9, 0x584c220b, 0x8e6005f0, 0x215eaee2, 0xda66efb3, 0x08d71fb1, 0x7817a2e2, 0xae0ae812, 0xc3e1424c, 0x01344300, 0xe2bfecae, 0x28bdf253, 0x05a994f9, 0x8f652bfb, +0x25c3791b, 0x70c0bd53, 0xeef524e6, 0xffa596a8, 0xeb6ddd14, 0xb215bc1f, 0xa7d8d9a8, 0x206aede2, 0x519e13b1, 0xd61d4af0, 0xb3109214, 0xbe6e195c, 0x24f73a1b, 0x9e04f4be, 0x61900f1d, 0x15fc08bc, 0x653cb5ef, 0x71c59358, 0xa374635a, 0x4d8147bc, +0xd3b4de09, 0x650dd8e4, 0xea68f31f, 0x746c07a1, 0x44621b0d, 0x1987adff, 0x821ba0b3, 0x44537606, 0x09e35cb1, 0x60a44c1d, 0x40ffccf4, 0x04acbaf2, 0x924e3cf6, 0x25f21410, 0x4556580d, 0x9f30b7be, 0xeff00aed, 0xf2ea70eb, 0x1150b24e, 0xaf0fc619, +0x45673506, 0xb224d114, 0xeec449ed, 0xcb365dfd, 0x756929aa, 0xfea0b8a3, 0x69767da7, 0x3d41faef, 0xfb384151, 0x96d3eb0f, 0xd385b302, 0x927f51fd, 0x745d6aaa, 0x5ce098f9, 0xa7e9b4a3, 0x3596e55e, 0x41cb8ff4, 0xf3ef5ee0, 0xbaf3cea5, 0xc74df8be, +0x00316d0b, 0x1c1f540d, 0x6cdfe95e, 0xc3d02f47, 0x38d9031d, 0x937a7ff6, 0x5503c448, 0x310b32a7, 0xbbf6e0ae, 0x5de5b6f2, 0xfa0c0251, 0xc2e46c47, 0x15cd65b7, 0xbbc78da5, 0x8e5168fb, 0x491c9045, 0x049dd7f9, 0xcf9ae70f, 0x8bc99109, 0xb7bc28e6, +0xd2809d09, 0x9a992347, 0xf646ca19, 0xdeca5541, 0xdffe1641, 0x7dbe361b, 0x9b9c0d4c, 0x86b71a41, 0x822acdb8, 0x96e28604, 0xf3de33eb, 0x5406ea43, 0x59490c00, 0xe6223b57, 0x61a16216, 0x4cb504bc, 0x9aa84e4c, 0x492dfd4e, 0xc679bbbe, 0xbac2a3ae, +0x3c75b9ef, 0x7c8a751b, 0x5532a943, 0x300e1cac, 0x0c7ba543, 0x39dc2d16, 0x2d1466aa, 0xdfcf7b4a, 0xd2b1f002, 0x0d7e8b48, 0x9f01dab5, 0x7d8f5b10, 0x9e3599b5, 0xaba37ceb, 0x87835941, 0xc648d6b5, 0x34a2a65e, 0xbe5f7457, 0xb6886be6, 0x7923e1e2, +0xeb5cb01f, 0x7cbb1810, 0x40cea1ff, 0x71f4fe53, 0x2d250ba1, 0xaf3eab12, 0x188283f4, 0xa3450e51, 0x49a06b43, 0xb3b9e584, 0xe750d33d, 0x3c6d9f15, 0x2ab33b00, 0x23ce8cbb, 0x09ab9e96, 0x37fa66fa, 0xabec3b7e, 0xc182dc86, 0xb82e1c6b, 0x90a14012, +0x6d982aac, 0x543f1f94, 0x9c165d84, 0xe5ba9d69, 0x05caaa2d, 0x95bdc312, 0x5a624c56, 0x723b3902, 0x1883f7d7, 0x16088d38, 0x75cdf456, 0xa5674191, 0xbde4b646, 0x300cabae, 0xaef0b87e, 0x70075e7b, 0xacccdf07, 0xc8ff6b3d, 0x4e56a617, 0xeefb4dab, +0x56d551c0, 0x13140e38, 0xcac30c44, 0xff050dc7, 0x8495aa53, 0x53c9d2c0, 0x24ee68c2, 0x3e51f86c, 0x1abf90ae, 0x423792ac, 0x58880202, 0xc6a238ff, 0xebe7ceab, 0x9efc13d0, 0x351028ae, 0x47fd3881, 0x2f79912d, 0xd78a51be, 0x99dcf7a9, 0xd9d7027c, +0x97578d46, 0x66d9fa6e, 0x45c15ff8, 0x9077693f, 0x472b11ac, 0x79acc0ed, 0x815f007e, 0xac1af62a, 0x1a69b983, 0x83636707, 0xd75c7893, 0x8f0253bc, 0xc44876ab, 0xa906752a, 0x0cb71d96, 0xe0a61e69, 0x28597554, 0x3e87d141, 0x867fe407, 0x68528081, +0x0e5d53c2, 0xa5b168bc, 0x451776d5, 0x00000000, 0x42e1bb81, 0x9781a46b, 0x39711c15, 0x6f7264f8, 0x585e2b2f, 0xa07bc291, 0x3b9b5241, 0x1d495dfa, 0xcf09a669, 0x0e8b7aef, 0xbd329f6b, 0x1855defa, 0xae269153, 0x990ade84, 0xca152569, 0x4976426e, +0xeb31e786, 0xcfdf8f44, 0x6884a9ac, 0x3cbbb638, 0x7c666ac0, 0xb44f28d0, 0x924b0e46, 0xc3bebbff, 0x13c22715, 0x023c6779, 0x5f7ecf56, 0xcd35c110, 0x39a73538, 0xf1585e05, 0x70d17756, 0xf6ae9351, 0x26042696, 0xa9d05c07, 0xdbeb6505, 0x097db7bb, +0x051c8300, 0xb153abd0, 0xecc72ad2, 0x54e936b9, 0x4b4a2517, 0xf492f428, 0xf444dd05, 0x72ed102f, 0x11fe406c, 0x0b97f9ef, 0x51f5b5b9, 0xa0adebbc, 0x2d93df79, 0xa78d0fc5, 0xb8f83546, 0xc49e5f86, 0x1434ea41, 0xe0703744, 0x400bf5d5, 0xf678ba7c, +0x7e8c2494, 0x81892953, 0xc67411d2, 0xcde3e83d, 0xfacfa7ea, 0x612f373a, 0xd5601fea, 0x797ae9c0, 0x5fa8e67b, 0xc36892d2, 0x63c5796e, 0xfd396abe, 0x7b90a794, 0x4b9c0c3a, 0x4e808f3a, 0xe90d80ff, 0x2fafb800, 0x2318a596, 0x3230ccd7, 0x9b36b9fd, +0xdef7e605, 0xd296d2be, 0x40dddcf8, 0x531ffbed, 0xee2d6486, 0x7b468eb9, 0x11286941, 0xb49901fd, 0xe24c503d, 0xbfd8d13f, 0x560378ed, 0xde21cf28, 0xab3a1253, 0x26d20fbb, 0x9cc074a9, 0xe29a7910, 0x956bea3f, 0x8d3e34c5, 0xba127b12, 0x86a9cd2a, +0x4c6ac16e, 0x243841ef, 0xf18e7728, 0x7cb043ed, 0x5ab4657b, 0x5d42a82f, 0x35c60183, 0xb6734fa9, 0xbac4523f, 0xf8f3c093, 0xfa198ec7, 0xdc1da851, 0xc154f5ab, 0x9e2a3afd, 0xc8294210, 0x5d948102, 0x16dea415, 0x6fa44dd5, 0x2a65122d, 0xd5b636c7, +0xd240fb93, 0x64e59d17, 0xf3b21051, 0xe786fa10, 0x0c6134bb, 0xe9dba9d2, 0x7727ba02, 0xd9012b51, 0x1fa313ae, 0x63135043, 0x77f1932f, 0x2d45f654, 0x51239c94, 0x6a6ee7f8, 0x8a1ed0bc, 0x8ac8f991, 0xd0aab5c7, 0x02ea4e54, 0x8de81de8, 0x2124c2ef, +0xb18582fd, 0x3b4d7b6c, 0x372c4fd7, 0x32e6e5fa, 0xffd324ea, 0xa2918cc5, 0x1d9f74d7, 0xd07c9cea, 0x7e5a0db9, 0xdccb817c, 0x1f753a83, 0x288f5c79, 0x6433b43a, 0xf364397c, 0x8fd47a91, 0x4cbce843, 0xb6a56684, 0x6ab8ced5, 0x14e2c36c, 0xa75b26e8, +0x6d4e0381, 0x21f2ebc2, 0xdb3d4c28, 0x660fd343, 0x88f49ee8, 0xe56cb444, 0xfdef4393, 0xa247a5e8, 0x8822b7c5, 0x30da8283, 0x0720e479, 0xec1103ff, 0xb36fcca9, 0x83b54e2a, 0x8443837e, 0x0b41d0c2, 0x00d6292d, 0x9be090d0, 0x07f6cd54, 0x61f91e17, +0x929d276b, 0xf825e9be, 0xbf0ef812, 0x751bdd7b, 0x1b7a0d73, 0xe7c216fb, 0x38d14785, 0x4d555989, 0xc99d3c75, 0x9b78c0ca, 0x355bd4c2, 0xb8ad7903, 0x369a7265, 0x3fda4967, 0x118563e9, 0xbb122c9b, 0xe7bce5c4, 0x070b0ee2, 0xe3764d81, 0xf2f32e68, +0xd62d9943, 0x15313893, 0xa71ddc35, 0x75841e0c, 0xb193b13e, 0x75faed33, 0x3b10e122, 0xae231408, 0xb559197b, 0x0e35c6df, 0xb6e64ce3, 0x7cc4250e, 0x8df6adc1, 0xf639862d, 0x31ef8fb8, 0x04b45b7a, 0x69f51d9d, 0x6a34bb3a, 0x8a83501c, 0xb527ea44, +0xc417af32, 0x1b04fe4c, 0x0aff6e9a, 0x807c3e86, 0x8e370b66, 0x11fb90d6, 0x67c0db42, 0x7bcf2bec, 0x36e4815a, 0x2e5f2a8e, 0xaae9bc4d, 0xe0c91819, 0x3b6e121d, 0xa4dc7a92, 0x6efe137f, 0xdcd2f7d9, 0x43609f56, 0xb8d38a3c, 0x4a20a454, 0xd299c239, +0x9fcc9bb0, 0xf28ddd57, 0x60b5269f, 0x5bdb3482, 0x6a4a4805, 0xf80c40f2, 0xeefcdec6, 0xcee8c1a8, 0x40dfcace, 0x78707e74, 0x515aa927, 0xa016d2d7, 0x1c0ff0ae, 0xb2521799, 0x5864611a, 0x8d885efe, 0x47aa3713, 0x954d0615, 0x0e4b35e0, 0xa06821e8, +0x9187ae50, 0xea367683, 0xdbd9f93b, 0x2aeb71f4, 0x47d4c42c, 0xee822df9, 0xc7d60995, 0xc31ca1d0, 0x09403b02, 0xb698bfdc, 0x49e102f3, 0x893c0584, 0x98c79552, 0x1fb0a536, 0xf5f8208a, 0x9238fbc8, 0x83c36b1e, 0xcd29670f, 0x9fb2688f, 0x924608f7, +0xa956e9d5, 0xa3a9874f, 0xaa974f72, 0xbb6cdfa4, 0x98b9666d, 0xe9f7d024, 0xd12697a1, 0x7cbad631, 0xd158649e, 0x5ba5c7bd, 0x352527fd, 0xdcac04e6, 0x647f8eda, 0xdf6da241, 0x630a7307, 0xfbcde655, 0xdba70a04, 0x6e80e040, 0x55900162, 0x84c865fc, +0xff074e10, 0x0df46078, 0x0a819da5, 0xed438b5e, 0x23d5b9c9, 0x0775fddd, 0x9c0d3d17, 0xf13288cf, 0xca2269ed, 0x562f54fa, 0x3250da20, 0x40a139f1, 0x4415628b, 0x4e94ff2e, 0x2954246c, 0x83bd9821, 0x6d3fb5d8, 0x6d4146e7, 0x96f2538d, 0x31917c87, +0x698beea2, 0x18bbabd4, 0x5f119cc7, 0xc4695c0d, 0x24a04414, 0x093ec83d, 0x4a5e576b, 0x03c1a6a7, 0xbc192279, 0xd5ec3fe4, 0xae5de737, 0xf586d3b5, 0x72f1e3d1, 0x581a9225, 0x67be287d, 0x9c73ce28, 0x00000000, 0xc7a8faaa, 0x7bb1d8d3, 0xed3d7861, +0x18c558eb, 0x7645b8ab, 0xc9e3cf4a, 0xd6536a7c, 0x5651a7c5, 0x123a3671, 0xc36252ef, 0x292ad753, 0x271f118c, 0x04caa845, 0x7f0583a9, 0x2a9582cb, 0x529b0f80, 0x7f7b7096, 0xbfd884de, 0x91f95d6f, 0x8e49f859, 0x3fa4ba58, 0x38afb4ba, 0xce963297, +0xe47d4363, 0x9b0633f5, 0xea4885bc, 0xb1ed4201, 0x728f10ee, 0xe989231b, 0x431e6c69, 0xd2e73106, 0x3c1befc0, 0x64017de5, 0x2de07f16, 0x0d8a9347, 0x8709c35b, 0x8942f6bb, 0xd592ccdb, 0x714eb649, 0x5cd03a60, 0xc0a3f448, 0x8afda323, 0x52e5fcbf, +0x007ef33f, 0x4d2baab6, 0x8002cdb9, 0x16f09e34, 0x1fce5609, 0xbfa677e1, 0xf14c7bf0, 0x168e6d0b, 0x51245a18, 0x03bf5598, 0x206aec51, 0xfcb81b88, 0x5f6f6ff8, 0xade2b2af, 0xfbb3156a, 0x1244c54e, 0xe0b7eb26, 0xfcc6e8b7, 0x23ab4af6, 0xa4a289ad, +0xa3d77470, 0x446b91b4, 0xa7632f0a, 0x968ca0b2, 0x9533f52a, 0x763b4b94, 0x2d9e8c29, 0x20141f6e, 0xca5c9ad2, 0x24deb72b, 0x2761e2b3, 0xf6477512, 0xd8185f9c, 0xbc67d146, 0xe403b05c, 0xb22ce4a6, 0x87773064, 0x322e291f, 0xe308bebe, 0x84b696c3, +0xdf13517e, 0x5caec95f, 0x71304576, 0x2e21d9b1, 0xc0dd0777, 0x63748038, 0xa9281aea, 0x154fcbac, 0x1c710391, 0x499ff1cc, 0x3c651cff, 0x60cbd5a0, 0xcd579430, 0xf872b3cd, 0xad9c4190, 0x55eef25d, 0xff79bd2f, 0xd866aca3, 0x4eea0c11, 0x780e8d4b, +0x33d5de61, 0xf1fc5e68, 0x75f41896, 0xcf724763, 0xb6e3305d, 0xbdf3f8c5, 0xce656e27, 0x3fb0b1c9, 0x70d2204d, 0x4472591c, 0x4f629184, 0x0b10c898, 0xb0a83faf, 0x3cf40766, 0xca7dfe3e, 0xb3c50886, 0x840846fe, 0xc144b720, 0x0f085881, 0xc9394891, +0xbfa0672e, 0xba865ff5, 0xf2916941, 0xb4992e30, 0x036d3729, 0xc07a1fe2, 0x064b0ff2, 0x4e75b8c0, 0x4b7a019d, 0xf1d5dfee, 0xca547fb8, 0xf5cd4ff7, 0xbccd5007, 0xcc36f1cc, 0x096ad6f5, 0x3ba821d0, 0xc807e053, 0x7ee4d00e, 0xb6cab1db, 0x36f3e6ba, +0x417de041, 0x7da066a1, 0x7beb6953, 0xf689f958, 0x38c516f9, 0x3e8e190b, 0x3b81a056, 0x78865e7a, 0x7281bfa6, 0xb081be29, 0x406ac905, 0xffcaae2b, 0x83546048, 0x876571d7, 0x74e331d2, 0x013ea8c2, 0x78afdffc, 0xf79ed01c, 0x3de32e22, 0x826ac88a, +0xb2d221c2, 0xce4cefa1, 0xfbd23e32, 0xfdb0b046, 0x71c50909, 0xb58e0774, 0xfc8e1884, 0xf981a1d9, 0x04189019, 0xb196976d, 0x0a2e605a, 0x8b299ff9, 0x4d310e6f, 0x86725893, 0xb8d5c01e, 0x4307fe2c, 0x80395761, 0x8e2626a4, 0xfca79902, 0x49001ff0, +0xc55c2739, 0xb8fc4198, 0xfd9931c0, 0x01172944, 0x8c5c38c9, 0xb9c2e95a, 0x471f6e35, 0xcf5bc6e5, 0x7c9ece63, 0xc44b0e7d, 0x74cab054, 0x8107ffa3, 0x7afc4017, 0x837de1ce, 0x77a7877d, 0x3dcaafa4, 0x39d23fbd, 0x7ff3f94a, 0x027a1e6d, 0x8421c778, +0x874cf051, 0xcb4356fc, 0x483eb732, 0xc200018f, 0x00000000, 0x445bd89a, 0x7d89e727, 0x8b001e7f, 0x8c75b94f, 0xbdda7943, 0x4a44a95f, 0xb1bf16eb, 0xfef406e9, 0x49299e76, 0x8243490c, 0xbaafde73, 0xffe32fad, 0x7cb74fe5, 0x75dd9910, 0x0e36f043, +0xc575a6bf, 0x0f21d907, 0x3f99304f, 0x09435773, 0x4210d768, 0x7991773e, 0xf0eb772c, 0x4d188fe9, 0x71ec888f, 0x31afc00c, 0x8844a8d0, 0xcd21d888, 0x33fc5fe7, 0xc0539e64, 0xb7dd989f, 0x08547e37, 0x359ed193, 0x778e06fb, 0x415461c7, 0xbeb74e6a, +0x075c26b6, 0x46084771, 0x432e7faa, 0xc4628ffb, 0xf6a078de, 0xc2298009, 0xbbb8f737, 0x4e5c3946, 0x7bc2e8d5, 0x32c2f725, 0xc6311010, 0x89538194, 0x45657058, 0x050fb95d, 0x34a07951, 0x8536ee3c, 0x052638db, 0xc82e61d5, 0x72a83e20, 0x8a3eb6bd, +0xb3ec8900, 0x454cf1de, 0xc70fb8d2, 0x7ecd5188, 0xfac51776, 0x8e0fa722, 0x3ea7988d, 0x0d7246ec, 0xf896889d, 0xfbfbbfb4, 0x0775a730, 0xcc1f704a, 0x39fbbe3b, 0xf3864005, 0x8f188e66, 0x4f4b1002, 0x4736efb3, 0x309168ce, 0x3186418a, 0x0c656fa8, +0x35b75015, 0x37cd4e78, 0x481736b4, 0x37e4cffe, 0x30b8e948, 0xbb9176b1, 0x0e1f71c5, 0x8f310fe0, 0x02539feb, 0x7fda78cc, 0xf2b8e8c7, 0x4c0fa6ad, 0x3abf0894, 0xb5a786f2, 0xb2fba044, 0x06628e74, 0x897a0012, 0x8010d6e7, 0x73bf1764, 0x087dffb1, +0x0c4cee2e, 0x70fba1cb, 0xbce4d181, 0x865bd915, 0x886d2956, 0xc7263954, 0xc6189196, 0xbe9ecfec, 0x4621c6f7, 0x0b39491e, 0xc33ea94d, 0x40434883, 0x8a17373b, 0xc16d36a6, 0x3489f8d7, 0xf7b7519a, 0xf9a8205f, 0xf5e4ce71, 0xcb6ad77a, 0xfedd876f, +0x79b8f6b8, 0x76992fbf, 0x38ec977f, 0x4b53801b, 0x32eb76a3, 0x4c26272b, 0xf8bf091b, 0xf0c2f6aa, 0x7ad5c191, 0x739696e2, 0xb9eb68dc, 0x812e7e25, 0xc31728cb, 0x8d4b118d, 0x0d5bc76a, 0x0a07e1dc, 0xb4b0afb6, 0x4a6d28d9, 0x8d62900b, 0x3a968912, +0x423956ee, 0xbf89e6a8, 0xf4f3e735, 0x0431119f, 0xc910c917, 0x36da673c, 0xb7f41919, 0x0344b6af, 0xfaec96f0, 0x00298186, 0x76b0ae39, 0xcd08590e, 0x3cdd86e0, 0xf4da66b3, 0x851f6fba, 0xf3afc183, 0x79988fa6, 0xfac9a200, 0x498c2007, 0x942ba0ed, +0x34198bf5, 0x8b7f3279, 0x98089b66, 0xd28e0f52, 0x8b404660, 0xd995d0a7, 0xeab4bf2c, 0xab29f4ed, 0xc6fe362a, 0x4e8bb060, 0x245be2c0, 0x1f549294, 0xab1680f4, 0x082e1fdf, 0xaf1ba4a0, 0x1348dd06, 0xf6ea998b, 0x275156f3, 0x805b9995, 0x93134493, +0x0b1bdff5, 0xde9240c0, 0xb748a653, 0x5dfc197f, 0x6edd76f4, 0xb3458207, 0xc1f9a64d, 0x4a869434, 0xac111093, 0xf6d5ed92, 0x52eae2de, 0x61f4f94c, 0x4d810453, 0xac2e648a, 0x69e5928a, 0x8469c9d8, 0xe9817f06, 0x331e1b92, 0x144f4d61, 0x3426ffec, +0xedb32f4b, 0xced029f5, 0x419d4bc1, 0x6de8b6de, 0x3f025400, 0xc9d7b992, 0xbf66b98c, 0xbb54e9c1, 0xb85e5df2, 0x246496d9, 0xfdf1467e, 0x9019f0a0, 0x8064ed8c, 0xc2cc6667, 0xd6832b06, 0x51df22f4, 0xf2d8c9c6, 0xa43f0f4c, 0x9c05bf32, 0xcdda9dc6, +0x6ad052a0, 0x003f7419, 0xcde5e9df, 0x76b1001e, 0x2b4d1961, 0xf2e7bddf, 0xe1af60d9, 0xda9f6494, 0xa82340de, 0x56d8b293, 0x52d596c7, 0xe69784a7, 0xb86129eb, 0xa3389f2b, 0x3f3d2019, 0x2f403d35, 0x1745f952, 0x7a923b95, 0x7189e460, 0x55d206a0, +0x302bdbb8, 0xa307eb32, 0x2056c694, 0xe2a5d4ea, 0xd184bb61, 0xa0322b18, 0x5dc36d66, 0xb37af61e, 0x0c233b8b, 0x0432504d, 0xa735bb7f, 0x3c08e033, 0xdaa0108d, 0xaf24d0b9, 0xc2f3127e, 0xb47d6679, 0x69dae693, 0xdda780ea, 0x8c78a21e, 0xbc6c0dbf, +0x186c76ea, 0xceef5dec, 0x040d2454, 0x0738e47e, 0x3b30044d, 0xbb6b9dd8, 0xea8bcb35, 0xe19014c0, 0x7ea06bd8, 0x0335c02a, 0x3805c467, 0x66cc1d32, 0x7aad4f8c, 0xd5b6eb2c, 0x0f298fb8, 0x0f16fba1, 0x33216f8b, 0xfefbf24d, 0x83512da6, 0xbc5379a6, +0x72835053, 0x2c75fd1f, 0x65c6a901, 0x2f7f492c, 0xcadd0da1, 0x00000000, 0xc6c14233, 0x932c308a, 0xa81c34c7, 0xb070422d, 0xf5df59a1, 0x9f0f0b01, 0x9b3d5b4c, 0x59f13d2b, 0x5afb8918, 0x08116bc6, 0x10426935, 0x3014afa1, 0x9837ef7f, 0x971e60c7, +0x9c3acb2b, 0xee86ef61, 0x8875864a, 0xe6a8f0be, 0x8f72162d, 0x7584c034, 0x42a88beb, 0x41a23fd8, 0xf5e02db8, 0x14703978, 0xdead34d9, 0x4eb4c479, 0x5ac4fd01, 0x768e7407, 0xfec48654, 0x79a7fbbf, 0xf9fc622a, 0xe9be0b1f, 0x177a8d4b, 0xd6bc5f1f, +0x1377a91f, 0x46a5afbf, 0x5ef6ad4c, 0xb777d24a, 0x4297fff2, 0x65f9dd18, 0x62c13966, 0x1c6152be, 0x5ec9d955, 0x1c5e26a7, 0x6dd7c2c7, 0xe29aa0f3, 0x276e22ea, 0xf1d27df5, 0x8f4d6234, 0x1b59b6c0, 0x875c09f2, 0xe59d3094, 0x45af1b8c, 0x71b69079, +0x7daadfeb, 0x45906f95, 0x62fe4d7f, 0x7e9f1fc1, 0xb4421260, 0x1b66c2d9, 0x0c1c4f92, 0x0b24abec, 0x383ab07e, 0x1f6be68d, 0x55ed72b9, 0x87637deb, 0x8456bdc1, 0x3b0f7054, 0xed8c5b52, 0xfaf6d619, 0x66f3692b, 0xcae279b8, 0x51e056ed, 0x236306be, +0xf9c31633, 0xd1bbcf78, 0xc5cbf600, 0x836e59bf, 0x37133fc6, 0x469adba6, 0xe5a2448d, 0xeeb99b78, 0x6ee202ed, 0x9f307f18, 0xd5899f35, 0xc1c6d254, 0x3c37942a, 0xa4007b55, 0xdd98f4f3, 0x7d95abf2, 0x9b022f55, 0x2c4a8906, 0xc9e8cd8b, 0xb04f3634, +0x61cb8d55, 0x07079067, 0x2b726d78, 0x4ab9e02d, 0x8c47d607, 0x972114de, 0xfdce3267, 0xd9aaa4be, 0x235c72a7, 0x107d1d2c, 0xa70acf66, 0xd2b17b4b, 0x030ab433, 0x2878d94b, 0x4dbe704a, 0xc5f48219, 0x902684b9, 0x6aef26b9, 0x2847ad52, 0xbf59cd95, +0x884af253, 0x56e7c68a, 0x9414d4f4, 0x72bc244a, 0x59ce4932, 0xf1ed09ec, 0x185302f3, 0x372c4bdf, 0x75bbb42d, 0xa00d5f01, 0x2069b28d, 0x49b3541e, 0xc607b719, 0x1e03c810, 0x200cb5c1, 0x3fca0c5c, 0x486f5e4d, 0x3b1d836a, 0xe9190b09, 0x01c5718d, +0x8b46cce9, 0x340f8abb, 0xa5a1da72, 0x57a9e7d0, 0xa59d0174, 0x24db3af7, 0xb48cc0b5, 0x639ab66d, 0xe2dc8dee, 0x597e9f8c, 0x4d417bf0, 0xf6dfb294, 0x58873507, 0x6d711537, 0x1ffa629b, 0x0bc586e7, 0x0a3c2c6c, 0x0ed7785c, 0x2a3099ad, 0xbeb0ecd9, +0xd3fd22e8, 0xb19e3e0e, 0x2bf5e820, 0xfd26ef75, 0x8b7a17ef, 0x143fe47c, 0x3121af06, 0x01f9aa8b, 0x84681e3e, 0x5942448a, 0x343351bd, 0xf9f16043, 0x58bbee01, 0x7da5a57b, 0x94bcae72, 0xb5756a3e, 0x15fa95f1, 0x5287c26d, 0xaa8f08a5, 0xbf494652, +0xcdfeeaf8, 0x49aa2fc0, 0x8454c538, 0xf3cd4c2f, 0xc31549a2, 0x3e0f7dd1, 0xdcd3f03f, 0xc2ece329, 0x4c840a7d, 0xe60b02d8, 0x537e68e6, 0xc63b6c1f, 0xba6763ef, 0x8e543252, 0x1b2dedad, 0xd6d30755, 0x699a4107, 0xdd2a5ab4, 0x1ae89c20, 0x43aad8aa, +0x8a83bd64, 0x91ae50c9, 0x9a570d28, 0xf726181f, 0xcdc231fe, 0xa14a8e42, 0x5d95cbbc, 0x2edbcd9d, 0xd838a40f, 0x81463b83, 0x8f9143df, 0xec0bf5b2, 0xc8d0cf45, 0x2a0c42ab, 0xe319fc63, 0x00000000, 0x003cdb06, 0x5c6c6137, 0x7c60d4f6, 0x79722a4d, +0xd2385365, 0xc32992a4, 0xe925d00f, 0xc915bec8, 0xf2083da2, 0x9f45f393, 0x9b927ca5, 0xd3c1f9ee, 0xc7fe1d92, 0x439603ac, 0xe637d9de, 0xe8dc7a84, 0x794ef14b, 0x426fa927, 0x04d78f36, 0x9baea7a3, 0xc2d0382f, 0x2f226716, 0x69a69a01, 0x24e7e1f1, +0x2bc93326, 0x85ad6fb3, 0xcc3b9b75, 0x1e3f1316, 0x35f62030, 0x0eeba35a, 0x765cf89a, 0xedce843f, 0x3ad8f2e7, 0x8abf6662, 0xdd1681b2, 0x62631ce6, 0x9f792895, 0xedf25f39, 0xd72aadde, 0x311d7400, 0xaf9df61e, 0x6863eb8c, 0x6771e25d, 0xb05b4f83, +0x1fc6b99d, 0xbf759d54, 0x685f308a, 0xc7c2c694, 0x4853854b, 0x35cafb36, 0x8e68e954, 0xa464abff, 0x7c5c0ff0, 0x625fc7e0, 0xa08fffcf, 0xe2e056e8, 0x112d1ac7, 0xf808cac8, 0x7660239c, 0xb549b138, 0x4d7da0f6, 0xb1a2e508, 0x5c50ba31, 0x5da910ba, +0x2ee7169b, 0x788b80c6, 0x9057fa42, 0xae588793, 0x4cb8d17b, 0x80834a0e, 0x21c9c44c, 0xa45870f9, 0xbe8c37df, 0x78b75bc0, 0xba5bb8e9, 0xf9cdbb45, 0x10e86b4a, 0x77998917, 0x728b77ac, 0x4684fd17, 0x6d4dce31, 0x30e4de8b, 0x9a6bd62e, 0x15c64ef7, +0xec372eb4, 0x0f1209d1, 0x954504f9, 0x8591b4b5, 0x6cb464ba, 0x251e4b7a, 0x04eb5430, 0x3e33a6d7, 0x7d997e7d, 0x91928bcf, 0x2522907c, 0xd2048863, 0x817ae085, 0x52bb196b, 0x477d579c, 0xd6efdc53, 0xe8e0a182, 0xae645c95, 0x0512febb, 0x56504d5b, +0xab4a7928, 0x734e0621, 0x566c965d, 0xa1765544, 0x8fad98d9, 0x80bf9108, 0x674d395b, 0x9e80821e, 0xf71ac319, 0x77a55211, 0x46b82611, 0xbb9ec964, 0xd71676d8, 0x21f51f4a, 0xd8047f09, 0x906b2144, 0x66b493d0, 0x14033f7a, 0xb4b01bb3, 0x3ff6d75a, +0x0f2ed2d7, 0xd9c10e84, 0xdcef2b39, 0x30d8058d, 0xafa12d18, 0xbba21262, 0x3b21586c, 0x72b7acaa, 0xf6e36992, 0x3ae429e1, 0x2f1ebc10, 0x63a66d6b, 0xa0b324c9, 0xab76a22e, 0x9579dfff, 0xfce39ef8, 0x4996f4c6, 0xfcdf45fe, 0xe3252765, 0xf83411ce, +0x9ebc5918, 0x6c88bfbc, 0xe7f2a853, 0xfd1a3473, 0x5342b3e0, 0x57953cd6, 0xaab3d3a3, 0x20306ec7, 0x47418c9a, 0x10d4b04c, 0xf3f19729, 0x0a00f76a, 0x1111c1c1, 0xd9fdd582, 0x94807574, 0x1b1136ab, 0x1ad44726, 0x42537221, 0xe7ce7355, 0xc92965ce, +0x7372dd27, 0x668848d6, 0xb0679485, 0xc8ec1443, 0xcc074073, 0xf234e6a4, 0x052e25bd, 0x0bf95de1, 0x81d47649, 0x924ec47f, 0xbe619185, 0x95749d6e, 0x2b1a6c34, 0x0a2c2fa0, 0x2f6744eb, 0x3bc7afcc, 0xef832d80, 0xa49f1d02, 0xd37edb5d, 0x227e5285, +0xb705af34, 0xc0eb09b4, 0xa9896bb3, 0x9109b5b1, 0xb03ff625, 0x673c05a7, 0x85a95e96, 0x86e14f87, 0xf63ad0c9, 0x6d1f4ad8, 0xb377e734, 0xbd298094, 0xaace1a7d, 0xf24898c9, 0x6e575bc9, 0xa3a54413, 0xf572c1d8, 0x9b2aface, 0xfc16ff69, 0x77e1c65f, +0xde68adec, 0x70d4ff91, 0x7e85f8ee, 0xaebc527d, 0x36deb9a2, 0xa7d86ccc, 0x2c203525, 0xa4907ddd, 0xe1dd4a20, 0x26037a5a, 0x5fb3bb7a, 0x1dc4d596, 0x32acf1a2, 0xa0ed5502, 0x3880de02, 0x48542193, 0x14a0eb27, 0xcac72614, 0x8bf859e9, 0x52a5cdcb, +0xb95bc894, 0x9633eca0, 0xda1ae5ec, 0x9241a4a0, 0x74a6b791, 0x32a3917d, 0xfc199fb6, 0xc98f3705, 0x963c8c7f, 0xa7d70c13, 0x588682b4, 0xc7de307a, 0x1af1ec58, 0x88bf2827, 0x00000000, 0x2139234b, 0x41301f22, 0x388fbedd, 0x073539ce, 0xc7d150a5, +0x9f57d211, 0x739cee80, 0x3bc8cf13, 0x85a63e49, 0xde67cd33, 0xcdf21fda, 0xf864b769, 0xadf4436c, 0x2f682434, 0x60065cb6, 0x42780e33, 0xfb23c6a7, 0x096b5e6e, 0x413f7ffd, 0x3599c86c, 0x1e83a458, 0xe8b97491, 0x485b414c, 0x69626207, 0xcac846cb, +0x6e583b16, 0xef8c4d5f, 0x7dcde9ff, 0x81db1696, 0xd70c935d, 0x21364394, 0xceba0ecb, 0x634e4da7, 0x79b0c120, 0x454d37fd, 0x77eea680, 0x17e79ae9, 0xf635b016, 0xe6e873ee, 0x6a2a7316, 0xb37887eb, 0xebfe055f, 0x073a5911, 0x04724800, 0xb70acfeb, +0x7af7b0ee, 0xecc45c4e, 0x0e5e67a0, 0xd952f4fd, 0xf10fe907, 0x3fba8713, 0x957bfdb1, 0x73938e5f, 0xe29a3bee, 0x14af8bf8, 0xcdfd7f05, 0x5889e26b, 0x25440b94, 0xa9860b6c, 0x88b048f8, 0xc3a318a5, 0x8f8a11e9, 0xadfb23b3, 0xf247f816, 0x79bfa1ff, +0x8ccd6027, 0x51eddcda, 0xb44dbe25, 0x82930787, 0xdd2fdc22, 0x1e8cc487, 0x285d1dfa, 0x3596a8b3, 0xb442defa, 0xebf16580, 0xe2955b31, 0x9862ebdf, 0x60093c69, 0x03481111, 0xd44be293, 0xd371bb82, 0x19b9fd49, 0x5590f405, 0x10d2a327, 0x0a234f7f, +0x4f61185d, 0xff5eee78, 0xaac17aa2, 0x5bce93a5, 0x51e2bc05, 0xd444824c, 0xc496216b, 0x5bc1f37a, 0x31e4e0b3, 0x4c29094c, 0x4b13505d, 0x7e8a9831, 0xaeb332a2, 0x56d785cb, 0x000f60df, 0x31eb806c, 0x8cc200f8, 0x36d1d97d, 0xe5af0220, 0xc0e4696b, +0xa3aa24cc, 0x74a9d74e, 0xd036ca4c, 0xdd20bcfd, 0xd039aa93, 0x67336578, 0xba13d985, 0x10ddc3f8, 0xe1d22aff, 0x1395d2e9, 0x9f58b2ce, 0x260c1a85, 0x5cf4cab4, 0x45425722, 0x1dcbb549, 0x42776eec, 0x460526ec, 0x986d8b00, 0x0e51077f, 0x4b1c3082, +0x647414b6, 0x647b7469, 0xd95d9422, 0x9c1fc300, 0x139ab236, 0x3fb5e7cc, 0x28527d25, 0xceb56e14, 0x7dc28920, 0x86ee2f58, 0xc49941b4, 0xda158533, 0x4c266993, 0x63412d78, 0x1afe8c87, 0x7af8d031, 0xe5a062ff, 0xb954a84b, 0x6d102a07, 0x8f857136, +0xe8b6144e, 0x0d1676b1, 0x2b150ceb, 0x829c6758, 0x0d19166e, 0x8bf73936, 0xba1cb95a, 0xd703f382, 0x2c2f55fa, 0x047d28df, 0xbd26e04b, 0x4f6e7882, 0x5cfbaa6b, 0xeccb3c91, 0x70db9f4e, 0xf10089d8, 0xc98057da, 0xc3ac787a, 0x034771ce, 0x52aaad14, +0x3cf29602, 0x9b259a11, 0xb03096fa, 0x3cfdf6dd, 0xf57da107, 0xfb2ca678, 0x17e8fa36, 0xf86bd7b6, 0x2271325a, 0xe6e71331, 0x696d02d8, 0x19b69d96, 0xa0e235dd, 0x559f94da, 0x9106d56e, 0x6a2513c9, 0x56d8e514, 0x254b6b4b, 0xbe6ef15a, 0xff518ea7, +0x5fbcdba5, 0x09643eb1, 0x9c10a3df, 0x460a4633, 0x31b28e37, 0x60ad5bea, 0xf9c6b50d, 0xe4dd7be4, 0x19acfaa2, 0xc4b3a771, 0x78113557, 0x641a6fa1, 0x7db69503, 0x07e7b3b9, 0x8be73bb7, 0x49a3bb60, 0x2699fb33, 0x06f727a6, 0x900bd2f8, 0xc5a3336e, +0x0cc79c4b, 0xa3f94f22, 0x8720a7fc, 0x74d6a91c, 0xb335899f, 0xf2e69aff, 0x42839492, 0x9b2bfd0a, 0xb9053272, 0x472434c6, 0x4c041b34, 0x524f522f, 0x62ed4807, 0x27896f2c, 0x222ecf78, 0x290ee08a, 0x828707a8, 0x839793b7, 0x139c414f, 0x5dd84996, +0xce831c9c, 0x8e409be3, 0x7ff686ee, 0x511fd5dd, 0xd1d8c198, 0x0b202ff2, 0x0a30bbed, 0x25c97cc1, 0xb782bdd4, 0xa74e7b69, 0x80c71445, 0xd47f61cc, 0x89a7285a, 0xf651aeb4, 0xab89e722, 0x9ddcdaac, 0x3b8235da, 0xbb45219f, 0x6d7a53be, 0xd9a86998, +0xb4d23a26, 0xe33ac85d, 0x57e8f27b, 0xd8b8fd87, 0xf7413aab, 0x8c00880e, 0x3505ba7c, 0xd288466a, 0x54b87589, 0x56f86664, 0xe81ae7af, 0x281e7495, 0x9a3b6915, 0xdd1f5dd3, 0x7ee612f1, 0x1afc7d50, 0x88b7bc45, 0x10ccc6bd, 0xa8d960d0, 0x0f971bb9, +0xf411bd59, 0x996beee7, 0x500f41c2, 0x77862eee, 0x7696baf1, 0x172b7504, 0x70619d57, 0x1bece94f, 0x1d1bcee9, 0xdaf8ee6a, 0x95ac72ac, 0x535fc630, 0xde4fda21, 0x674ae853, 0x7ca6011c, 0x00000000, 0xe06a4faf, 0xcdd39b6e, 0x4634a0d9, 0xccc30f71, +0x32e209c5, 0x0dd70854, 0x68ddf3ea, 0x24d9e8de, 0xa2e9db3d, 0x72218eba, 0x71710948, 0xe78dfc16, 0x587fe9c2, 0xeffd5416, 0x163be11b, 0x55a8e196, 0x2ca940de, 0xca3428d7, 0x4f549cc6, 0x75c63d03, 0x3a92a1c5, 0x3f350191, 0xfc611559, 0xea5af442, +0xf5012946, 0xad7ec084, 0xcb24bcc8, 0x3745a991, 0x4564272b, 0x4393008d, 0x4af33c92, 0xdf5f4e3e, 0xc35414c8, 0x147bf2f6, 0xf0a68912, 0x41d31360, 0xa65eef76, 0xa1b95ccf, 0x935b550a, 0x596f7ddd, 0x81d7805a, 0xf1b61d0d, 0xaa99733d, 0xbdb20639, +0xc24480d7, 0xb1759a72, 0x4d148f2b, 0xb815a66d, 0xc6f3b49c, 0xa50e6884, 0x5b2f6e30, 0x3c658663, 0x69cd67f5, 0x18bc6ebd, 0x4e4408d9, 0xdc0fc9cc, 0x94bce6b3, 0x09603c1f, 0xdbe87a75, 0x34152e63, 0xac6e549b, 0x128cd550, 0x2db9d4c1, 0x0870a800, +0xc8743b3a, 0xe90a73b0, 0xbca29226, 0x30a21a28, 0xfa9632ff, 0x665a7c4c, 0x36553d8e, 0x924bc115, 0xe22a5c42, 0x0110941f, 0xaf3ed369, 0x6c6ac7a1, 0x4474b334, 0x8f500ffc, 0x05a7a054, 0x650afbbe, 0xc7e32083, 0xcf938883, 0xb0650e6d, 0x2ee95333, +0xb5c2ae39, 0xd0c85587, 0x8af7afa8, 0xc1140725, 0xba55b580, 0xc004933a, 0x217e488a, 0xb69229cb, 0x63fddc18, 0x7901a148, 0xe17adbb0, 0x96fcf55e, 0x3d75127c, 0x6e2ad44c, 0x40c3877f, 0x39c22637, 0x1c0b5af6, 0xae2e4776, 0x7a5126ba, 0x5cc8dd89, +0x0e878fa6, 0xeb4a605d, 0x987b7af8, 0xa9c9f4cf, 0x9e8c5d5e, 0xf8d62112, 0x2b4ef367, 0x1f5bdd04, 0x97ec6141, 0x6f3a4053, 0x8560b411, 0x1e4b491b, 0xb2251d80, 0x233e5b67, 0xedbd47fb, 0x8470200e, 0x73311aa5, 0x5a3ffa2f, 0xd63f7221, 0x5e88ce64, +0x863033e3, 0xbff215d4, 0xd56ff5d3, 0x2ff9c72c, 0x156b66e9, 0xfe2106b4, 0xe69d6809, 0xe5cdeffb, 0x4be3a88d, 0x04b7344b, 0x9f9cc941, 0x6b8d7418, 0xa0a9c8d0, 0xa41efc9b, 0x38d2b228, 0xecadd3e4, 0x035087f2, 0xbee281cb, 0x9ccc4eb3, 0x11dc52a2, +0xff3192ab, 0x024013ed, 0xd398d275, 0x7b41b2a5, 0x206edc95, 0xeeedc009, 0xd72fe63e, 0x3e25958e, 0x911b46e7, 0xfd718146, 0x6a9de007, 0xc964af25, 0x61bdcff5, 0x5f985a7b, 0xf3f60ee0, 0x8d101c11, 0x48b32f7f, 0x2a5e6778, 0x33f29dda, 0xfb86a6e0, +0x914f1a78, 0x0aa7ad24, 0x6d6c7947, 0x7f16aeaa, 0xde5c0e03, 0xbbcf575d, 0xaddb6136, 0x2ee80bae, 0x9f8656da, 0x10225ad0, 0x0c91c19f, 0x45b4b95f, 0x2a86ea28, 0x6b5cb2f1, 0x18dd7ac9, 0x1a8350f9, 0x1024fddd, 0xbdf93be6, 0xa522e622, 0xc84e9f65, +0xaf854b06, 0x1cb39b4f, 0x690298c1, 0x025e2a30, 0x85050623, 0xe4f8befb, 0x3c947b4e, 0x899260b1, 0x4d4b9946, 0xa3148a99, 0x816be7a5, 0x08f98714, 0x99b03a61, 0x9dd87cea, 0x3eccf673, 0xd09542a1, 0xda32ef85, 0x3aa4b0f8, 0x127ad7ed, 0x5b590820, +0x325b90e1, 0xb75831cf, 0x61fb1fd5, 0xfc23633f, 0xb500bcf2, 0xc8483868, 0xe2c8754d, 0xc2e93241, 0x7b784f2c, 0x9ddedbe7, 0xa3122d94, 0x95275cf3, 0x0ec94ca2, 0xd6a32e1a, 0xa14c07a4, 0x346b5b57, 0x3aa217f5, 0x8dfa263a, 0x41da58d9, 0x02588d3d, +0x0c976692, 0x57c8c9bf, 0x5d6f649b, 0x06366cbb, 0x71d94505, 0x2279ca31, 0x9be8b75c, 0x3005bad1, 0xf684ce1b, 0x61fdb8d8, 0xc0b1bf7c, 0xbdff9ceb, 0x1614366b, 0xfa13a889, 0xce78f3de, 0xcc207ee3, 0x046ee186, 0xf4dae42b, 0x7d48849a, 0x0468468b, +0x144cbb56, 0x6f325377, 0x325d37ec, 0xe6a033c6, 0x5d69c396, 0x4382d5e4, 0xd86cc5b5, 0x346dfc5a, 0x30031ddc, 0x9149bd75, 0x816d40a8, 0x2cb6219e, 0x69043fcc, 0x9bee1051, 0x144a1c5b, 0x73876f35, 0x63a535e5, 0xc0b71871, 0xb9917d6d, 0x4d4d3e4b, +0x7920c211, 0xf84b25b4, 0x977fd1ce, 0x875b2c13, 0xfe7bee02, 0xc687d3c7, 0x67cd736e, 0x51fea504, 0x18dbddc4, 0x492578c0, 0xdc022433, 0x4f15b376, 0x67cbd463, 0x53a08f34, 0x8fa40c0a, 0xb5061bff, 0x8fa2ab07, 0x4923dfcd, 0xbfa1b6db, 0x47ec3462, +0xd2cb6891, 0xf4dc4326, 0x8dfc8137, 0xb16e5d74, 0x6b5a15fc, 0x57ce6eb2, 0x53a62839, 0xa9b580b0, 0xec0139ef, 0x71dfe208, 0x7f1009a7, 0x1eeb1672, 0x875d8b1e, 0x93179745, 0xe2ced240, 0xb168fa79, 0x8335cd95, 0x00000000, 0x244fa68a, 0xf2ea2f9d, +0x8bcaed8c, 0xe86fd869, 0xb997da60, 0xaf83ec0b, 0x438472e9, 0xc4df5efa, 0x47ea936f, 0x41dcffd4, 0x8503a12e, 0x3633d66a, 0xa9b327bd, 0x6595fe53, 0x5b5faf2d, 0x2eeeaca3, 0x6593595e, 0xca161258, 0xd2cdcf9c, 0x38fc3dc5, 0xe6a694cb, 0xe8697f64, +0x1cb53c42, 0x45b21e52, 0x08ff2019, 0xda344888, 0x3c92dc43, 0x2027e001, 0xa14aa0a9, 0x8994c7bc, 0xe4fe19f6, 0x63a392e8, 0xca10b555, 0x5901851d, 0x7381c838, 0x5f37e9a6, 0xc68174ca, 0x5f314eab, 0xdc04833e, 0xabebaa80, 0xf2ec8890, 0x28d8c018, +0xabed0d8d, 0x6d6ade4a, 0xa77a6b1f, 0xea375554, 0x59072210, 0x0006a70d, 0x28de6715, 0x977976c3, 0x36357167, 0x3eca517e, 0x51f80209, 0x7b7ee821, 0x4b7df5fd, 0x7926651c, 0x6f34f47a, 0xe0965f7d, 0x1eedb17f, 0xee5f13df, 0x2a804d25, 0x75b7a483, +0x77ef29be, 0xd4fba327, 0xd6a58917, 0xcc26d9ee, 0x38fa9ac8, 0x83336a98, 0x2021470c, 0xea31f259, 0xce7e54d3, 0x2cb08693, 0xb336d049, 0x26172bb7, 0x16129166, 0xb3307744, 0x77e98eb3, 0x127c70e0, 0x24490187, 0xa524412f, 0xc4d9f9f7, 0xd4fd042a, +0x5596e38f, 0x55904482, 0xadddc63b, 0x93113048, 0x1a85f7f4, 0x7d4e2397, 0x227f6d3c, 0xe090f870, 0x0ecfebaf, 0xf0b2a2a0, 0x4f13147b, 0xd093e5ac, 0x0630cbb6, 0xb75e96c2, 0xfe7d490f, 0xf84d82b9, 0x26118cba, 0x4b7b52f0, 0xa77ccc12, 0xf0b405ad, +0x8bcc4a81, 0xfa150f84, 0x99b69d6c, 0xde5aa90e, 0xc2ef954c, 0x9521fbfe, 0xee59b4d2, 0xf6826916, 0xfc25c432, 0xec079ee2, 0x0aa10a29, 0xbbc9f050, 0x9f80f1d7, 0xd86a62b8, 0xbfa711d6, 0x75b1038e, ] + +d0x6a09ee48=[ 0x00000000, 0xa5c7d972, 0xa2c5fb01, 0x07022273, 0x3d908b5f, 0x9857522d, 0x9f55705e, 0x3a92a92c, 0x304d4dc0, 0x958a94b2, 0x9288b6c1, 0x374f6fb3, 0x0dddc69f, 0xa81a1fed, 0xaf183d9e, 0x0adfe4ec, 0x5dc8cf2b, 0xf80f1659, 0xff0d342a, 0x5acaed58, +0x60584474, 0xc59f9d06, 0xc29dbf75, 0x675a6607, 0x6d8582eb, 0xc8425b99, 0xcf4079ea, 0x6a87a098, 0x501509b4, 0xf5d2d0c6, 0xf2d0f2b5, 0x57172bc7, 0xe9138841, 0x4cd45133, 0x4bd67340, 0xee11aa32, 0xd483031e, 0x7144da6c, 0x7646f81f, 0xd381216d, +0xd95ec581, 0x7c991cf3, 0x7b9b3e80, 0xde5ce7f2, 0xe4ce4ede, 0x410997ac, 0x460bb5df, 0xe3cc6cad, 0xb4db476a, 0x111c9e18, 0x161ebc6b, 0xb3d96519, 0x894bcc35, 0x2c8c1547, 0x2b8e3734, 0x8e49ee46, 0x84960aaa, 0x2151d3d8, 0x2653f1ab, 0x839428d9, +0xb90681f5, 0x1cc15887, 0x1bc37af4, 0xbe04a386, 0xf8a00251, 0x5d67db23, 0x5a65f950, 0xffa22022, 0xc530890e, 0x60f7507c, 0x67f5720f, 0xc232ab7d, 0xc8ed4f91, 0x6d2a96e3, 0x6a28b490, 0xcfef6de2, 0xf57dc4ce, 0x50ba1dbc, 0x57b83fcf, 0xf27fe6bd, +0xa568cd7a, 0x00af1408, 0x07ad367b, 0xa26aef09, 0x98f84625, 0x3d3f9f57, 0x3a3dbd24, 0x9ffa6456, 0x952580ba, 0x30e259c8, 0x37e07bbb, 0x9227a2c9, 0xa8b50be5, 0x0d72d297, 0x0a70f0e4, 0xafb72996, 0x11b38a10, 0xb4745362, 0xb3767111, 0x16b1a863, +0x2c23014f, 0x89e4d83d, 0x8ee6fa4e, 0x2b21233c, 0x21fec7d0, 0x84391ea2, 0x833b3cd1, 0x26fce5a3, 0x1c6e4c8f, 0xb9a995fd, 0xbeabb78e, 0x1b6c6efc, 0x4c7b453b, 0xe9bc9c49, 0xeebebe3a, 0x4b796748, 0x71ebce64, 0xd42c1716, 0xd32e3565, 0x76e9ec17, +0x7c3608fb, 0xd9f1d189, 0xdef3f3fa, 0x7b342a88, 0x41a683a4, 0xe4615ad6, 0xe36378a5, 0x46a4a1d7, 0xa184092e, 0x0443d05c, 0x0341f22f, 0xa6862b5d, 0x9c148271, 0x39d35b03, 0x3ed17970, 0x9b16a002, 0x91c944ee, 0x340e9d9c, 0x330cbfef, 0x96cb669d, +0xac59cfb1, 0x099e16c3, 0x0e9c34b0, 0xab5bedc2, 0xfc4cc605, 0x598b1f77, 0x5e893d04, 0xfb4ee476, 0xc1dc4d5a, 0x641b9428, 0x6319b65b, 0xc6de6f29, 0xcc018bc5, 0x69c652b7, 0x6ec470c4, 0xcb03a9b6, 0xf191009a, 0x5456d9e8, 0x5354fb9b, 0xf69322e9, +0x4897816f, 0xed50581d, 0xea527a6e, 0x4f95a31c, 0x75070a30, 0xd0c0d342, 0xd7c2f131, 0x72052843, 0x78daccaf, 0xdd1d15dd, 0xda1f37ae, 0x7fd8eedc, 0x454a47f0, 0xe08d9e82, 0xe78fbcf1, 0x42486583, 0x155f4e44, 0xb0989736, 0xb79ab545, 0x125d6c37, +0x28cfc51b, 0x8d081c69, 0x8a0a3e1a, 0x2fcde768, 0x25120384, 0x80d5daf6, 0x87d7f885, 0x221021f7, 0x188288db, 0xbd4551a9, 0xba4773da, 0x1f80aaa8, 0x59240b7f, 0xfce3d20d, 0xfbe1f07e, 0x5e26290c, 0x64b48020, 0xc1735952, 0xc6717b21, 0x63b6a253, +0x696946bf, 0xccae9fcd, 0xcbacbdbe, 0x6e6b64cc, 0x54f9cde0, 0xf13e1492, 0xf63c36e1, 0x53fbef93, 0x04ecc454, 0xa12b1d26, 0xa6293f55, 0x03eee627, 0x397c4f0b, 0x9cbb9679, 0x9bb9b40a, 0x3e7e6d78, 0x34a18994, 0x916650e6, 0x96647295, 0x33a3abe7, +0x093102cb, 0xacf6dbb9, 0xabf4f9ca, 0x0e3320b8, 0xb037833e, 0x15f05a4c, 0x12f2783f, 0xb735a14d, 0x8da70861, 0x2860d113, 0x2f62f360, 0x8aa52a12, 0x807acefe, 0x25bd178c, 0x22bf35ff, 0x8778ec8d, 0xbdea45a1, 0x182d9cd3, 0x1f2fbea0, 0xbae867d2, +0xedff4c15, 0x48389567, 0x4f3ab714, 0xeafd6e66, 0xd06fc74a, 0x75a81e38, 0x72aa3c4b, 0xd76de539, 0xddb201d5, 0x7875d8a7, 0x7f77fad4, 0xdab023a6, 0xe0228a8a, 0x45e553f8, 0x42e7718b, 0xe720a8f9, 0x00000000, 0x759a5cd4, 0x476d0e21, 0x32f752f5, +0xd2f30cf3, 0xa7695027, 0x959e02d2, 0xe0045e06, 0x8f129599, 0xfa88c94d, 0xc87f9bb8, 0xbde5c76c, 0x5de1996a, 0x287bc5be, 0x1a8c974b, 0x6f16cb9f, 0x58dfa710, 0x2d45fbc4, 0x1fb2a931, 0x6a28f5e5, 0x8a2cabe3, 0xffb6f737, 0xcd41a5c2, 0xb8dbf916, +0xd7cd3289, 0xa2576e5d, 0x90a03ca8, 0xe53a607c, 0x053e3e7a, 0x70a462ae, 0x4253305b, 0x37c96c8f, 0x23d9d6c5, 0x56438a11, 0x64b4d8e4, 0x112e8430, 0xf12ada36, 0x84b086e2, 0xb647d417, 0xc3dd88c3, 0xaccb435c, 0xd9511f88, 0xeba64d7d, 0x9e3c11a9, +0x7e384faf, 0x0ba2137b, 0x3955418e, 0x4ccf1d5a, 0x7b0671d5, 0x0e9c2d01, 0x3c6b7ff4, 0x49f12320, 0xa9f57d26, 0xdc6f21f2, 0xee987307, 0x9b022fd3, 0xf414e44c, 0x818eb898, 0xb379ea6d, 0xc6e3b6b9, 0x26e7e8bf, 0x537db46b, 0x618ae69e, 0x1410ba4a, +0xc52212b0, 0xb0b84e64, 0x824f1c91, 0xf7d54045, 0x17d11e43, 0x624b4297, 0x50bc1062, 0x25264cb6, 0x4a308729, 0x3faadbfd, 0x0d5d8908, 0x78c7d5dc, 0x98c38bda, 0xed59d70e, 0xdfae85fb, 0xaa34d92f, 0x9dfdb5a0, 0xe867e974, 0xda90bb81, 0xaf0ae755, +0x4f0eb953, 0x3a94e587, 0x0863b772, 0x7df9eba6, 0x12ef2039, 0x67757ced, 0x55822e18, 0x201872cc, 0xc01c2cca, 0xb586701e, 0x877122eb, 0xf2eb7e3f, 0xe6fbc475, 0x936198a1, 0xa196ca54, 0xd40c9680, 0x3408c886, 0x41929452, 0x7365c6a7, 0x06ff9a73, +0x69e951ec, 0x1c730d38, 0x2e845fcd, 0x5b1e0319, 0xbb1a5d1f, 0xce8001cb, 0xfc77533e, 0x89ed0fea, 0xbe246365, 0xcbbe3fb1, 0xf9496d44, 0x8cd33190, 0x6cd76f96, 0x194d3342, 0x2bba61b7, 0x5e203d63, 0x3136f6fc, 0x44acaa28, 0x765bf8dd, 0x03c1a409, +0xe3c5fa0f, 0x965fa6db, 0xa4a8f42e, 0xd132a8fa, 0x3224e56a, 0x47beb9be, 0x7549eb4b, 0x00d3b79f, 0xe0d7e999, 0x954db54d, 0xa7bae7b8, 0xd220bb6c, 0xbd3670f3, 0xc8ac2c27, 0xfa5b7ed2, 0x8fc12206, 0x6fc57c00, 0x1a5f20d4, 0x28a87221, 0x5d322ef5, +0x6afb427a, 0x1f611eae, 0x2d964c5b, 0x580c108f, 0xb8084e89, 0xcd92125d, 0xff6540a8, 0x8aff1c7c, 0xe5e9d7e3, 0x90738b37, 0xa284d9c2, 0xd71e8516, 0x371adb10, 0x428087c4, 0x7077d531, 0x05ed89e5, 0x11fd33af, 0x64676f7b, 0x56903d8e, 0x230a615a, +0xc30e3f5c, 0xb6946388, 0x8463317d, 0xf1f96da9, 0x9eefa636, 0xeb75fae2, 0xd982a817, 0xac18f4c3, 0x4c1caac5, 0x3986f611, 0x0b71a4e4, 0x7eebf830, 0x492294bf, 0x3cb8c86b, 0x0e4f9a9e, 0x7bd5c64a, 0x9bd1984c, 0xee4bc498, 0xdcbc966d, 0xa926cab9, +0xc6300126, 0xb3aa5df2, 0x815d0f07, 0xf4c753d3, 0x14c30dd5, 0x61595101, 0x53ae03f4, 0x26345f20, 0xf706f7da, 0x829cab0e, 0xb06bf9fb, 0xc5f1a52f, 0x25f5fb29, 0x506fa7fd, 0x6298f508, 0x1702a9dc, 0x78146243, 0x0d8e3e97, 0x3f796c62, 0x4ae330b6, +0xaae76eb0, 0xdf7d3264, 0xed8a6091, 0x98103c45, 0xafd950ca, 0xda430c1e, 0xe8b45eeb, 0x9d2e023f, 0x7d2a5c39, 0x08b000ed, 0x3a475218, 0x4fdd0ecc, 0x20cbc553, 0x55519987, 0x67a6cb72, 0x123c97a6, 0xf238c9a0, 0x87a29574, 0xb555c781, 0xc0cf9b55, +0xd4df211f, 0xa1457dcb, 0x93b22f3e, 0xe62873ea, 0x062c2dec, 0x73b67138, 0x414123cd, 0x34db7f19, 0x5bcdb486, 0x2e57e852, 0x1ca0baa7, 0x693ae673, 0x893eb875, 0xfca4e4a1, 0xce53b654, 0xbbc9ea80, 0x8c00860f, 0xf99adadb, 0xcb6d882e, 0xbef7d4fa, +0x5ef38afc, 0x2b69d628, 0x199e84dd, 0x6c04d809, 0x03121396, 0x76884f42, 0x447f1db7, 0x31e54163, 0xd1e11f65, 0xa47b43b1, 0x968c1144, 0xe3164d90, 0x00000000, 0x0e7d1ac1, 0xf69306ac, 0xf8ee1c6d, 0xdd89e12f, 0xd3f4fbee, 0x2b1ae783, 0x2567fd42, +0xe9ea3912, 0xe79723d3, 0x1f793fbe, 0x1104257f, 0x3463d83d, 0x3a1ec2fc, 0xc2f0de91, 0xcc8dc450, 0x8b87e2db, 0x85faf81a, 0x7d14e477, 0x7369feb6, 0x560e03f4, 0x58731935, 0xa09d0558, 0xaee01f99, 0x626ddbc9, 0x6c10c108, 0x94fedd65, 0x9a83c7a4, +0xbfe43ae6, 0xb1992027, 0x49773c4a, 0x470a268b, 0xe09585b2, 0xeee89f73, 0x1606831e, 0x187b99df, 0x3d1c649d, 0x33617e5c, 0xcb8f6231, 0xc5f278f0, 0x097fbca0, 0x0702a661, 0xffecba0c, 0xf191a0cd, 0xd4f65d8f, 0xda8b474e, 0x22655b23, 0x2c1841e2, +0x6b126769, 0x656f7da8, 0x9d8161c5, 0x93fc7b04, 0xb69b8646, 0xb8e69c87, 0x400880ea, 0x4e759a2b, 0x82f85e7b, 0x8c8544ba, 0x746b58d7, 0x7a164216, 0x5f71bf54, 0x510ca595, 0xa9e2b9f8, 0xa79fa339, 0xa85f19d0, 0xa6220311, 0x5ecc1f7c, 0x50b105bd, +0x75d6f8ff, 0x7babe23e, 0x8345fe53, 0x8d38e492, 0x41b520c2, 0x4fc83a03, 0xb726266e, 0xb95b3caf, 0x9c3cc1ed, 0x9241db2c, 0x6aafc741, 0x64d2dd80, 0x23d8fb0b, 0x2da5e1ca, 0xd54bfda7, 0xdb36e766, 0xfe511a24, 0xf02c00e5, 0x08c21c88, 0x06bf0649, +0xca32c219, 0xc44fd8d8, 0x3ca1c4b5, 0x32dcde74, 0x17bb2336, 0x19c639f7, 0xe128259a, 0xef553f5b, 0x48ca9c62, 0x46b786a3, 0xbe599ace, 0xb024800f, 0x95437d4d, 0x9b3e678c, 0x63d07be1, 0x6dad6120, 0xa120a570, 0xaf5dbfb1, 0x57b3a3dc, 0x59ceb91d, +0x7ca9445f, 0x72d45e9e, 0x8a3a42f3, 0x84475832, 0xc34d7eb9, 0xcd306478, 0x35de7815, 0x3ba362d4, 0x1ec49f96, 0x10b98557, 0xe857993a, 0xe62a83fb, 0x2aa747ab, 0x24da5d6a, 0xdc344107, 0xd2495bc6, 0xf72ea684, 0xf953bc45, 0x01bda028, 0x0fc0bae9, +0x6598156f, 0x6be50fae, 0x930b13c3, 0x9d760902, 0xb811f440, 0xb66cee81, 0x4e82f2ec, 0x40ffe82d, 0x8c722c7d, 0x820f36bc, 0x7ae12ad1, 0x749c3010, 0x51fbcd52, 0x5f86d793, 0xa768cbfe, 0xa915d13f, 0xee1ff7b4, 0xe062ed75, 0x188cf118, 0x16f1ebd9, +0x3396169b, 0x3deb0c5a, 0xc5051037, 0xcb780af6, 0x07f5cea6, 0x0988d467, 0xf166c80a, 0xff1bd2cb, 0xda7c2f89, 0xd4013548, 0x2cef2925, 0x229233e4, 0x850d90dd, 0x8b708a1c, 0x739e9671, 0x7de38cb0, 0x588471f2, 0x56f96b33, 0xae17775e, 0xa06a6d9f, +0x6ce7a9cf, 0x629ab30e, 0x9a74af63, 0x9409b5a2, 0xb16e48e0, 0xbf135221, 0x47fd4e4c, 0x4980548d, 0x0e8a7206, 0x00f768c7, 0xf81974aa, 0xf6646e6b, 0xd3039329, 0xdd7e89e8, 0x25909585, 0x2bed8f44, 0xe7604b14, 0xe91d51d5, 0x11f34db8, 0x1f8e5779, +0x3ae9aa3b, 0x3494b0fa, 0xcc7aac97, 0xc207b656, 0xcdc70cbf, 0xc3ba167e, 0x3b540a13, 0x352910d2, 0x104eed90, 0x1e33f751, 0xe6ddeb3c, 0xe8a0f1fd, 0x242d35ad, 0x2a502f6c, 0xd2be3301, 0xdcc329c0, 0xf9a4d482, 0xf7d9ce43, 0x0f37d22e, 0x014ac8ef, +0x4640ee64, 0x483df4a5, 0xb0d3e8c8, 0xbeaef209, 0x9bc90f4b, 0x95b4158a, 0x6d5a09e7, 0x63271326, 0xafaad776, 0xa1d7cdb7, 0x5939d1da, 0x5744cb1b, 0x72233659, 0x7c5e2c98, 0x84b030f5, 0x8acd2a34, 0x2d52890d, 0x232f93cc, 0xdbc18fa1, 0xd5bc9560, +0xf0db6822, 0xfea672e3, 0x06486e8e, 0x0835744f, 0xc4b8b01f, 0xcac5aade, 0x322bb6b3, 0x3c56ac72, 0x19315130, 0x174c4bf1, 0xefa2579c, 0xe1df4d5d, 0xa6d56bd6, 0xa8a87117, 0x50466d7a, 0x5e3b77bb, 0x7b5c8af9, 0x75219038, 0x8dcf8c55, 0x83b29694, +0x4f3f52c4, 0x41424805, 0xb9ac5468, 0xb7d14ea9, 0x92b6b3eb, 0x9ccba92a, 0x6425b547, 0x6a58af86, 0x00000000, 0x9a7bd0b3, 0x525f29df, 0xc824f96c, 0x36b45ca8, 0xaccf8c1b, 0x64eb7577, 0xfe90a5c4, 0x80e9aa80, 0x1a927a33, 0xd2b6835f, 0x48cd53ec, +0xb65df628, 0x2c26269b, 0xe402dff7, 0x7e790f44, 0x43b20dbd, 0xd9c9dd0e, 0x11ed2462, 0x8b96f4d1, 0x75065115, 0xef7d81a6, 0x275978ca, 0xbd22a879, 0xc35ba73d, 0x5920778e, 0x91048ee2, 0x0b7f5e51, 0xf5effb95, 0x6f942b26, 0xa7b0d24a, 0x3dcb02f9, +0xaec69550, 0x34bd45e3, 0xfc99bc8f, 0x66e26c3c, 0x9872c9f8, 0x0209194b, 0xca2de027, 0x50563094, 0x2e2f3fd0, 0xb454ef63, 0x7c70160f, 0xe60bc6bc, 0x189b6378, 0x82e0b3cb, 0x4ac44aa7, 0xd0bf9a14, 0xed7498ed, 0x770f485e, 0xbf2bb132, 0x25506181, +0xdbc0c445, 0x41bb14f6, 0x899fed9a, 0x13e43d29, 0x6d9d326d, 0xf7e6e2de, 0x3fc21bb2, 0xa5b9cb01, 0x5b296ec5, 0xc152be76, 0x0976471a, 0x930d97a9, 0xbc28b3ba, 0x26536309, 0xee779a65, 0x740c4ad6, 0x8a9cef12, 0x10e73fa1, 0xd8c3c6cd, 0x42b8167e, +0x3cc1193a, 0xa6bac989, 0x6e9e30e5, 0xf4e5e056, 0x0a754592, 0x900e9521, 0x582a6c4d, 0xc251bcfe, 0xff9abe07, 0x65e16eb4, 0xadc597d8, 0x37be476b, 0xc92ee2af, 0x5355321c, 0x9b71cb70, 0x010a1bc3, 0x7f731487, 0xe508c434, 0x2d2c3d58, 0xb757edeb, +0x49c7482f, 0xd3bc989c, 0x1b9861f0, 0x81e3b143, 0x12ee26ea, 0x8895f659, 0x40b10f35, 0xdacadf86, 0x245a7a42, 0xbe21aaf1, 0x7605539d, 0xec7e832e, 0x92078c6a, 0x087c5cd9, 0xc058a5b5, 0x5a237506, 0xa4b3d0c2, 0x3ec80071, 0xf6ecf91d, 0x6c9729ae, +0x515c2b57, 0xcb27fbe4, 0x03030288, 0x9978d23b, 0x67e877ff, 0xfd93a74c, 0x35b75e20, 0xafcc8e93, 0xd1b581d7, 0x4bce5164, 0x83eaa808, 0x199178bb, 0xe701dd7f, 0x7d7a0dcc, 0xb55ef4a0, 0x2f252413, 0xc7ed70d2, 0x5d96a061, 0x95b2590d, 0x0fc989be, +0xf1592c7a, 0x6b22fcc9, 0xa30605a5, 0x397dd516, 0x4704da52, 0xdd7f0ae1, 0x155bf38d, 0x8f20233e, 0x71b086fa, 0xebcb5649, 0x23efaf25, 0xb9947f96, 0x845f7d6f, 0x1e24addc, 0xd60054b0, 0x4c7b8403, 0xb2eb21c7, 0x2890f174, 0xe0b40818, 0x7acfd8ab, +0x04b6d7ef, 0x9ecd075c, 0x56e9fe30, 0xcc922e83, 0x32028b47, 0xa8795bf4, 0x605da298, 0xfa26722b, 0x692be582, 0xf3503531, 0x3b74cc5d, 0xa10f1cee, 0x5f9fb92a, 0xc5e46999, 0x0dc090f5, 0x97bb4046, 0xe9c24f02, 0x73b99fb1, 0xbb9d66dd, 0x21e6b66e, +0xdf7613aa, 0x450dc319, 0x8d293a75, 0x1752eac6, 0x2a99e83f, 0xb0e2388c, 0x78c6c1e0, 0xe2bd1153, 0x1c2db497, 0x86566424, 0x4e729d48, 0xd4094dfb, 0xaa7042bf, 0x300b920c, 0xf82f6b60, 0x6254bbd3, 0x9cc41e17, 0x06bfcea4, 0xce9b37c8, 0x54e0e77b, +0x7bc5c368, 0xe1be13db, 0x299aeab7, 0xb3e13a04, 0x4d719fc0, 0xd70a4f73, 0x1f2eb61f, 0x855566ac, 0xfb2c69e8, 0x6157b95b, 0xa9734037, 0x33089084, 0xcd983540, 0x57e3e5f3, 0x9fc71c9f, 0x05bccc2c, 0x3877ced5, 0xa20c1e66, 0x6a28e70a, 0xf05337b9, +0x0ec3927d, 0x94b842ce, 0x5c9cbba2, 0xc6e76b11, 0xb89e6455, 0x22e5b4e6, 0xeac14d8a, 0x70ba9d39, 0x8e2a38fd, 0x1451e84e, 0xdc751122, 0x460ec191, 0xd5035638, 0x4f78868b, 0x875c7fe7, 0x1d27af54, 0xe3b70a90, 0x79ccda23, 0xb1e8234f, 0x2b93f3fc, +0x55eafcb8, 0xcf912c0b, 0x07b5d567, 0x9dce05d4, 0x635ea010, 0xf92570a3, 0x310189cf, 0xab7a597c, 0x96b15b85, 0x0cca8b36, 0xc4ee725a, 0x5e95a2e9, 0xa005072d, 0x3a7ed79e, 0xf25a2ef2, 0x6821fe41, 0x1658f105, 0x8c2321b6, 0x4407d8da, 0xde7c0869, +0x20ecadad, 0xba977d1e, 0x72b38472, 0xe8c854c1, 0x00000000, 0x09bf7e74, 0x92edad03, 0x9b52d377, 0xd2b8a0d7, 0xdb07dea3, 0x40550dd4, 0x49ea73a0, 0xbc4abd1e, 0xb5f5c36a, 0x2ea7101d, 0x27186e69, 0x6ef21dc9, 0x674d63bd, 0xfc1fb0ca, 0xf5a0cebe, +0x4fa7e1a9, 0x46189fdd, 0xdd4a4caa, 0xd4f532de, 0x9d1f417e, 0x94a03f0a, 0x0ff2ec7d, 0x064d9209, 0xf3ed5cb7, 0xfa5222c3, 0x6100f1b4, 0x68bf8fc0, 0x2155fc60, 0x28ea8214, 0xb3b85163, 0xba072f17, 0xce22dd80, 0xc79da3f4, 0x5ccf7083, 0x55700ef7, +0x1c9a7d57, 0x15250323, 0x8e77d054, 0x87c8ae20, 0x7268609e, 0x7bd71eea, 0xe085cd9d, 0xe93ab3e9, 0xa0d0c049, 0xa96fbe3d, 0x323d6d4a, 0x3b82133e, 0x81853c29, 0x883a425d, 0x1368912a, 0x1ad7ef5e, 0x533d9cfe, 0x5a82e28a, 0xc1d031fd, 0xc86f4f89, +0x3dcf8137, 0x3470ff43, 0xaf222c34, 0xa69d5240, 0xef7721e0, 0xe6c85f94, 0x7d9a8ce3, 0x7425f297, 0x5a23c9ba, 0x539cb7ce, 0xc8ce64b9, 0xc1711acd, 0x889b696d, 0x81241719, 0x1a76c46e, 0x13c9ba1a, 0xe66974a4, 0xefd60ad0, 0x7484d9a7, 0x7d3ba7d3, +0x34d1d473, 0x3d6eaa07, 0xa63c7970, 0xaf830704, 0x15842813, 0x1c3b5667, 0x87698510, 0x8ed6fb64, 0xc73c88c4, 0xce83f6b0, 0x55d125c7, 0x5c6e5bb3, 0xa9ce950d, 0xa071eb79, 0x3b23380e, 0x329c467a, 0x7b7635da, 0x72c94bae, 0xe99b98d9, 0xe024e6ad, +0x9401143a, 0x9dbe6a4e, 0x06ecb939, 0x0f53c74d, 0x46b9b4ed, 0x4f06ca99, 0xd45419ee, 0xddeb679a, 0x284ba924, 0x21f4d750, 0xbaa60427, 0xb3197a53, 0xfaf309f3, 0xf34c7787, 0x681ea4f0, 0x61a1da84, 0xdba6f593, 0xd2198be7, 0x494b5890, 0x40f426e4, +0x091e5544, 0x00a12b30, 0x9bf3f847, 0x924c8633, 0x67ec488d, 0x6e5336f9, 0xf501e58e, 0xfcbe9bfa, 0xb554e85a, 0xbceb962e, 0x27b94559, 0x2e063b2d, 0xf49b0ffd, 0xfd247189, 0x6676a2fe, 0x6fc9dc8a, 0x2623af2a, 0x2f9cd15e, 0xb4ce0229, 0xbd717c5d, +0x48d1b2e3, 0x416ecc97, 0xda3c1fe0, 0xd3836194, 0x9a691234, 0x93d66c40, 0x0884bf37, 0x013bc143, 0xbb3cee54, 0xb2839020, 0x29d14357, 0x206e3d23, 0x69844e83, 0x603b30f7, 0xfb69e380, 0xf2d69df4, 0x0776534a, 0x0ec92d3e, 0x959bfe49, 0x9c24803d, +0xd5cef39d, 0xdc718de9, 0x47235e9e, 0x4e9c20ea, 0x3ab9d27d, 0x3306ac09, 0xa8547f7e, 0xa1eb010a, 0xe80172aa, 0xe1be0cde, 0x7aecdfa9, 0x7353a1dd, 0x86f36f63, 0x8f4c1117, 0x141ec260, 0x1da1bc14, 0x544bcfb4, 0x5df4b1c0, 0xc6a662b7, 0xcf191cc3, +0x751e33d4, 0x7ca14da0, 0xe7f39ed7, 0xee4ce0a3, 0xa7a69303, 0xae19ed77, 0x354b3e00, 0x3cf44074, 0xc9548eca, 0xc0ebf0be, 0x5bb923c9, 0x52065dbd, 0x1bec2e1d, 0x12535069, 0x8901831e, 0x80befd6a, 0xaeb8c647, 0xa707b833, 0x3c556b44, 0x35ea1530, +0x7c006690, 0x75bf18e4, 0xeeedcb93, 0xe752b5e7, 0x12f27b59, 0x1b4d052d, 0x801fd65a, 0x89a0a82e, 0xc04adb8e, 0xc9f5a5fa, 0x52a7768d, 0x5b1808f9, 0xe11f27ee, 0xe8a0599a, 0x73f28aed, 0x7a4df499, 0x33a78739, 0x3a18f94d, 0xa14a2a3a, 0xa8f5544e, +0x5d559af0, 0x54eae484, 0xcfb837f3, 0xc6074987, 0x8fed3a27, 0x86524453, 0x1d009724, 0x14bfe950, 0x609a1bc7, 0x692565b3, 0xf277b6c4, 0xfbc8c8b0, 0xb222bb10, 0xbb9dc564, 0x20cf1613, 0x29706867, 0xdcd0a6d9, 0xd56fd8ad, 0x4e3d0bda, 0x478275ae, +0x0e68060e, 0x07d7787a, 0x9c85ab0d, 0x953ad579, 0x2f3dfa6e, 0x2682841a, 0xbdd0576d, 0xb46f2919, 0xfd855ab9, 0xf43a24cd, 0x6f68f7ba, 0x66d789ce, 0x93774770, 0x9ac83904, 0x019aea73, 0x08259407, 0x41cfe7a7, 0x487099d3, 0xd3224aa4, 0xda9d34d0, +0x00000000, 0x4ede02eb, 0xdfc0ab31, 0x911ea9da, 0xb2ab4704, 0xfc7545ef, 0x6d6bec35, 0x23b5eede, 0x0ae9929c, 0x44379077, 0xd52939ad, 0x9bf73b46, 0xb842d598, 0xf69cd773, 0x67827ea9, 0x295c7c42, 0x80d089fb, 0xce0e8b10, 0x5f1022ca, 0x11ce2021, +0x327bceff, 0x7ca5cc14, 0xedbb65ce, 0xa3656725, 0x8a391b67, 0xc4e7198c, 0x55f9b056, 0x1b27b2bd, 0x38925c63, 0x764c5e88, 0xe752f752, 0xa98cf5b9, 0xeecc68d5, 0xa0126a3e, 0x310cc3e4, 0x7fd2c10f, 0x5c672fd1, 0x12b92d3a, 0x83a784e0, 0xcd79860b, +0xe425fa49, 0xaafbf8a2, 0x3be55178, 0x753b5393, 0x568ebd4d, 0x1850bfa6, 0x894e167c, 0xc7901497, 0x6e1ce12e, 0x20c2e3c5, 0xb1dc4a1f, 0xff0248f4, 0xdcb7a62a, 0x9269a4c1, 0x03770d1b, 0x4da90ff0, 0x64f573b2, 0x2a2b7159, 0xbb35d883, 0xf5ebda68, +0xd65e34b6, 0x9880365d, 0x099e9f87, 0x47409d6c, 0x65d47b27, 0x2b0a79cc, 0xba14d016, 0xf4cad2fd, 0xd77f3c23, 0x99a13ec8, 0x08bf9712, 0x466195f9, 0x6f3de9bb, 0x21e3eb50, 0xb0fd428a, 0xfe234061, 0xdd96aebf, 0x9348ac54, 0x0256058e, 0x4c880765, +0xe504f2dc, 0xabdaf037, 0x3ac459ed, 0x741a5b06, 0x57afb5d8, 0x1971b733, 0x886f1ee9, 0xc6b11c02, 0xefed6040, 0xa13362ab, 0x302dcb71, 0x7ef3c99a, 0x5d462744, 0x139825af, 0x82868c75, 0xcc588e9e, 0x8b1813f2, 0xc5c61119, 0x54d8b8c3, 0x1a06ba28, +0x39b354f6, 0x776d561d, 0xe673ffc7, 0xa8adfd2c, 0x81f1816e, 0xcf2f8385, 0x5e312a5f, 0x10ef28b4, 0x335ac66a, 0x7d84c481, 0xec9a6d5b, 0xa2446fb0, 0x0bc89a09, 0x451698e2, 0xd4083138, 0x9ad633d3, 0xb963dd0d, 0xf7bddfe6, 0x66a3763c, 0x287d74d7, +0x01210895, 0x4fff0a7e, 0xdee1a3a4, 0x903fa14f, 0xb38a4f91, 0xfd544d7a, 0x6c4ae4a0, 0x2294e64b, 0x030cc7ac, 0x4dd2c547, 0xdccc6c9d, 0x92126e76, 0xb1a780a8, 0xff798243, 0x6e672b99, 0x20b92972, 0x09e55530, 0x473b57db, 0xd625fe01, 0x98fbfcea, +0xbb4e1234, 0xf59010df, 0x648eb905, 0x2a50bbee, 0x83dc4e57, 0xcd024cbc, 0x5c1ce566, 0x12c2e78d, 0x31770953, 0x7fa90bb8, 0xeeb7a262, 0xa069a089, 0x8935dccb, 0xc7ebde20, 0x56f577fa, 0x182b7511, 0x3b9e9bcf, 0x75409924, 0xe45e30fe, 0xaa803215, +0xedc0af79, 0xa31ead92, 0x32000448, 0x7cde06a3, 0x5f6be87d, 0x11b5ea96, 0x80ab434c, 0xce7541a7, 0xe7293de5, 0xa9f73f0e, 0x38e996d4, 0x7637943f, 0x55827ae1, 0x1b5c780a, 0x8a42d1d0, 0xc49cd33b, 0x6d102682, 0x23ce2469, 0xb2d08db3, 0xfc0e8f58, +0xdfbb6186, 0x9165636d, 0x007bcab7, 0x4ea5c85c, 0x67f9b41e, 0x2927b6f5, 0xb8391f2f, 0xf6e71dc4, 0xd552f31a, 0x9b8cf1f1, 0x0a92582b, 0x444c5ac0, 0x66d8bc8b, 0x2806be60, 0xb91817ba, 0xf7c61551, 0xd473fb8f, 0x9aadf964, 0x0bb350be, 0x456d5255, +0x6c312e17, 0x22ef2cfc, 0xb3f18526, 0xfd2f87cd, 0xde9a6913, 0x90446bf8, 0x015ac222, 0x4f84c0c9, 0xe6083570, 0xa8d6379b, 0x39c89e41, 0x77169caa, 0x54a37274, 0x1a7d709f, 0x8b63d945, 0xc5bddbae, 0xece1a7ec, 0xa23fa507, 0x33210cdd, 0x7dff0e36, +0x5e4ae0e8, 0x1094e203, 0x818a4bd9, 0xcf544932, 0x8814d45e, 0xc6cad6b5, 0x57d47f6f, 0x190a7d84, 0x3abf935a, 0x746191b1, 0xe57f386b, 0xaba13a80, 0x82fd46c2, 0xcc234429, 0x5d3dedf3, 0x13e3ef18, 0x305601c6, 0x7e88032d, 0xef96aaf7, 0xa148a81c, +0x08c45da5, 0x461a5f4e, 0xd704f694, 0x99daf47f, 0xba6f1aa1, 0xf4b1184a, 0x65afb190, 0x2b71b37b, 0x022dcf39, 0x4cf3cdd2, 0xdded6408, 0x933366e3, 0xb086883d, 0xfe588ad6, 0x6f46230c, 0x219821e7, 0x00000000, 0x9d32f114, 0x520a0b94, 0xcf38fa80, +0x7ee671d1, 0xe3d480c5, 0x2cec7a45, 0xb1de8b51, 0x831a6b8b, 0x1e289a9f, 0xd110601f, 0x4c22910b, 0xfdfc1a5a, 0x60ceeb4e, 0xaff611ce, 0x32c4e0da, 0x97cd60a9, 0x0aff91bd, 0xc5c76b3d, 0x58f59a29, 0xe92b1178, 0x7419e06c, 0xbb211aec, 0x2613ebf8, +0x14d70b22, 0x89e5fa36, 0x46dd00b6, 0xdbeff1a2, 0x6a317af3, 0xf7038be7, 0x383b7167, 0xa5098073, 0x7490d0d9, 0xe9a221cd, 0x269adb4d, 0xbba82a59, 0x0a76a108, 0x9744501c, 0x587caa9c, 0xc54e5b88, 0xf78abb52, 0x6ab84a46, 0xa580b0c6, 0x38b241d2, +0x896cca83, 0x145e3b97, 0xdb66c117, 0x46543003, 0xe35db070, 0x7e6f4164, 0xb157bbe4, 0x2c654af0, 0x9dbbc1a1, 0x008930b5, 0xcfb1ca35, 0x52833b21, 0x6047dbfb, 0xfd752aef, 0x324dd06f, 0xaf7f217b, 0x1ea1aa2a, 0x83935b3e, 0x4caba1be, 0xd19950aa, +0xaecc2eb7, 0x33fedfa3, 0xfcc62523, 0x61f4d437, 0xd02a5f66, 0x4d18ae72, 0x822054f2, 0x1f12a5e6, 0x2dd6453c, 0xb0e4b428, 0x7fdc4ea8, 0xe2eebfbc, 0x533034ed, 0xce02c5f9, 0x013a3f79, 0x9c08ce6d, 0x39014e1e, 0xa433bf0a, 0x6b0b458a, 0xf639b49e, +0x47e73fcf, 0xdad5cedb, 0x15ed345b, 0x88dfc54f, 0xba1b2595, 0x2729d481, 0xe8112e01, 0x7523df15, 0xc4fd5444, 0x59cfa550, 0x96f75fd0, 0x0bc5aec4, 0xda5cfe6e, 0x476e0f7a, 0x8856f5fa, 0x156404ee, 0xa4ba8fbf, 0x39887eab, 0xf6b0842b, 0x6b82753f, +0x594695e5, 0xc47464f1, 0x0b4c9e71, 0x967e6f65, 0x27a0e434, 0xba921520, 0x75aaefa0, 0xe8981eb4, 0x4d919ec7, 0xd0a36fd3, 0x1f9b9553, 0x82a96447, 0x3377ef16, 0xae451e02, 0x617de482, 0xfc4f1596, 0xce8bf54c, 0x53b90458, 0x9c81fed8, 0x01b30fcc, +0xb06d849d, 0x2d5f7589, 0xe2678f09, 0x7f557e1d, 0x98904060, 0x05a2b174, 0xca9a4bf4, 0x57a8bae0, 0xe67631b1, 0x7b44c0a5, 0xb47c3a25, 0x294ecb31, 0x1b8a2beb, 0x86b8daff, 0x4980207f, 0xd4b2d16b, 0x656c5a3a, 0xf85eab2e, 0x376651ae, 0xaa54a0ba, +0x0f5d20c9, 0x926fd1dd, 0x5d572b5d, 0xc065da49, 0x71bb5118, 0xec89a00c, 0x23b15a8c, 0xbe83ab98, 0x8c474b42, 0x1175ba56, 0xde4d40d6, 0x437fb1c2, 0xf2a13a93, 0x6f93cb87, 0xa0ab3107, 0x3d99c013, 0xec0090b9, 0x713261ad, 0xbe0a9b2d, 0x23386a39, +0x92e6e168, 0x0fd4107c, 0xc0eceafc, 0x5dde1be8, 0x6f1afb32, 0xf2280a26, 0x3d10f0a6, 0xa02201b2, 0x11fc8ae3, 0x8cce7bf7, 0x43f68177, 0xdec47063, 0x7bcdf010, 0xe6ff0104, 0x29c7fb84, 0xb4f50a90, 0x052b81c1, 0x981970d5, 0x57218a55, 0xca137b41, +0xf8d79b9b, 0x65e56a8f, 0xaadd900f, 0x37ef611b, 0x8631ea4a, 0x1b031b5e, 0xd43be1de, 0x490910ca, 0x365c6ed7, 0xab6e9fc3, 0x64566543, 0xf9649457, 0x48ba1f06, 0xd588ee12, 0x1ab01492, 0x8782e586, 0xb546055c, 0x2874f448, 0xe74c0ec8, 0x7a7effdc, +0xcba0748d, 0x56928599, 0x99aa7f19, 0x04988e0d, 0xa1910e7e, 0x3ca3ff6a, 0xf39b05ea, 0x6ea9f4fe, 0xdf777faf, 0x42458ebb, 0x8d7d743b, 0x104f852f, 0x228b65f5, 0xbfb994e1, 0x70816e61, 0xedb39f75, 0x5c6d1424, 0xc15fe530, 0x0e671fb0, 0x9355eea4, +0x42ccbe0e, 0xdffe4f1a, 0x10c6b59a, 0x8df4448e, 0x3c2acfdf, 0xa1183ecb, 0x6e20c44b, 0xf312355f, 0xc1d6d585, 0x5ce42491, 0x93dcde11, 0x0eee2f05, 0xbf30a454, 0x22025540, 0xed3aafc0, 0x70085ed4, 0xd501dea7, 0x48332fb3, 0x870bd533, 0x1a392427, +0xabe7af76, 0x36d55e62, 0xf9eda4e2, 0x64df55f6, 0x561bb52c, 0xcb294438, 0x0411beb8, 0x99234fac, 0x28fdc4fd, 0xb5cf35e9, 0x7af7cf69, 0xe7c53e7d, 0x00000000, 0x93d6fc39, 0xf11e75a8, 0x62c88991, 0x5dc5dba7, 0xce13279e, 0xacdbae0f, 0x3f0d5236, +0x08babef6, 0x9b6c42cf, 0xf9a4cb5e, 0x6a723767, 0x557f6551, 0xc6a99968, 0xa46110f9, 0x37b7ecc0, 0x3dac6104, 0xae7a9d3d, 0xccb214ac, 0x5f64e895, 0x6069baa3, 0xf3bf469a, 0x9177cf0b, 0x02a13332, 0x3516dff2, 0xa6c023cb, 0xc408aa5a, 0x57de5663, +0x68d30455, 0xfb05f86c, 0x99cd71fd, 0x0a1b8dc4, 0xc43b6f07, 0x57ed933e, 0x35251aaf, 0xa6f3e696, 0x99feb4a0, 0x0a284899, 0x68e0c108, 0xfb363d31, 0xcc81d1f1, 0x5f572dc8, 0x3d9fa459, 0xae495860, 0x91440a56, 0x0292f66f, 0x605a7ffe, 0xf38c83c7, +0xf9970e03, 0x6a41f23a, 0x08897bab, 0x9b5f8792, 0xa452d5a4, 0x3784299d, 0x554ca00c, 0xc69a5c35, 0xf12db0f5, 0x62fb4ccc, 0x0033c55d, 0x93e53964, 0xace86b52, 0x3f3e976b, 0x5df61efa, 0xce20e2c3, 0x4e39945d, 0xddef6864, 0xbf27e1f5, 0x2cf11dcc, +0x13fc4ffa, 0x802ab3c3, 0xe2e23a52, 0x7134c66b, 0x46832aab, 0xd555d692, 0xb79d5f03, 0x244ba33a, 0x1b46f10c, 0x88900d35, 0xea5884a4, 0x798e789d, 0x7395f559, 0xe0430960, 0x828b80f1, 0x115d7cc8, 0x2e502efe, 0xbd86d2c7, 0xdf4e5b56, 0x4c98a76f, +0x7b2f4baf, 0xe8f9b796, 0x8a313e07, 0x19e7c23e, 0x26ea9008, 0xb53c6c31, 0xd7f4e5a0, 0x44221999, 0x8a02fb5a, 0x19d40763, 0x7b1c8ef2, 0xe8ca72cb, 0xd7c720fd, 0x4411dcc4, 0x26d95555, 0xb50fa96c, 0x82b845ac, 0x116eb995, 0x73a63004, 0xe070cc3d, +0xdf7d9e0b, 0x4cab6232, 0x2e63eba3, 0xbdb5179a, 0xb7ae9a5e, 0x24786667, 0x46b0eff6, 0xd56613cf, 0xea6b41f9, 0x79bdbdc0, 0x1b753451, 0x88a3c868, 0xbf1424a8, 0x2cc2d891, 0x4e0a5100, 0xdddcad39, 0xe2d1ff0f, 0x71070336, 0x13cf8aa7, 0x8019769e, +0xffd862e4, 0x6c0e9edd, 0x0ec6174c, 0x9d10eb75, 0xa21db943, 0x31cb457a, 0x5303cceb, 0xc0d530d2, 0xf762dc12, 0x64b4202b, 0x067ca9ba, 0x95aa5583, 0xaaa707b5, 0x3971fb8c, 0x5bb9721d, 0xc86f8e24, 0xc27403e0, 0x51a2ffd9, 0x336a7648, 0xa0bc8a71, +0x9fb1d847, 0x0c67247e, 0x6eafadef, 0xfd7951d6, 0xcacebd16, 0x5918412f, 0x3bd0c8be, 0xa8063487, 0x970b66b1, 0x04dd9a88, 0x66151319, 0xf5c3ef20, 0x3be30de3, 0xa835f1da, 0xcafd784b, 0x592b8472, 0x6626d644, 0xf5f02a7d, 0x9738a3ec, 0x04ee5fd5, +0x3359b315, 0xa08f4f2c, 0xc247c6bd, 0x51913a84, 0x6e9c68b2, 0xfd4a948b, 0x9f821d1a, 0x0c54e123, 0x064f6ce7, 0x959990de, 0xf751194f, 0x6487e576, 0x5b8ab740, 0xc85c4b79, 0xaa94c2e8, 0x39423ed1, 0x0ef5d211, 0x9d232e28, 0xffeba7b9, 0x6c3d5b80, +0x533009b6, 0xc0e6f58f, 0xa22e7c1e, 0x31f88027, 0xb1e1f6b9, 0x22370a80, 0x40ff8311, 0xd3297f28, 0xec242d1e, 0x7ff2d127, 0x1d3a58b6, 0x8eeca48f, 0xb95b484f, 0x2a8db476, 0x48453de7, 0xdb93c1de, 0xe49e93e8, 0x77486fd1, 0x1580e640, 0x86561a79, +0x8c4d97bd, 0x1f9b6b84, 0x7d53e215, 0xee851e2c, 0xd1884c1a, 0x425eb023, 0x209639b2, 0xb340c58b, 0x84f7294b, 0x1721d572, 0x75e95ce3, 0xe63fa0da, 0xd932f2ec, 0x4ae40ed5, 0x282c8744, 0xbbfa7b7d, 0x75da99be, 0xe60c6587, 0x84c4ec16, 0x1712102f, +0x281f4219, 0xbbc9be20, 0xd90137b1, 0x4ad7cb88, 0x7d602748, 0xeeb6db71, 0x8c7e52e0, 0x1fa8aed9, 0x20a5fcef, 0xb37300d6, 0xd1bb8947, 0x426d757e, 0x4876f8ba, 0xdba00483, 0xb9688d12, 0x2abe712b, 0x15b3231d, 0x8665df24, 0xe4ad56b5, 0x777baa8c, +0x40cc464c, 0xd31aba75, 0xb1d233e4, 0x2204cfdd, 0x1d099deb, 0x8edf61d2, 0xec17e843, 0x7fc1147a, 0x00000000, 0x2b0f5832, 0x42942a0c, 0x699b723e, 0xde31e3d6, 0xf53ebbe4, 0x9ca5c9da, 0xb7aa91e8, 0x6f4a0ed8, 0x444556ea, 0x2dde24d4, 0x06d17ce6, +0xb17bed0e, 0x9a74b53c, 0xf3efc702, 0xd8e09f30, 0x8390aa18, 0xa89ff22a, 0xc1048014, 0xea0bd826, 0x5da149ce, 0x76ae11fc, 0x1f3563c2, 0x343a3bf0, 0xecdaa4c0, 0xc7d5fcf2, 0xae4e8ecc, 0x8541d6fe, 0x32eb4716, 0x19e41f24, 0x707f6d1a, 0x5b703528, +0x3dad10de, 0x16a248ec, 0x7f393ad2, 0x543662e0, 0xe39cf308, 0xc893ab3a, 0xa108d904, 0x8a078136, 0x52e71e06, 0x79e84634, 0x1073340a, 0x3b7c6c38, 0x8cd6fdd0, 0xa7d9a5e2, 0xce42d7dc, 0xe54d8fee, 0xbe3dbac6, 0x9532e2f4, 0xfca990ca, 0xd7a6c8f8, +0x600c5910, 0x4b030122, 0x2298731c, 0x09972b2e, 0xd177b41e, 0xfa78ec2c, 0x93e39e12, 0xb8ecc620, 0x0f4657c8, 0x24490ffa, 0x4dd27dc4, 0x66dd25f6, 0x7375878b, 0x587adfb9, 0x31e1ad87, 0x1aeef5b5, 0xad44645d, 0x864b3c6f, 0xefd04e51, 0xc4df1663, +0x1c3f8953, 0x3730d161, 0x5eaba35f, 0x75a4fb6d, 0xc20e6a85, 0xe90132b7, 0x809a4089, 0xab9518bb, 0xf0e52d93, 0xdbea75a1, 0xb271079f, 0x997e5fad, 0x2ed4ce45, 0x05db9677, 0x6c40e449, 0x474fbc7b, 0x9faf234b, 0xb4a07b79, 0xdd3b0947, 0xf6345175, +0x419ec09d, 0x6a9198af, 0x030aea91, 0x2805b2a3, 0x4ed89755, 0x65d7cf67, 0x0c4cbd59, 0x2743e56b, 0x90e97483, 0xbbe62cb1, 0xd27d5e8f, 0xf97206bd, 0x2192998d, 0x0a9dc1bf, 0x6306b381, 0x4809ebb3, 0xffa37a5b, 0xd4ac2269, 0xbd375057, 0x96380865, +0xcd483d4d, 0xe647657f, 0x8fdc1741, 0xa4d34f73, 0x1379de9b, 0x387686a9, 0x51edf497, 0x7ae2aca5, 0xa2023395, 0x890d6ba7, 0xe0961999, 0xcb9941ab, 0x7c33d043, 0x573c8871, 0x3ea7fa4f, 0x15a8a27d, 0x7f30fe4d, 0x543fa67f, 0x3da4d441, 0x16ab8c73, +0xa1011d9b, 0x8a0e45a9, 0xe3953797, 0xc89a6fa5, 0x107af095, 0x3b75a8a7, 0x52eeda99, 0x79e182ab, 0xce4b1343, 0xe5444b71, 0x8cdf394f, 0xa7d0617d, 0xfca05455, 0xd7af0c67, 0xbe347e59, 0x953b266b, 0x2291b783, 0x099eefb1, 0x60059d8f, 0x4b0ac5bd, +0x93ea5a8d, 0xb8e502bf, 0xd17e7081, 0xfa7128b3, 0x4ddbb95b, 0x66d4e169, 0x0f4f9357, 0x2440cb65, 0x429dee93, 0x6992b6a1, 0x0009c49f, 0x2b069cad, 0x9cac0d45, 0xb7a35577, 0xde382749, 0xf5377f7b, 0x2dd7e04b, 0x06d8b879, 0x6f43ca47, 0x444c9275, +0xf3e6039d, 0xd8e95baf, 0xb1722991, 0x9a7d71a3, 0xc10d448b, 0xea021cb9, 0x83996e87, 0xa89636b5, 0x1f3ca75d, 0x3433ff6f, 0x5da88d51, 0x76a7d563, 0xae474a53, 0x85481261, 0xecd3605f, 0xc7dc386d, 0x7076a985, 0x5b79f1b7, 0x32e28389, 0x19eddbbb, +0x0c4579c6, 0x274a21f4, 0x4ed153ca, 0x65de0bf8, 0xd2749a10, 0xf97bc222, 0x90e0b01c, 0xbbefe82e, 0x630f771e, 0x48002f2c, 0x219b5d12, 0x0a940520, 0xbd3e94c8, 0x9631ccfa, 0xffaabec4, 0xd4a5e6f6, 0x8fd5d3de, 0xa4da8bec, 0xcd41f9d2, 0xe64ea1e0, +0x51e43008, 0x7aeb683a, 0x13701a04, 0x387f4236, 0xe09fdd06, 0xcb908534, 0xa20bf70a, 0x8904af38, 0x3eae3ed0, 0x15a166e2, 0x7c3a14dc, 0x57354cee, 0x31e86918, 0x1ae7312a, 0x737c4314, 0x58731b26, 0xefd98ace, 0xc4d6d2fc, 0xad4da0c2, 0x8642f8f0, +0x5ea267c0, 0x75ad3ff2, 0x1c364dcc, 0x373915fe, 0x80938416, 0xab9cdc24, 0xc207ae1a, 0xe908f628, 0xb278c300, 0x99779b32, 0xf0ece90c, 0xdbe3b13e, 0x6c4920d6, 0x474678e4, 0x2edd0ada, 0x05d252e8, 0xdd32cdd8, 0xf63d95ea, 0x9fa6e7d4, 0xb4a9bfe6, +0x03032e0e, 0x280c763c, 0x41970402, 0x6a985c30, 0x00000000, 0x6bc6b785, 0x02e4dcd9, 0x69226b5c, 0xb580d8c6, 0xde466f43, 0xb764041f, 0xdca2b39a, 0x840ce6e0, 0xefca5165, 0x86e83a39, 0xed2e8dbc, 0x318c3e26, 0x5a4a89a3, 0x3368e2ff, 0x58ae557a, +0x9ff07281, 0xf436c504, 0x9d14ae58, 0xf6d219dd, 0x2a70aa47, 0x41b61dc2, 0x2894769e, 0x4352c11b, 0x1bfc9461, 0x703a23e4, 0x191848b8, 0x72deff3d, 0xae7c4ca7, 0xc5bafb22, 0xac98907e, 0xc75e27fb, 0x879a3cd5, 0xec5c8b50, 0x857ee00c, 0xeeb85789, +0x321ae413, 0x59dc5396, 0x30fe38ca, 0x5b388f4f, 0x0396da35, 0x68506db0, 0x017206ec, 0x6ab4b169, 0xb61602f3, 0xddd0b576, 0xb4f2de2a, 0xdf3469af, 0x186a4e54, 0x73acf9d1, 0x1a8e928d, 0x71482508, 0xadea9692, 0xc62c2117, 0xaf0e4a4b, 0xc4c8fdce, +0x9c66a8b4, 0xf7a01f31, 0x9e82746d, 0xf544c3e8, 0x29e67072, 0x4220c7f7, 0x2b02acab, 0x40c41b2e, 0xcadf0c76, 0xa119bbf3, 0xc83bd0af, 0xa3fd672a, 0x7f5fd4b0, 0x14996335, 0x7dbb0869, 0x167dbfec, 0x4ed3ea96, 0x25155d13, 0x4c37364f, 0x27f181ca, +0xfb533250, 0x909585d5, 0xf9b7ee89, 0x9271590c, 0x552f7ef7, 0x3ee9c972, 0x57cba22e, 0x3c0d15ab, 0xe0afa631, 0x8b6911b4, 0xe24b7ae8, 0x898dcd6d, 0xd1239817, 0xbae52f92, 0xd3c744ce, 0xb801f34b, 0x64a340d1, 0x0f65f754, 0x66479c08, 0x0d812b8d, +0x4d4530a3, 0x26838726, 0x4fa1ec7a, 0x24675bff, 0xf8c5e865, 0x93035fe0, 0xfa2134bc, 0x91e78339, 0xc949d643, 0xa28f61c6, 0xcbad0a9a, 0xa06bbd1f, 0x7cc90e85, 0x170fb900, 0x7e2dd25c, 0x15eb65d9, 0xd2b54222, 0xb973f5a7, 0xd0519efb, 0xbb97297e, +0x67359ae4, 0x0cf32d61, 0x65d1463d, 0x0e17f1b8, 0x56b9a4c2, 0x3d7f1347, 0x545d781b, 0x3f9bcf9e, 0xe3397c04, 0x88ffcb81, 0xe1dda0dd, 0x8a1b1758, 0x235e9a49, 0x48982dcc, 0x21ba4690, 0x4a7cf115, 0x96de428f, 0xfd18f50a, 0x943a9e56, 0xfffc29d3, +0xa7527ca9, 0xcc94cb2c, 0xa5b6a070, 0xce7017f5, 0x12d2a46f, 0x791413ea, 0x103678b6, 0x7bf0cf33, 0xbcaee8c8, 0xd7685f4d, 0xbe4a3411, 0xd58c8394, 0x092e300e, 0x62e8878b, 0x0bcaecd7, 0x600c5b52, 0x38a20e28, 0x5364b9ad, 0x3a46d2f1, 0x51806574, +0x8d22d6ee, 0xe6e4616b, 0x8fc60a37, 0xe400bdb2, 0xa4c4a69c, 0xcf021119, 0xa6207a45, 0xcde6cdc0, 0x11447e5a, 0x7a82c9df, 0x13a0a283, 0x78661506, 0x20c8407c, 0x4b0ef7f9, 0x222c9ca5, 0x49ea2b20, 0x954898ba, 0xfe8e2f3f, 0x97ac4463, 0xfc6af3e6, +0x3b34d41d, 0x50f26398, 0x39d008c4, 0x5216bf41, 0x8eb40cdb, 0xe572bb5e, 0x8c50d002, 0xe7966787, 0xbf3832fd, 0xd4fe8578, 0xbddcee24, 0xd61a59a1, 0x0ab8ea3b, 0x617e5dbe, 0x085c36e2, 0x639a8167, 0xe981963f, 0x824721ba, 0xeb654ae6, 0x80a3fd63, +0x5c014ef9, 0x37c7f97c, 0x5ee59220, 0x352325a5, 0x6d8d70df, 0x064bc75a, 0x6f69ac06, 0x04af1b83, 0xd80da819, 0xb3cb1f9c, 0xdae974c0, 0xb12fc345, 0x7671e4be, 0x1db7533b, 0x74953867, 0x1f538fe2, 0xc3f13c78, 0xa8378bfd, 0xc115e0a1, 0xaad35724, +0xf27d025e, 0x99bbb5db, 0xf099de87, 0x9b5f6902, 0x47fdda98, 0x2c3b6d1d, 0x45190641, 0x2edfb1c4, 0x6e1baaea, 0x05dd1d6f, 0x6cff7633, 0x0739c1b6, 0xdb9b722c, 0xb05dc5a9, 0xd97faef5, 0xb2b91970, 0xea174c0a, 0x81d1fb8f, 0xe8f390d3, 0x83352756, +0x5f9794cc, 0x34512349, 0x5d734815, 0x36b5ff90, 0xf1ebd86b, 0x9a2d6fee, 0xf30f04b2, 0x98c9b337, 0x446b00ad, 0x2fadb728, 0x468fdc74, 0x2d496bf1, 0x75e73e8b, 0x1e21890e, 0x7703e252, 0x1cc555d7, 0xc067e64d, 0xaba151c8, 0xc2833a94, 0xa9458d11, +0x00000000, 0x62486f82, 0x554c4e84, 0x37042106, 0x7273e4b6, 0x103b8b34, 0x273faa32, 0x4577c5b0, 0x3dbb06a7, 0x5ff36925, 0x68f74823, 0x0abf27a1, 0x4fc8e211, 0x2d808d93, 0x1a84ac95, 0x78ccc317, 0xabd24a4c, 0xc99a25ce, 0xfe9e04c8, 0x9cd66b4a, +0xd9a1aefa, 0xbbe9c178, 0x8cede07e, 0xeea58ffc, 0x96694ceb, 0xf4212369, 0xc325026f, 0xa16d6ded, 0xe41aa85d, 0x8652c7df, 0xb156e6d9, 0xd31e895b, 0xd6cef122, 0xb4869ea0, 0x8382bfa6, 0xe1cad024, 0xa4bd1594, 0xc6f57a16, 0xf1f15b10, 0x93b93492, +0xeb75f785, 0x893d9807, 0xbe39b901, 0xdc71d683, 0x99061333, 0xfb4e7cb1, 0xcc4a5db7, 0xae023235, 0x7d1cbb6e, 0x1f54d4ec, 0x2850f5ea, 0x4a189a68, 0x0f6f5fd8, 0x6d27305a, 0x5a23115c, 0x386b7ede, 0x40a7bdc9, 0x22efd24b, 0x15ebf34d, 0x77a39ccf, +0x32d4597f, 0x509c36fd, 0x679817fb, 0x05d07879, 0x6c9c82ce, 0x0ed4ed4c, 0x39d0cc4a, 0x5b98a3c8, 0x1eef6678, 0x7ca709fa, 0x4ba328fc, 0x29eb477e, 0x51278469, 0x336febeb, 0x046bcaed, 0x6623a56f, 0x235460df, 0x411c0f5d, 0x76182e5b, 0x145041d9, +0xc74ec882, 0xa506a700, 0x92028606, 0xf04ae984, 0xb53d2c34, 0xd77543b6, 0xe07162b0, 0x82390d32, 0xfaf5ce25, 0x98bda1a7, 0xafb980a1, 0xcdf1ef23, 0x88862a93, 0xeace4511, 0xddca6417, 0xbf820b95, 0xba5273ec, 0xd81a1c6e, 0xef1e3d68, 0x8d5652ea, +0xc821975a, 0xaa69f8d8, 0x9d6dd9de, 0xff25b65c, 0x87e9754b, 0xe5a11ac9, 0xd2a53bcf, 0xb0ed544d, 0xf59a91fd, 0x97d2fe7f, 0xa0d6df79, 0xc29eb0fb, 0x118039a0, 0x73c85622, 0x44cc7724, 0x268418a6, 0x63f3dd16, 0x01bbb294, 0x36bf9392, 0x54f7fc10, +0x2c3b3f07, 0x4e735085, 0x79777183, 0x1b3f1e01, 0x5e48dbb1, 0x3c00b433, 0x0b049535, 0x694cfab7, 0xa1ad3e14, 0xc3e55196, 0xf4e17090, 0x96a91f12, 0xd3dedaa2, 0xb196b520, 0x86929426, 0xe4dafba4, 0x9c1638b3, 0xfe5e5731, 0xc95a7637, 0xab1219b5, +0xee65dc05, 0x8c2db387, 0xbb299281, 0xd961fd03, 0x0a7f7458, 0x68371bda, 0x5f333adc, 0x3d7b555e, 0x780c90ee, 0x1a44ff6c, 0x2d40de6a, 0x4f08b1e8, 0x37c472ff, 0x558c1d7d, 0x62883c7b, 0x00c053f9, 0x45b79649, 0x27fff9cb, 0x10fbd8cd, 0x72b3b74f, +0x7763cf36, 0x152ba0b4, 0x222f81b2, 0x4067ee30, 0x05102b80, 0x67584402, 0x505c6504, 0x32140a86, 0x4ad8c991, 0x2890a613, 0x1f948715, 0x7ddce897, 0x38ab2d27, 0x5ae342a5, 0x6de763a3, 0x0faf0c21, 0xdcb1857a, 0xbef9eaf8, 0x89fdcbfe, 0xebb5a47c, +0xaec261cc, 0xcc8a0e4e, 0xfb8e2f48, 0x99c640ca, 0xe10a83dd, 0x8342ec5f, 0xb446cd59, 0xd60ea2db, 0x9379676b, 0xf13108e9, 0xc63529ef, 0xa47d466d, 0xcd31bcda, 0xaf79d358, 0x987df25e, 0xfa359ddc, 0xbf42586c, 0xdd0a37ee, 0xea0e16e8, 0x8846796a, +0xf08aba7d, 0x92c2d5ff, 0xa5c6f4f9, 0xc78e9b7b, 0x82f95ecb, 0xe0b13149, 0xd7b5104f, 0xb5fd7fcd, 0x66e3f696, 0x04ab9914, 0x33afb812, 0x51e7d790, 0x14901220, 0x76d87da2, 0x41dc5ca4, 0x23943326, 0x5b58f031, 0x39109fb3, 0x0e14beb5, 0x6c5cd137, +0x292b1487, 0x4b637b05, 0x7c675a03, 0x1e2f3581, 0x1bff4df8, 0x79b7227a, 0x4eb3037c, 0x2cfb6cfe, 0x698ca94e, 0x0bc4c6cc, 0x3cc0e7ca, 0x5e888848, 0x26444b5f, 0x440c24dd, 0x730805db, 0x11406a59, 0x5437afe9, 0x367fc06b, 0x017be16d, 0x63338eef, +0xb02d07b4, 0xd2656836, 0xe5614930, 0x872926b2, 0xc25ee302, 0xa0168c80, 0x9712ad86, 0xf55ac204, 0x8d960113, 0xefde6e91, 0xd8da4f97, 0xba922015, 0xffe5e5a5, 0x9dad8a27, 0xaaa9ab21, 0xc8e1c4a3, 0x00000000, 0x6d1a0fbd, 0x916e857b, 0xfc748ac6, +0x8681e1ec, 0xeb9bee51, 0x17ef6497, 0x7af56b2a, 0x15caaecb, 0x78d0a176, 0x84a42bb0, 0xe9be240d, 0x934b4f27, 0xfe51409a, 0x0225ca5c, 0x6f3fc5e1, 0x0d7018fa, 0x606a1747, 0x9c1e9d81, 0xf104923c, 0x8bf1f916, 0xe6ebf6ab, 0x1a9f7c6d, 0x778573d0, +0x18bab631, 0x75a0b98c, 0x89d4334a, 0xe4ce3cf7, 0x9e3b57dd, 0xf3215860, 0x0f55d2a6, 0x624fdd1b, 0x8a165d18, 0xe70c52a5, 0x1b78d863, 0x7662d7de, 0x0c97bcf4, 0x618db349, 0x9df9398f, 0xf0e33632, 0x9fdcf3d3, 0xf2c6fc6e, 0x0eb276a8, 0x63a87915, +0x195d123f, 0x74471d82, 0x88339744, 0xe52998f9, 0x876645e2, 0xea7c4a5f, 0x1608c099, 0x7b12cf24, 0x01e7a40e, 0x6cfdabb3, 0x90892175, 0xfd932ec8, 0x92aceb29, 0xffb6e494, 0x03c26e52, 0x6ed861ef, 0x142d0ac5, 0x79370578, 0x85438fbe, 0xe8598003, +0x70610909, 0x1d7b06b4, 0xe10f8c72, 0x8c1583cf, 0xf6e0e8e5, 0x9bfae758, 0x678e6d9e, 0x0a946223, 0x65aba7c2, 0x08b1a87f, 0xf4c522b9, 0x99df2d04, 0xe32a462e, 0x8e304993, 0x7244c355, 0x1f5ecce8, 0x7d1111f3, 0x100b1e4e, 0xec7f9488, 0x81659b35, +0xfb90f01f, 0x968affa2, 0x6afe7564, 0x07e47ad9, 0x68dbbf38, 0x05c1b085, 0xf9b53a43, 0x94af35fe, 0xee5a5ed4, 0x83405169, 0x7f34dbaf, 0x122ed412, 0xfa775411, 0x976d5bac, 0x6b19d16a, 0x0603ded7, 0x7cf6b5fd, 0x11ecba40, 0xed983086, 0x80823f3b, +0xefbdfada, 0x82a7f567, 0x7ed37fa1, 0x13c9701c, 0x693c1b36, 0x0426148b, 0xf8529e4d, 0x954891f0, 0xf7074ceb, 0x9a1d4356, 0x6669c990, 0x0b73c62d, 0x7186ad07, 0x1c9ca2ba, 0xe0e8287c, 0x8df227c1, 0xe2cde220, 0x8fd7ed9d, 0x73a3675b, 0x1eb968e6, +0x644c03cc, 0x09560c71, 0xf52286b7, 0x9838890a, 0xefaa2a10, 0x82b025ad, 0x7ec4af6b, 0x13dea0d6, 0x692bcbfc, 0x0431c441, 0xf8454e87, 0x955f413a, 0xfa6084db, 0x977a8b66, 0x6b0e01a0, 0x06140e1d, 0x7ce16537, 0x11fb6a8a, 0xed8fe04c, 0x8095eff1, +0xe2da32ea, 0x8fc03d57, 0x73b4b791, 0x1eaeb82c, 0x645bd306, 0x0941dcbb, 0xf535567d, 0x982f59c0, 0xf7109c21, 0x9a0a939c, 0x667e195a, 0x0b6416e7, 0x71917dcd, 0x1c8b7270, 0xe0fff8b6, 0x8de5f70b, 0x65bc7708, 0x08a678b5, 0xf4d2f273, 0x99c8fdce, +0xe33d96e4, 0x8e279959, 0x7253139f, 0x1f491c22, 0x7076d9c3, 0x1d6cd67e, 0xe1185cb8, 0x8c025305, 0xf6f7382f, 0x9bed3792, 0x6799bd54, 0x0a83b2e9, 0x68cc6ff2, 0x05d6604f, 0xf9a2ea89, 0x94b8e534, 0xee4d8e1e, 0x835781a3, 0x7f230b65, 0x123904d8, +0x7d06c139, 0x101cce84, 0xec684442, 0x81724bff, 0xfb8720d5, 0x969d2f68, 0x6ae9a5ae, 0x07f3aa13, 0x9fcb2319, 0xf2d12ca4, 0x0ea5a662, 0x63bfa9df, 0x194ac2f5, 0x7450cd48, 0x8824478e, 0xe53e4833, 0x8a018dd2, 0xe71b826f, 0x1b6f08a9, 0x76750714, +0x0c806c3e, 0x619a6383, 0x9deee945, 0xf0f4e6f8, 0x92bb3be3, 0xffa1345e, 0x03d5be98, 0x6ecfb125, 0x143ada0f, 0x7920d5b2, 0x85545f74, 0xe84e50c9, 0x87719528, 0xea6b9a95, 0x161f1053, 0x7b051fee, 0x01f074c4, 0x6cea7b79, 0x909ef1bf, 0xfd84fe02, +0x15dd7e01, 0x78c771bc, 0x84b3fb7a, 0xe9a9f4c7, 0x935c9fed, 0xfe469050, 0x02321a96, 0x6f28152b, 0x0017d0ca, 0x6d0ddf77, 0x917955b1, 0xfc635a0c, 0x86963126, 0xeb8c3e9b, 0x17f8b45d, 0x7ae2bbe0, 0x18ad66fb, 0x75b76946, 0x89c3e380, 0xe4d9ec3d, +0x9e2c8717, 0xf33688aa, 0x0f42026c, 0x62580dd1, 0x0d67c830, 0x607dc78d, 0x9c094d4b, 0xf11342f6, 0x8be629dc, 0xe6fc2661, 0x1a88aca7, 0x7792a31a, 0x00000000, 0xdbe18f07, 0x62f9b34f, 0xb9183c48, 0xa80415d7, 0x73e59ad0, 0xcafda698, 0x111c299f, +0xbc2a6ae5, 0x67cbe5e2, 0xded3d9aa, 0x053256ad, 0x142e7f32, 0xcfcff035, 0x76d7cc7d, 0xad36437a, 0xc5762398, 0x1e97ac9f, 0xa78f90d7, 0x7c6e1fd0, 0x6d72364f, 0xb693b948, 0x0f8b8500, 0xd46a0a07, 0x795c497d, 0xa2bdc67a, 0x1ba5fa32, 0xc0447535, +0xd1585caa, 0x0ab9d3ad, 0xb3a1efe5, 0x684060e2, 0x002a8be4, 0xdbcb04e3, 0x62d338ab, 0xb932b7ac, 0xa82e9e33, 0x73cf1134, 0xcad72d7c, 0x1136a27b, 0xbc00e101, 0x67e16e06, 0xdef9524e, 0x0518dd49, 0x1404f4d6, 0xcfe57bd1, 0x76fd4799, 0xad1cc89e, +0xc55ca87c, 0x1ebd277b, 0xa7a51b33, 0x7c449434, 0x6d58bdab, 0xb6b932ac, 0x0fa10ee4, 0xd44081e3, 0x7976c299, 0xa2974d9e, 0x1b8f71d6, 0xc06efed1, 0xd172d74e, 0x0a935849, 0xb38b6401, 0x686aeb06, 0xe36ec724, 0x388f4823, 0x8197746b, 0x5a76fb6c, +0x4b6ad2f3, 0x908b5df4, 0x299361bc, 0xf272eebb, 0x5f44adc1, 0x84a522c6, 0x3dbd1e8e, 0xe65c9189, 0xf740b816, 0x2ca13711, 0x95b90b59, 0x4e58845e, 0x2618e4bc, 0xfdf96bbb, 0x44e157f3, 0x9f00d8f4, 0x8e1cf16b, 0x55fd7e6c, 0xece54224, 0x3704cd23, +0x9a328e59, 0x41d3015e, 0xf8cb3d16, 0x232ab211, 0x32369b8e, 0xe9d71489, 0x50cf28c1, 0x8b2ea7c6, 0xe3444cc0, 0x38a5c3c7, 0x81bdff8f, 0x5a5c7088, 0x4b405917, 0x90a1d610, 0x29b9ea58, 0xf258655f, 0x5f6e2625, 0x848fa922, 0x3d97956a, 0xe6761a6d, +0xf76a33f2, 0x2c8bbcf5, 0x959380bd, 0x4e720fba, 0x26326f58, 0xfdd3e05f, 0x44cbdc17, 0x9f2a5310, 0x8e367a8f, 0x55d7f588, 0xeccfc9c0, 0x372e46c7, 0x9a1805bd, 0x41f98aba, 0xf8e1b6f2, 0x230039f5, 0x321c106a, 0xe9fd9f6d, 0x50e5a325, 0x8b042c22, +0x9a7495da, 0x41951add, 0xf88d2695, 0x236ca992, 0x3270800d, 0xe9910f0a, 0x50893342, 0x8b68bc45, 0x265eff3f, 0xfdbf7038, 0x44a74c70, 0x9f46c377, 0x8e5aeae8, 0x55bb65ef, 0xeca359a7, 0x3742d6a0, 0x5f02b642, 0x84e33945, 0x3dfb050d, 0xe61a8a0a, +0xf706a395, 0x2ce72c92, 0x95ff10da, 0x4e1e9fdd, 0xe328dca7, 0x38c953a0, 0x81d16fe8, 0x5a30e0ef, 0x4b2cc970, 0x90cd4677, 0x29d57a3f, 0xf234f538, 0x9a5e1e3e, 0x41bf9139, 0xf8a7ad71, 0x23462276, 0x325a0be9, 0xe9bb84ee, 0x50a3b8a6, 0x8b4237a1, +0x267474db, 0xfd95fbdc, 0x448dc794, 0x9f6c4893, 0x8e70610c, 0x5591ee0b, 0xec89d243, 0x37685d44, 0x5f283da6, 0x84c9b2a1, 0x3dd18ee9, 0xe63001ee, 0xf72c2871, 0x2ccda776, 0x95d59b3e, 0x4e341439, 0xe3025743, 0x38e3d844, 0x81fbe40c, 0x5a1a6b0b, +0x4b064294, 0x90e7cd93, 0x29fff1db, 0xf21e7edc, 0x791a52fe, 0xa2fbddf9, 0x1be3e1b1, 0xc0026eb6, 0xd11e4729, 0x0affc82e, 0xb3e7f466, 0x68067b61, 0xc530381b, 0x1ed1b71c, 0xa7c98b54, 0x7c280453, 0x6d342dcc, 0xb6d5a2cb, 0x0fcd9e83, 0xd42c1184, +0xbc6c7166, 0x678dfe61, 0xde95c229, 0x05744d2e, 0x146864b1, 0xcf89ebb6, 0x7691d7fe, 0xad7058f9, 0x00461b83, 0xdba79484, 0x62bfa8cc, 0xb95e27cb, 0xa8420e54, 0x73a38153, 0xcabbbd1b, 0x115a321c, 0x7930d91a, 0xa2d1561d, 0x1bc96a55, 0xc028e552, +0xd134cccd, 0x0ad543ca, 0xb3cd7f82, 0x682cf085, 0xc51ab3ff, 0x1efb3cf8, 0xa7e300b0, 0x7c028fb7, 0x6d1ea628, 0xb6ff292f, 0x0fe71567, 0xd4069a60, 0xbc46fa82, 0x67a77585, 0xdebf49cd, 0x055ec6ca, 0x1442ef55, 0xcfa36052, 0x76bb5c1a, 0xad5ad31d, +0x006c9067, 0xdb8d1f60, 0x62952328, 0xb974ac2f, 0xa86885b0, 0x73890ab7, 0xca9136ff, 0x1170b9f8, 0x00000000, 0x8488e0c1, 0xef7635ab, 0x6bfed56a, 0x30a39440, 0xb42b7481, 0xdfd5a1eb, 0x5b5d412a, 0xe74628ba, 0x63cec87b, 0x08301d11, 0x8cb8fdd0, +0xd7e5bcfa, 0x536d5c3b, 0x38938951, 0xbc1b6990, 0x6efab594, 0xea725555, 0x818c803f, 0x050460fe, 0x5e5921d4, 0xdad1c115, 0xb12f147f, 0x35a7f4be, 0x89bc9d2e, 0x0d347def, 0x66caa885, 0xe2424844, 0xb91f096e, 0x3d97e9af, 0x56693cc5, 0xd2e1dc04, +0x73e284c6, 0xf76a6407, 0x9c94b16d, 0x181c51ac, 0x43411086, 0xc7c9f047, 0xac37252d, 0x28bfc5ec, 0x94a4ac7c, 0x102c4cbd, 0x7bd299d7, 0xff5a7916, 0xa407383c, 0x208fd8fd, 0x4b710d97, 0xcff9ed56, 0x1d183152, 0x9990d193, 0xf26e04f9, 0x76e6e438, +0x2dbba512, 0xa93345d3, 0xc2cd90b9, 0x46457078, 0xfa5e19e8, 0x7ed6f929, 0x15282c43, 0x91a0cc82, 0xcafd8da8, 0x4e756d69, 0x258bb803, 0xa10358c2, 0xbdbc4f86, 0x3934af47, 0x52ca7a2d, 0xd6429aec, 0x8d1fdbc6, 0x09973b07, 0x6269ee6d, 0xe6e10eac, +0x5afa673c, 0xde7287fd, 0xb58c5297, 0x3104b256, 0x6a59f37c, 0xeed113bd, 0x852fc6d7, 0x01a72616, 0xd346fa12, 0x57ce1ad3, 0x3c30cfb9, 0xb8b82f78, 0xe3e56e52, 0x676d8e93, 0x0c935bf9, 0x881bbb38, 0x3400d2a8, 0xb0883269, 0xdb76e703, 0x5ffe07c2, +0x04a346e8, 0x802ba629, 0xebd57343, 0x6f5d9382, 0xce5ecb40, 0x4ad62b81, 0x2128feeb, 0xa5a01e2a, 0xfefd5f00, 0x7a75bfc1, 0x118b6aab, 0x95038a6a, 0x2918e3fa, 0xad90033b, 0xc66ed651, 0x42e63690, 0x19bb77ba, 0x9d33977b, 0xf6cd4211, 0x7245a2d0, +0xa0a47ed4, 0x242c9e15, 0x4fd24b7f, 0xcb5aabbe, 0x9007ea94, 0x148f0a55, 0x7f71df3f, 0xfbf93ffe, 0x47e2566e, 0xc36ab6af, 0xa89463c5, 0x2c1c8304, 0x7741c22e, 0xf3c922ef, 0x9837f785, 0x1cbf1744, 0xe1e1906e, 0x656970af, 0x0e97a5c5, 0x8a1f4504, +0xd142042e, 0x55cae4ef, 0x3e343185, 0xbabcd144, 0x06a7b8d4, 0x822f5815, 0xe9d18d7f, 0x6d596dbe, 0x36042c94, 0xb28ccc55, 0xd972193f, 0x5dfaf9fe, 0x8f1b25fa, 0x0b93c53b, 0x606d1051, 0xe4e5f090, 0xbfb8b1ba, 0x3b30517b, 0x50ce8411, 0xd44664d0, +0x685d0d40, 0xecd5ed81, 0x872b38eb, 0x03a3d82a, 0x58fe9900, 0xdc7679c1, 0xb788acab, 0x33004c6a, 0x920314a8, 0x168bf469, 0x7d752103, 0xf9fdc1c2, 0xa2a080e8, 0x26286029, 0x4dd6b543, 0xc95e5582, 0x75453c12, 0xf1cddcd3, 0x9a3309b9, 0x1ebbe978, +0x45e6a852, 0xc16e4893, 0xaa909df9, 0x2e187d38, 0xfcf9a13c, 0x787141fd, 0x138f9497, 0x97077456, 0xcc5a357c, 0x48d2d5bd, 0x232c00d7, 0xa7a4e016, 0x1bbf8986, 0x9f376947, 0xf4c9bc2d, 0x70415cec, 0x2b1c1dc6, 0xaf94fd07, 0xc46a286d, 0x40e2c8ac, +0x5c5ddfe8, 0xd8d53f29, 0xb32bea43, 0x37a30a82, 0x6cfe4ba8, 0xe876ab69, 0x83887e03, 0x07009ec2, 0xbb1bf752, 0x3f931793, 0x546dc2f9, 0xd0e52238, 0x8bb86312, 0x0f3083d3, 0x64ce56b9, 0xe046b678, 0x32a76a7c, 0xb62f8abd, 0xddd15fd7, 0x5959bf16, +0x0204fe3c, 0x868c1efd, 0xed72cb97, 0x69fa2b56, 0xd5e142c6, 0x5169a207, 0x3a97776d, 0xbe1f97ac, 0xe542d686, 0x61ca3647, 0x0a34e32d, 0x8ebc03ec, 0x2fbf5b2e, 0xab37bbef, 0xc0c96e85, 0x44418e44, 0x1f1ccf6e, 0x9b942faf, 0xf06afac5, 0x74e21a04, +0xc8f97394, 0x4c719355, 0x278f463f, 0xa307a6fe, 0xf85ae7d4, 0x7cd20715, 0x172cd27f, 0x93a432be, 0x4145eeba, 0xc5cd0e7b, 0xae33db11, 0x2abb3bd0, 0x71e67afa, 0xf56e9a3b, 0x9e904f51, 0x1a18af90, 0xa603c600, 0x228b26c1, 0x4975f3ab, 0xcdfd136a, +0x96a05240, 0x1228b281, 0x79d667eb, 0xfd5e872a, 0x00000000, 0x7a9286ab, 0x727fa5b6, 0x08ed231d, 0x850ea681, 0xff9c202a, 0xf7710337, 0x8de3859c, 0x50bd6775, 0x2a2fe1de, 0x22c2c2c3, 0x58504468, 0xd5b3c1f4, 0xaf21475f, 0xa7cc6442, 0xdd5ee2e9, +0xb29b6fe7, 0xc809e94c, 0xc0e4ca51, 0xba764cfa, 0x3795c966, 0x4d074fcd, 0x45ea6cd0, 0x3f78ea7b, 0xe2260892, 0x98b48e39, 0x9059ad24, 0xeacb2b8f, 0x6728ae13, 0x1dba28b8, 0x15570ba5, 0x6fc58d0e, 0xb58644d9, 0xcf14c272, 0xc7f9e16f, 0xbd6b67c4, +0x3088e258, 0x4a1a64f3, 0x42f747ee, 0x3865c145, 0xe53b23ac, 0x9fa9a507, 0x9744861a, 0xedd600b1, 0x6035852d, 0x1aa70386, 0x124a209b, 0x68d8a630, 0x071d2b3e, 0x7d8fad95, 0x75628e88, 0x0ff00823, 0x82138dbf, 0xf8810b14, 0xf06c2809, 0x8afeaea2, +0x57a04c4b, 0x2d32cae0, 0x25dfe9fd, 0x5f4d6f56, 0xd2aeeaca, 0xa83c6c61, 0xa0d14f7c, 0xda43c9d7, 0xaa2bf7fd, 0xd0b97156, 0xd854524b, 0xa2c6d4e0, 0x2f25517c, 0x55b7d7d7, 0x5d5af4ca, 0x27c87261, 0xfa969088, 0x80041623, 0x88e9353e, 0xf27bb395, +0x7f983609, 0x050ab0a2, 0x0de793bf, 0x77751514, 0x18b0981a, 0x62221eb1, 0x6acf3dac, 0x105dbb07, 0x9dbe3e9b, 0xe72cb830, 0xefc19b2d, 0x95531d86, 0x480dff6f, 0x329f79c4, 0x3a725ad9, 0x40e0dc72, 0xcd0359ee, 0xb791df45, 0xbf7cfc58, 0xc5ee7af3, +0x1fadb324, 0x653f358f, 0x6dd21692, 0x17409039, 0x9aa315a5, 0xe031930e, 0xe8dcb013, 0x924e36b8, 0x4f10d451, 0x358252fa, 0x3d6f71e7, 0x47fdf74c, 0xca1e72d0, 0xb08cf47b, 0xb861d766, 0xc2f351cd, 0xad36dcc3, 0xd7a45a68, 0xdf497975, 0xa5dbffde, +0x28387a42, 0x52aafce9, 0x5a47dff4, 0x20d5595f, 0xfd8bbbb6, 0x87193d1d, 0x8ff41e00, 0xf56698ab, 0x78851d37, 0x02179b9c, 0x0afab881, 0x70683e2a, 0xf13c4cd8, 0x8baeca73, 0x8343e96e, 0xf9d16fc5, 0x7432ea59, 0x0ea06cf2, 0x064d4fef, 0x7cdfc944, +0xa1812bad, 0xdb13ad06, 0xd3fe8e1b, 0xa96c08b0, 0x248f8d2c, 0x5e1d0b87, 0x56f0289a, 0x2c62ae31, 0x43a7233f, 0x3935a594, 0x31d88689, 0x4b4a0022, 0xc6a985be, 0xbc3b0315, 0xb4d62008, 0xce44a6a3, 0x131a444a, 0x6988c2e1, 0x6165e1fc, 0x1bf76757, +0x9614e2cb, 0xec866460, 0xe46b477d, 0x9ef9c1d6, 0x44ba0801, 0x3e288eaa, 0x36c5adb7, 0x4c572b1c, 0xc1b4ae80, 0xbb26282b, 0xb3cb0b36, 0xc9598d9d, 0x14076f74, 0x6e95e9df, 0x6678cac2, 0x1cea4c69, 0x9109c9f5, 0xeb9b4f5e, 0xe3766c43, 0x99e4eae8, +0xf62167e6, 0x8cb3e14d, 0x845ec250, 0xfecc44fb, 0x732fc167, 0x09bd47cc, 0x015064d1, 0x7bc2e27a, 0xa69c0093, 0xdc0e8638, 0xd4e3a525, 0xae71238e, 0x2392a612, 0x590020b9, 0x51ed03a4, 0x2b7f850f, 0x5b17bb25, 0x21853d8e, 0x29681e93, 0x53fa9838, +0xde191da4, 0xa48b9b0f, 0xac66b812, 0xd6f43eb9, 0x0baadc50, 0x71385afb, 0x79d579e6, 0x0347ff4d, 0x8ea47ad1, 0xf436fc7a, 0xfcdbdf67, 0x864959cc, 0xe98cd4c2, 0x931e5269, 0x9bf37174, 0xe161f7df, 0x6c827243, 0x1610f4e8, 0x1efdd7f5, 0x646f515e, +0xb931b3b7, 0xc3a3351c, 0xcb4e1601, 0xb1dc90aa, 0x3c3f1536, 0x46ad939d, 0x4e40b080, 0x34d2362b, 0xee91fffc, 0x94037957, 0x9cee5a4a, 0xe67cdce1, 0x6b9f597d, 0x110ddfd6, 0x19e0fccb, 0x63727a60, 0xbe2c9889, 0xc4be1e22, 0xcc533d3f, 0xb6c1bb94, +0x3b223e08, 0x41b0b8a3, 0x495d9bbe, 0x33cf1d15, 0x5c0a901b, 0x269816b0, 0x2e7535ad, 0x54e7b306, 0xd904369a, 0xa396b031, 0xab7b932c, 0xd1e91587, 0x0cb7f76e, 0x762571c5, 0x7ec852d8, 0x045ad473, 0x89b951ef, 0xf32bd744, 0xfbc6f459, 0x815472f2, +0x00000000, 0x87c045aa, 0xea2b2f6c, 0x6deb6ac6, 0xe177cf5f, 0x66b78af5, 0x0b5ce033, 0x8c9ca599, 0xba6c6ec6, 0x3dac2b6c, 0x504741aa, 0xd7870400, 0x5b1ba199, 0xdcdbe433, 0xb1308ef5, 0x36f0cb5f, 0x338aa779, 0xb44ae2d3, 0xd9a18815, 0x5e61cdbf, +0xd2fd6826, 0x553d2d8c, 0x38d6474a, 0xbf1602e0, 0x89e6c9bf, 0x0e268c15, 0x63cde6d3, 0xe40da379, 0x689106e0, 0xef51434a, 0x82ba298c, 0x057a6c26, 0x8b763de5, 0x0cb6784f, 0x615d1289, 0xe69d5723, 0x6a01f2ba, 0xedc1b710, 0x802addd6, 0x07ea987c, +0x311a5323, 0xb6da1689, 0xdb317c4f, 0x5cf139e5, 0xd06d9c7c, 0x57add9d6, 0x3a46b310, 0xbd86f6ba, 0xb8fc9a9c, 0x3f3cdf36, 0x52d7b5f0, 0xd517f05a, 0x598b55c3, 0xde4b1069, 0xb3a07aaf, 0x34603f05, 0x0290f45a, 0x8550b1f0, 0xe8bbdb36, 0x6f7b9e9c, +0xe3e73b05, 0x64277eaf, 0x09cc1469, 0x8e0c51c3, 0x9fe00d6c, 0x182048c6, 0x75cb2200, 0xf20b67aa, 0x7e97c233, 0xf9578799, 0x94bced5f, 0x137ca8f5, 0x258c63aa, 0xa24c2600, 0xcfa74cc6, 0x4867096c, 0xc4fbacf5, 0x433be95f, 0x2ed08399, 0xa910c633, +0xac6aaa15, 0x2baaefbf, 0x46418579, 0xc181c0d3, 0x4d1d654a, 0xcadd20e0, 0xa7364a26, 0x20f60f8c, 0x1606c4d3, 0x91c68179, 0xfc2debbf, 0x7bedae15, 0xf7710b8c, 0x70b14e26, 0x1d5a24e0, 0x9a9a614a, 0x14963089, 0x93567523, 0xfebd1fe5, 0x797d5a4f, +0xf5e1ffd6, 0x7221ba7c, 0x1fcad0ba, 0x980a9510, 0xaefa5e4f, 0x293a1be5, 0x44d17123, 0xc3113489, 0x4f8d9110, 0xc84dd4ba, 0xa5a6be7c, 0x2266fbd6, 0x271c97f0, 0xa0dcd25a, 0xcd37b89c, 0x4af7fd36, 0xc66b58af, 0x41ab1d05, 0x2c4077c3, 0xab803269, +0x9d70f936, 0x1ab0bc9c, 0x775bd65a, 0xf09b93f0, 0x7c073669, 0xfbc773c3, 0x962c1905, 0x11ec5caf, 0x468c8bc8, 0xc14cce62, 0xaca7a4a4, 0x2b67e10e, 0xa7fb4497, 0x203b013d, 0x4dd06bfb, 0xca102e51, 0xfce0e50e, 0x7b20a0a4, 0x16cbca62, 0x910b8fc8, +0x1d972a51, 0x9a576ffb, 0xf7bc053d, 0x707c4097, 0x75062cb1, 0xf2c6691b, 0x9f2d03dd, 0x18ed4677, 0x9471e3ee, 0x13b1a644, 0x7e5acc82, 0xf99a8928, 0xcf6a4277, 0x48aa07dd, 0x25416d1b, 0xa28128b1, 0x2e1d8d28, 0xa9ddc882, 0xc436a244, 0x43f6e7ee, +0xcdfab62d, 0x4a3af387, 0x27d19941, 0xa011dceb, 0x2c8d7972, 0xab4d3cd8, 0xc6a6561e, 0x416613b4, 0x7796d8eb, 0xf0569d41, 0x9dbdf787, 0x1a7db22d, 0x96e117b4, 0x1121521e, 0x7cca38d8, 0xfb0a7d72, 0xfe701154, 0x79b054fe, 0x145b3e38, 0x939b7b92, +0x1f07de0b, 0x98c79ba1, 0xf52cf167, 0x72ecb4cd, 0x441c7f92, 0xc3dc3a38, 0xae3750fe, 0x29f71554, 0xa56bb0cd, 0x22abf567, 0x4f409fa1, 0xc880da0b, 0xd96c86a4, 0x5eacc30e, 0x3347a9c8, 0xb487ec62, 0x381b49fb, 0xbfdb0c51, 0xd2306697, 0x55f0233d, +0x6300e862, 0xe4c0adc8, 0x892bc70e, 0x0eeb82a4, 0x8277273d, 0x05b76297, 0x685c0851, 0xef9c4dfb, 0xeae621dd, 0x6d266477, 0x00cd0eb1, 0x870d4b1b, 0x0b91ee82, 0x8c51ab28, 0xe1bac1ee, 0x667a8444, 0x508a4f1b, 0xd74a0ab1, 0xbaa16077, 0x3d6125dd, +0xb1fd8044, 0x363dc5ee, 0x5bd6af28, 0xdc16ea82, 0x521abb41, 0xd5dafeeb, 0xb831942d, 0x3ff1d187, 0xb36d741e, 0x34ad31b4, 0x59465b72, 0xde861ed8, 0xe876d587, 0x6fb6902d, 0x025dfaeb, 0x859dbf41, 0x09011ad8, 0x8ec15f72, 0xe32a35b4, 0x64ea701e, +0x61901c38, 0xe6505992, 0x8bbb3354, 0x0c7b76fe, 0x80e7d367, 0x072796cd, 0x6accfc0b, 0xed0cb9a1, 0xdbfc72fe, 0x5c3c3754, 0x31d75d92, 0xb6171838, 0x3a8bbda1, 0xbd4bf80b, 0xd0a092cd, 0x5760d767, ] + +d0x6a09de48=[ 0x09, 0xeb, 0x49, 0x52, 0x2d, 0x70, 0x3f, 0x50, 0xca, 0xac, 0xef, 0xbf, 0x14, 0x4f, 0x33, 0xa7, 0xd2, 0x6a, 0x79, 0x90, 0xd5, 0x28, 0xcf, 0xdf, 0x61, 0x05, 0xad, 0x8b, 0x59, 0x86, 0x51, 0x06, 0x63, 0xcc, 0x30, 0xa6, 0xc5, 0x23, 0xe1, 0x18, +0x7e, 0xd0, 0x27, 0x34, 0x9b, 0x42, 0x9d, 0x9e, 0xb2, 0x74, 0xec, 0x39, 0x8f, 0x15, 0xc6, 0xb7, 0x44, 0x3e, 0xda, 0xa4, 0x7d, 0x95, 0x6b, 0x03, 0xbc, 0xb3, 0x89, 0x71, 0xe2, 0xc0, 0xdd, 0x7c, 0x58, 0xfb, 0x46, 0xa1, 0x68, 0xc4, 0xdc, 0xc9, +0x96, 0xbb, 0x75, 0x98, 0x77, 0x56, 0x22, 0x65, 0x48, 0xa9, 0x4b, 0xab, 0x5f, 0xed, 0x25, 0x3a, 0xf5, 0x3d, 0x7a, 0x41, 0x2e, 0x62, 0x13, 0x02, 0x5a, 0xea, 0x9c, 0x66, 0xba, 0xc7, 0x43, 0x76, 0xd6, 0x6c, 0x6d, 0x5d, 0x0d, 0x67, 0x1c, 0xb5, +0xc8, 0xf7, 0x07, 0x0c, 0x12, 0xe5, 0xfc, 0x36, 0x88, 0x2a, 0x91, 0xaf, 0x37, 0x0a, 0x5e, 0x80, 0xf3, 0x4a, 0x60, 0xe6, 0xc2, 0x21, 0xa0, 0xc1, 0x2c, 0x29, 0xfd, 0x72, 0x4e, 0xf1, 0x9a, 0xd7, 0x32, 0xc3, 0x73, 0x26, 0xe4, 0x9f, 0xf9, 0xd9, +0xe3, 0xff, 0x97, 0x16, 0x93, 0x01, 0x1e, 0x5c, 0x19, 0x31, 0xa2, 0x1f, 0xb1, 0xb6, 0x11, 0xf4, 0xaa, 0x84, 0x3b, 0xce, 0x64, 0x38, 0xa5, 0x5b, 0xd4, 0x92, 0x53, 0x7f, 0x99, 0xe9, 0x1d, 0xcb, 0xd8, 0x04, 0xbe, 0x94, 0x10, 0xfe, 0x47, 0x4d, +0x55, 0xdb, 0xe8, 0xf0, 0x35, 0x2b, 0x45, 0x3c, 0xcd, 0x83, 0x7b, 0xb4, 0x8c, 0x1b, 0x8d, 0x69, 0x00, 0x2f, 0xa3, 0x17, 0xe7, 0x20, 0xf8, 0x78, 0xb9, 0xf6, 0x24, 0x8e, 0x1a, 0x0e, 0xb0, 0xd3, 0xfa, 0x40, 0xbd, 0x0b, 0x85, 0xe0, 0x8a, 0x0f, +0xb8, 0xf2, 0xa8, 0x57, 0x4c, 0xd1, 0xae, 0x87, 0x54, 0xde, 0x08, 0x81, 0x6f, 0x6e, 0xee, 0x82, 0xf9, 0x10, 0x70, 0xc7, 0x36, 0x59, 0xee, 0xd6, 0x35, 0xa7, 0x84, 0xb3, 0x0f, 0x21, 0xec, 0xe2, 0xa3, 0x74, 0x98, 0x31, 0x43, 0xe4, 0x8f, 0xb4, +0xc4, 0x34, 0x1f, 0xc3, 0x1c, 0x2f, 0xe1, 0x76, 0xaf, 0xf0, 0x8d, 0x04, 0x8a, 0xcf, 0x93, 0x16, 0x4a, 0x8e, 0xc2, 0x6e, 0xe5, 0x40, 0x30, 0xd1, 0xeb, 0xcb, 0x2c, 0x78, 0x07, 0x81, 0x0e, 0xdd, 0xe0, 0x4e, 0xb6, 0x64, 0xc8, 0x20, 0x75, 0xbb, +0xdf, 0xce, 0x32, 0xb9, 0x2e, 0x1e, 0x47, 0x60, 0x22, 0x6c, 0xd2, 0xc0, 0x5e, 0xb0, 0xb8, 0x71, 0x1a, 0x89, 0x02, 0x19, 0xa2, 0x0a, 0x9b, 0x8b, 0xc6, 0xa8, 0x63, 0x3f, 0x12, 0x0b, 0x62, 0x7e, 0x92, 0x94, 0xf7, 0x96, 0xab, 0x41, 0x29, 0x7c, +0x5c, 0x55, 0xd0, 0xaa, 0xa6, 0x82, 0xf3, 0x2a, 0xfb, 0x4d, 0x91, 0x09, 0x0d, 0x61, 0x05, 0xbe, 0x5b, 0xe9, 0x67, 0x13, 0xf1, 0x52, 0xea, 0x54, 0x42, 0x14, 0xfa, 0xef, 0xcc, 0x27, 0xf8, 0x18, 0x79, 0x3d, 0x23, 0xa9, 0xd4, 0x38, 0xc5, 0xa0, +0xae, 0xbd, 0x17, 0x1b, 0xa1, 0xc9, 0xb7, 0x86, 0x50, 0x2b, 0x9d, 0x66, 0xf6, 0x4f, 0x9a, 0x68, 0xe6, 0xa4, 0x03, 0xf5, 0x6a, 0x9f, 0xe7, 0x95, 0x6b, 0xd3, 0xa5, 0xfd, 0x15, 0x48, 0x3a, 0x9c, 0xdc, 0xff, 0xad, 0x87, 0xc1, 0x49, 0xb2, 0x56, +0x88, 0x7b, 0xbf, 0xd5, 0x7d, 0x7f, 0x72, 0xba, 0xca, 0x99, 0x8c, 0xf2, 0xf4, 0xcd, 0x80, 0x83, 0x11, 0xbc, 0x1d, 0xfe, 0x51, 0x08, 0x28, 0xd9, 0xfc, 0xe3, 0x53, 0x3e, 0xac, 0x4b, 0x65, 0xe8, 0x57, 0xed, 0x25, 0x85, 0x01, 0x00, 0x46, 0xda, +0x58, 0x97, 0x37, 0x44, 0x33, 0x39, 0x4c, 0x0c, 0x77, 0x3b, 0x7a, 0x5f, 0x69, 0x2d, 0x24, 0xb1, 0x06, 0x6f, 0x26, 0xd8, 0x45, 0x73, 0xdb, 0x5a, 0x5d, 0x9e, 0xde, 0x3c, 0xd7, 0xb5, 0x6d, 0x90, 0xe5, 0x34, 0x04, 0xac, 0x41, 0x6f, 0xe9, 0xfd, +0x21, 0xa4, 0x5b, 0x77, 0x69, 0xee, 0xbe, 0x00, 0x08, 0x56, 0x17, 0xba, 0x95, 0x86, 0xcd, 0x07, 0x53, 0x39, 0x3b, 0x94, 0x35, 0xf9, 0xa0, 0xd3, 0x06, 0x9c, 0x79, 0xb1, 0x67, 0x27, 0x60, 0xff, 0x8f, 0xd6, 0xd5, 0x10, 0xbf, 0x45, 0xa1, 0xc9, +0xb4, 0x51, 0x9f, 0x16, 0x8c, 0xf8, 0x31, 0xb3, 0xcc, 0x5f, 0x1c, 0x2e, 0x93, 0xd9, 0x8b, 0x19, 0x55, 0x28, 0xdf, 0xa5, 0x6b, 0x3f, 0x02, 0x62, 0xbc, 0x4c, 0x4d, 0x40, 0x76, 0xa3, 0xfe, 0xef, 0x4a, 0x63, 0x26, 0xa7, 0xce, 0x68, 0xc0, 0x73, +0x2d, 0xc6, 0x0d, 0xe2, 0x30, 0x18, 0x22, 0x23, 0x3c, 0xf1, 0xed, 0xbb, 0xa9, 0x13, 0xf2, 0x82, 0x0b, 0xf5, 0x5a, 0xf0, 0xa6, 0xf4, 0xdb, 0x83, 0x11, 0x59, 0x43, 0x70, 0x9b, 0xab, 0xcb, 0x32, 0x05, 0xdc, 0xae, 0x91, 0x58, 0x2f, 0xa2, 0x71, +0x36, 0xec, 0x0c, 0x0a, 0xb5, 0x1b, 0x9a, 0x6d, 0xe1, 0x48, 0xfc, 0x6a, 0x3a, 0xea, 0x7c, 0x6e, 0xe3, 0x1f, 0xeb, 0x89, 0xde, 0x2b, 0x5e, 0x3d, 0x92, 0xf7, 0x49, 0x0f, 0xad, 0x75, 0x7b, 0xf6, 0x97, 0x90, 0x4e, 0xc4, 0xfb, 0x96, 0x5c, 0xd8, +0x4b, 0x88, 0xe7, 0x33, 0x50, 0xaf, 0xc3, 0x81, 0x7f, 0x0e, 0x6c, 0x57, 0xa8, 0x61, 0x8d, 0x85, 0x37, 0xdd, 0xd0, 0x99, 0xe4, 0x54, 0x42, 0xaa, 0xda, 0x47, 0x66, 0x7a, 0x25, 0x1d, 0x1a, 0x7d, 0x74, 0xd1, 0x46, 0xc5, 0xe0, 0x5d, 0x84, 0xe8, +0xb2, 0x87, 0xc7, 0xb9, 0x2c, 0xd7, 0xe6, 0x12, 0x03, 0x20, 0xb0, 0x8a, 0xcf, 0x09, 0x98, 0xd4, 0x7e, 0x24, 0x9d, 0x15, 0xbd, 0x14, 0x9e, 0x78, 0x2a, 0x29, 0x4f, 0x44, 0xb6, 0xca, 0x80, 0x72, 0xb8, 0xf3, 0x3e, 0xfa, 0x01, 0xb7, 0xc8, 0x1e, +0x38, 0x64, 0x8e, 0xc1, 0x52, 0xc2, 0x65, 0xd2, 0x97, 0x60, 0xbd, 0xd3, 0x27, 0x70, 0x30, 0xb8, 0x7f, 0xdf, 0x24, 0x8b, 0x93, 0x40, 0x5d, 0xa5, 0x78, 0xbe, 0x53, 0x17, 0x19, 0xf4, 0x8e, 0x64, 0xf7, 0xc0, 0xfb, 0x86, 0x73, 0x33, 0x55, 0xc1, +0x62, 0xcc, 0x3d, 0x7c, 0xa3, 0x44, 0xbb, 0xe1, 0x11, 0x52, 0x7a, 0x10, 0xc8, 0xbf, 0x95, 0x85, 0xd5, 0x99, 0x12, 0xcf, 0x83, 0xec, 0x6f, 0x26, 0x71, 0xaa, 0x98, 0xe2, 0x69, 0xf6, 0x38, 0xd8, 0xb7, 0xae, 0x2b, 0x9b, 0xe7, 0xc4, 0xf9, 0xa9, +0x68, 0xf2, 0x72, 0xee, 0x6e, 0x29, 0x75, 0x21, 0xb4, 0x58, 0x00, 0xe6, 0xd1, 0xd7, 0x49, 0xe8, 0x41, 0x7e, 0xbc, 0xb2, 0xf0, 0xd6, 0x5b, 0x28, 0xcb, 0xff, 0x25, 0xcd, 0xab, 0x91, 0x9f, 0x80, 0xdc, 0x14, 0x8c, 0x4d, 0xc9, 0xd2, 0x9a, 0xfa, +0x1e, 0x87, 0x61, 0x88, 0x3a, 0xe0, 0xf5, 0x1c, 0x6a, 0xb3, 0x4e, 0x65, 0x42, 0x57, 0x9d, 0x51, 0x36, 0x84, 0x48, 0x45, 0x34, 0x5c, 0xb0, 0xad, 0xfe, 0x0a, 0x63, 0x81, 0xea, 0x5f, 0x23, 0x18, 0x6c, 0xd4, 0xeb, 0xb5, 0xa0, 0x90, 0x79, 0x01, +0x15, 0xc5, 0x66, 0xca, 0x0e, 0x32, 0xa4, 0xa7, 0x6b, 0x0d, 0xf8, 0x08, 0x77, 0x8d, 0xa2, 0x94, 0x6d, 0x96, 0xa8, 0x89, 0xc6, 0x7d, 0xc7, 0xb6, 0x3f, 0x1d, 0xd9, 0x74, 0x9e, 0x67, 0xfc, 0xb9, 0xfd, 0xef, 0x4b, 0x2f, 0xde, 0xac, 0x04, 0x0f, +0x43, 0x0b, 0xe5, 0x46, 0xd0, 0xaf, 0x4a, 0x59, 0x4c, 0xb1, 0x2c, 0x50, 0x92, 0x3b, 0x1b, 0x8a, 0xc2, 0x07, 0x54, 0x09, 0xe9, 0xed, 0x5e, 0x4f, 0x47, 0xa6, 0x22, 0x2a, 0x8f, 0xf1, 0xf3, 0xe4, 0x35, 0x06, 0xdd, 0x02, 0x1f, 0x76, 0x9c, 0x56, +0x31, 0x3e, 0xce, 0x3c, 0xa1, 0x37, 0x82, 0x1a, 0xe3, 0xba, 0x2e, 0x03, 0x05, 0x5a, 0x16, 0xc3, 0x20, 0x7b, 0x13, 0xda, 0x39, 0x0c, 0x2d, 0xdb, 0xff, 0xfc, 0x55, 0x14, 0x9b, 0xec, 0x49, 0xf1, 0x86, 0x42, 0x5b, 0x65, 0xc6, 0xb6, 0xd7, 0xf0, +0xf8, 0xbb, 0x01, 0x31, 0xaf, 0x03, 0x43, 0x19, 0x6a, 0xea, 0xdb, 0x83, 0x9a, 0xa3, 0x1b, 0x54, 0xa8, 0xc3, 0x91, 0x18, 0xd8, 0x36, 0xcc, 0x48, 0x6f, 0x28, 0xa7, 0xfe, 0xc8, 0x3e, 0x7d, 0xcd, 0x5f, 0x1d, 0xc7, 0x76, 0x73, 0x41, 0xdc, 0x2d, +0xa1, 0x68, 0x33, 0x63, 0x84, 0x1e, 0x4f, 0x10, 0x30, 0x06, 0x40, 0x3d, 0x16, 0xfb, 0xc1, 0x3a, 0x79, 0xa5, 0x6e, 0x81, 0xb0, 0xc5, 0xca, 0xa6, 0x72, 0xb4, 0x4d, 0xf6, 0xad, 0x5d, 0xdf, 0x4b, 0x45, 0x22, 0xf9, 0x82, 0x66, 0xe7, 0x67, 0x71, +0xf5, 0xb3, 0x60, 0xb7, 0x23, 0x9d, 0x0f, 0xd1, 0x89, 0x53, 0xe1, 0x1c, 0x8b, 0x98, 0xbf, 0x94, 0x5c, 0x50, 0x32, 0x26, 0x1a, 0xae, 0xd0, 0xb2, 0x35, 0x96, 0xbc, 0x70, 0xbe, 0x27, 0xcb, 0x62, 0x97, 0xa2, 0x21, 0x38, 0xfd, 0xa9, 0x3f, 0x12, +0x5a, 0xd9, 0x6d, 0x47, 0xef, 0xee, 0xda, 0xc0, 0x9c, 0x00, 0x9f, 0x4a, 0xac, 0xf7, 0x87, 0xa4, 0x09, 0x29, 0x0b, 0xb8, 0xd4, 0x1f, 0x69, 0x75, 0x17, 0xe4, 0x8c, 0xa0, 0x59, 0x64, 0x3c, 0xb1, 0x95, 0x85, 0x25, 0x7b, 0x7a, 0x46, 0x4c, 0xe2, +0xaa, 0xc9, 0xd5, 0x07, 0x4e, 0xe6, 0xe0, 0xcf, 0x0d, 0xdd, 0x0a, 0xed, 0x8f, 0xe5, 0x04, 0x7c, 0x77, 0x08, 0x2b, 0xf2, 0xde, 0x37, 0x52, 0x2e, 0x51, 0xf3, 0x0e, 0x58, 0x90, 0x05, 0x56, 0x80, 0xe9, 0x8e, 0xfa, 0x6b, 0x0c, 0x44, 0x74, 0x61, +0x24, 0x93, 0x15, 0xd2, 0x20, 0x8a, 0xbd, 0x99, 0xf4, 0x7e, 0x34, 0x88, 0x3b, 0xb9, 0xce, 0xc4, 0x92, 0x78, 0xe3, 0xc2, 0x11, 0xeb, 0x8d, 0xba, 0xe8, 0x9e, 0xab, 0x39, 0x7f, 0x2a, 0xd6, 0x02, 0xd3, 0xb5, 0x2c, 0x6c, 0x57, 0x13, 0x5e, 0x2f, +0x5e, 0x77, 0xc2, 0x66, 0x2b, 0x68, 0x31, 0x40, 0x27, 0xbe, 0x11, 0xc4, 0xf7, 0x08, 0xe1, 0x21, 0x81, 0xee, 0x60, 0xcd, 0x47, 0x83, 0x0a, 0x00, 0x43, 0xfd, 0x2c, 0x06, 0x7e, 0x65, 0xf0, 0x02, 0x3e, 0xe8, 0x93, 0xf8, 0x97, 0xa3, 0x46, 0x8c, +0x9a, 0x41, 0xe9, 0xe2, 0xb0, 0x9c, 0x37, 0x42, 0xda, 0xcf, 0x74, 0xbd, 0x0d, 0xab, 0x6e, 0x0f, 0x55, 0x96, 0xfc, 0x7a, 0x76, 0x91, 0x30, 0xc0, 0xf2, 0xaa, 0x70, 0x25, 0xc9, 0x29, 0x89, 0x9b, 0xa0, 0xbf, 0x92, 0xa1, 0x44, 0x26, 0x1d, 0x3d, +0xc6, 0x87, 0xc1, 0x3b, 0x61, 0xdc, 0x5a, 0x98, 0x7b, 0x9e, 0x84, 0x2f, 0xf3, 0xd8, 0x1b, 0x2e, 0x2d, 0x88, 0xed, 0x22, 0x86, 0x6f, 0xef, 0xb6, 0x04, 0x14, 0x9f, 0x64, 0x0c, 0x78, 0xac, 0x48, 0x1c, 0xdd, 0xdb, 0x4d, 0xfa, 0x50, 0x13, 0xa2, +0x57, 0x34, 0x69, 0x7f, 0x52, 0x8f, 0xfe, 0x07, 0xe3, 0xd2, 0x8d, 0xd1, 0x56, 0x3c, 0xc8, 0x73, 0x7d, 0x17, 0xe5, 0xba, 0xa5, 0xf6, 0x0e, 0x20, 0xf1, 0xb8, 0x49, 0x6b, 0x4c, 0x71, 0xcc, 0x23, 0x4e, 0xec, 0x5b, 0xdf, 0x19, 0x79, 0xbb, 0xb4, +0x5d, 0x8a, 0x94, 0x95, 0x38, 0xd0, 0xbc, 0xd5, 0xd3, 0xa9, 0x39, 0x4b, 0x32, 0x15, 0xe6, 0x6c, 0x90, 0x5c, 0x58, 0x03, 0x7c, 0x62, 0x99, 0x09, 0x0b, 0x85, 0x63, 0xb2, 0xae, 0xf4, 0xe4, 0x82, 0x3f, 0x10, 0xc3, 0xa4, 0xb5, 0x2a, 0xb3, 0xd7, +0x75, 0x4f, 0xad, 0x72, 0xd9, 0x1e, 0xcb, 0xf9, 0x45, 0xeb, 0x51, 0x67, 0x01, 0xa6, 0x12, 0xa8, 0x9d, 0x16, 0xb1, 0xd4, 0x59, 0x80, 0x33, 0xc5, 0x1f, 0x1a, 0x6a, 0xa7, 0x8e, 0x54, 0x35, 0x18, 0xce, 0xb9, 0x05, 0x24, 0x4a, 0xf5, 0x53, 0x8b, +0xe0, 0x28, 0x5f, 0xc7, 0x36, 0x3a, 0xd6, 0xca, 0xe7, 0xde, 0xff, 0x6d, 0xb7, 0xfb, 0xea, 0xaf, 0x62, 0x71, 0xd6, 0xc1, 0xf0, 0x05, 0xf4, 0x82, 0x50, 0xe8, 0x6d, 0x99, 0xe6, 0x5f, 0x3d, 0x8e, 0xba, 0xee, 0xa6, 0x07, 0x7d, 0x45, 0x4e, 0xce, +0xd7, 0xe0, 0xbb, 0x4c, 0x58, 0x96, 0x8b, 0x9f, 0xf7, 0x51, 0xe1, 0x26, 0xd4, 0x2f, 0xb0, 0x92, 0x55, 0x64, 0x4f, 0x2c, 0xf8, 0x0e, 0x59, 0x93, 0xa8, 0x86, 0x00, 0xb1, 0xd0, 0x7e, 0xeb, 0x30, 0x11, 0x97, 0xaf, 0xc8, 0x25, 0xcc, 0xcd, 0xad, +0x98, 0x1c, 0x73, 0xbc, 0x18, 0x87, 0x1b, 0xfc, 0x32, 0x47, 0x94, 0x2e, 0x37, 0xf6, 0x16, 0xdc, 0x48, 0x9e, 0x8a, 0x01, 0x0a, 0xf3, 0x2b, 0x90, 0xfe, 0xc3, 0x72, 0x06, 0x44, 0x9b, 0x14, 0xdd, 0xd3, 0x35, 0xb6, 0x2a, 0x4a, 0x3a, 0x13, 0x36, +0xb8, 0xef, 0x4d, 0x0d, 0xa5, 0x7b, 0xe5, 0x88, 0xd1, 0xd9, 0x9c, 0x3f, 0x21, 0xa3, 0x5e, 0x10, 0x1f, 0xaa, 0x91, 0xa1, 0x19, 0x03, 0x5a, 0xec, 0x78, 0x6e, 0x1e, 0x42, 0x08, 0x3c, 0xac, 0x75, 0x3b, 0x09, 0x7c, 0x1d, 0xc4, 0x8d, 0x95, 0x85, +0x84, 0xab, 0xb4, 0x77, 0x6a, 0x65, 0x52, 0x0b, 0xea, 0x40, 0x33, 0x60, 0x6c, 0x67, 0xc9, 0xff, 0x38, 0xc0, 0xa9, 0x43, 0xe2, 0x56, 0xfa, 0x69, 0xc2, 0xfd, 0x83, 0x9a, 0xcf, 0x80, 0x70, 0x79, 0x0f, 0x12, 0xc6, 0xc5, 0x39, 0xf2, 0x17, 0xe9, +0x34, 0xf1, 0xde, 0x23, 0xd8, 0x0c, 0x5d, 0xbe, 0xb9, 0x15, 0x4b, 0x46, 0xb3, 0x24, 0xb2, 0x31, 0xdf, 0x76, 0x57, 0x53, 0x66, 0xe3, 0xe7, 0x5b, 0x63, 0x27, 0x74, 0xdb, 0xb5, 0xb7, 0x6b, 0x2d, 0x81, 0xa2, 0x5c, 0x7a, 0xcb, 0x20, 0xe4, 0xda, +0xbd, 0x1a, 0xd5, 0xf9, 0xa4, 0xfb, 0x29, 0xbf, 0xca, 0x6f, 0x02, 0xa0, 0x8f, 0x7f, 0xed, 0x89, 0x8c, 0x68, 0xae, 0x41, 0xd2, 0xc7, 0xa7, 0x9d, 0x04, 0x61, 0x22, 0x49, 0x3e, 0x54, 0xf5, 0x28, 0xd3, 0xa6, 0x1f, 0xfb, 0x6b, 0x1a, 0x17, 0x05, +0xf4, 0xa5, 0x24, 0xca, 0x21, 0xc7, 0x56, 0x75, 0xe8, 0x48, 0xf2, 0x66, 0x00, 0x85, 0xb1, 0x33, 0x38, 0x67, 0x4d, 0x92, 0x6f, 0x6e, 0x19, 0xd4, 0x58, 0x98, 0xe4, 0xc4, 0x10, 0xda, 0x06, 0x5f, 0xc8, 0xbe, 0xa3, 0x40, 0xfe, 0x83, 0x35, 0xe6, +0xef, 0xf6, 0xb5, 0x14, 0x32, 0x70, 0x6c, 0x90, 0xe1, 0x93, 0xa9, 0x88, 0xe7, 0xbb, 0x3d, 0x5a, 0x36, 0xf8, 0x0d, 0xb9, 0x2d, 0x53, 0x57, 0x2b, 0x44, 0x7d, 0x8c, 0x02, 0xeb, 0x45, 0x95, 0xdc, 0xfc, 0xd7, 0x18, 0x03, 0xff, 0x55, 0x1c, 0xba, +0xae, 0xb3, 0x39, 0x81, 0xf5, 0xbf, 0x94, 0x3c, 0xe0, 0x13, 0x2f, 0xa0, 0x7f, 0x4f, 0xc6, 0xcb, 0x2c, 0xa7, 0x62, 0xc0, 0x22, 0xea, 0xa4, 0x68, 0x0f, 0xd2, 0x1e, 0xf9, 0x9e, 0x23, 0x76, 0xb2, 0x9a, 0x0b, 0xd6, 0x37, 0x61, 0x27, 0x09, 0x64, +0xdd, 0x3f, 0xde, 0xe2, 0x71, 0x49, 0x1b, 0x54, 0x72, 0x9b, 0xab, 0x9f, 0x47, 0x25, 0xee, 0x11, 0xcc, 0xe3, 0x99, 0xa8, 0x04, 0x73, 0xd8, 0xa2, 0x28, 0x30, 0xd9, 0xfd, 0xd0, 0x15, 0xfa, 0xe9, 0xf1, 0x52, 0xd1, 0xd5, 0x8d, 0xdb, 0x63, 0x4b, +0x0c, 0xec, 0x77, 0x34, 0xb7, 0xc3, 0xbd, 0x91, 0x59, 0x5c, 0x4a, 0x9d, 0x82, 0xb8, 0x7c, 0xaf, 0xf3, 0xcd, 0x5d, 0x78, 0x80, 0x50, 0xb0, 0x8b, 0x31, 0x6a, 0x51, 0xc9, 0x2e, 0xaa, 0x26, 0x43, 0x7e, 0x29, 0x8a, 0xce, 0x89, 0xc2, 0x16, 0x7a, +0x3a, 0xad, 0xb6, 0xac, 0x0a, 0x79, 0xa1, 0x3b, 0x2a, 0x20, 0x8e, 0x4c, 0x07, 0xf7, 0x9c, 0x65, 0x96, 0xb4, 0x08, 0x3e, 0xdf, 0x0e, 0x1d, 0x8f, 0x01, 0x46, 0xc1, 0xcf, 0xed, 0x5e, 0xbc, 0x42, 0x12, 0x69, 0x5b, 0xc5, 0x6d, 0x87, 0x60, 0x97, +0x84, 0xe5, 0x41, 0xf0, 0x74, 0x86, 0x4e, 0x7b, 0x5b, 0x7c, 0x77, 0x99, 0xd0, 0x0c, 0xc0, 0x17, 0xcd, 0xa7, 0x43, 0x60, 0xba, 0xfa, 0xf6, 0xcf, 0x69, 0x2f, 0x02, 0xed, 0x1b, 0x9f, 0x42, 0x32, 0x35, 0xa4, 0xa5, 0xc3, 0xb1, 0xea, 0x29, 0x51, +0x3a, 0x23, 0xc8, 0xd8, 0x65, 0x8c, 0xce, 0xf9, 0xb3, 0xf1, 0xec, 0xb4, 0x62, 0x00, 0x50, 0xd1, 0x56, 0xac, 0x39, 0x45, 0x6f, 0x31, 0xd2, 0xe7, 0x2b, 0x3d, 0x41, 0xf5, 0x11, 0x91, 0x3e, 0x8f, 0x5a, 0xcc, 0x04, 0x09, 0x0d, 0x05, 0xfe, 0x07, +0x98, 0x33, 0x2d, 0xa2, 0xda, 0x97, 0xe2, 0x20, 0xc4, 0x64, 0x83, 0x9c, 0xdc, 0x3c, 0x55, 0xb9, 0xad, 0x28, 0x4b, 0xee, 0x9d, 0xe9, 0x24, 0x92, 0x0a, 0x40, 0xbc, 0x2c, 0x34, 0xe5, 0x95, 0x08, 0x4e, 0x53, 0xbf, 0xb0, 0x30, 0x12, 0xaa, 0xbd, +0xc5, 0x96, 0xe0, 0x03, 0x82, 0x3b, 0x76, 0x47, 0x0e, 0xe6, 0xa6, 0x75, 0x8b, 0x8d, 0xf3, 0x89, 0x4c, 0x22, 0x78, 0x63, 0xbb, 0xd4, 0x1e, 0x10, 0xf4, 0x01, 0x38, 0x9e, 0x1a, 0xd9, 0x16, 0xe8, 0xa0, 0x6a, 0xab, 0x5f, 0x88, 0x4d, 0x6c, 0x67, +0x7e, 0xbe, 0x18, 0x61, 0xc6, 0xde, 0x54, 0xf0, 0xc1, 0x4a, 0xcb, 0x85, 0x8e, 0x19, 0x74, 0xd3, 0x4f, 0x87, 0x13, 0x9b, 0xae, 0xdd, 0xca, 0x86, 0xe3, 0xe4, 0x5d, 0x90, 0x79, 0xa1, 0x52, 0x7a, 0xfc, 0x49, 0xaf, 0x70, 0x1f, 0x7b, 0x25, 0x21, +0xff, 0xeb, 0xb2, 0xd5, 0x59, 0x6b, 0x27, 0x68, 0x48, 0x37, 0x5c, 0x7d, 0x0b, 0x26, 0xa8, 0x94, 0x0f, 0x36, 0x44, 0xb5, 0x1d, 0x66, 0x73, 0x7f, 0xdf, 0x71, 0xa9, 0xfd, 0x6e, 0x84, 0x2e, 0xf7, 0xb6, 0xc7, 0x81, 0xc9, 0xef, 0x3f, 0x6d, 0xb8, +0xd6, 0xa3, 0x5e, 0x80, 0x14, 0x2a, 0x8a, 0xe1, 0x06, 0x9a, 0x15, 0xf2, 0xc2, 0xd7, 0x1c, 0x58, 0x72, 0xfb, 0x93, 0x57, 0x46, 0xf8, 0xdb, 0xb7, 0x2e, 0x58, 0x5b, 0xfa, 0x50, 0x54, 0x3c, 0x02, 0x36, 0x46, 0xae, 0xa6, 0x13, 0x2c, 0xf5, 0x21, +0x43, 0xea, 0x76, 0x9d, 0x9c, 0x69, 0x85, 0xd1, 0xb3, 0xaa, 0xef, 0x0c, 0x62, 0x47, 0xfc, 0x5f, 0xfd, 0xe8, 0xd8, 0x7f, 0x5c, 0xda, 0xe1, 0x17, 0x71, 0x28, 0xe0, 0xbc, 0x3a, 0x4e, 0x82, 0xbe, 0xed, 0x8a, 0x93, 0x59, 0x25, 0x1f, 0x11, 0x3d, +0x87, 0xba, 0xc8, 0x09, 0xb6, 0xb9, 0x8f, 0x99, 0xdb, 0x16, 0xc6, 0xb7, 0x83, 0xf4, 0xf9, 0x06, 0x6d, 0x73, 0x49, 0x08, 0x78, 0x1e, 0xd2, 0x79, 0x75, 0x1a, 0x5d, 0x51, 0xc9, 0xe3, 0x42, 0x07, 0x34, 0x26, 0x04, 0x05, 0x84, 0xe6, 0xc7, 0xbd, +0xf3, 0x9b, 0xc5, 0x72, 0xe5, 0x6c, 0x98, 0x10, 0x9e, 0x3e, 0x5e, 0xb0, 0x4b, 0x6f, 0xb5, 0x57, 0xf1, 0xa0, 0xf0, 0x64, 0x7c, 0x40, 0x66, 0x7e, 0xd0, 0x4d, 0x29, 0x77, 0x2d, 0xeb, 0x8d, 0x0a, 0x8b, 0x67, 0x27, 0xfb, 0x30, 0xe2, 0x6a, 0x37, +0x86, 0xf8, 0xcb, 0x63, 0x9a, 0xf6, 0x3f, 0x4c, 0x45, 0x0f, 0xf2, 0x8e, 0x1b, 0x81, 0xdc, 0x97, 0x65, 0xfe, 0x91, 0xc1, 0xbb, 0xc4, 0xd4, 0xad, 0xcf, 0x41, 0xab, 0x80, 0x95, 0xce, 0x1d, 0xdf, 0x60, 0xb8, 0x4a, 0x9f, 0xa7, 0x7d, 0x24, 0x0d, +0xa5, 0x96, 0x35, 0xbf, 0x92, 0xca, 0x2b, 0xc3, 0xa9, 0xb2, 0x52, 0x6b, 0x20, 0x2a, 0xcd, 0x55, 0xe7, 0x1c, 0x61, 0x4f, 0x70, 0xd5, 0x22, 0x48, 0x89, 0x6e, 0xa4, 0x2f, 0x5a, 0x3b, 0x0e, 0x38, 0x00, 0xa2, 0x33, 0xee, 0xff, 0xdd, 0xd9, 0x68, +0xd6, 0xe4, 0x39, 0x32, 0x0b, 0x94, 0xd7, 0x01, 0x53, 0x15, 0xd3, 0xde, 0x7b, 0x8c, 0x23, 0x90, 0xb1, 0x7a, 0xec, 0x14, 0xac, 0x19, 0xcc, 0x12, 0xc0, 0xf7, 0x88, 0x31, 0xa1, 0xa3, 0xb4, 0x18, 0x44, 0x74, 0xaf, 0xc2, 0x56, 0xa8, 0xe9, 0x03, +0x2a, 0x34, 0x67, 0x7d, 0xde, 0x26, 0x9b, 0xd8, 0xd3, 0x94, 0x5d, 0x9c, 0x15, 0x3a, 0x1b, 0x80, 0xad, 0xbd, 0x41, 0xe1, 0x2e, 0xdf, 0x91, 0x1a, 0x1c, 0xff, 0x6e, 0x49, 0x81, 0x9a, 0x99, 0x05, 0xf7, 0xf3, 0xaa, 0x87, 0x22, 0xe0, 0x86, 0x06, +0x3b, 0x50, 0xdb, 0xc3, 0x5b, 0x23, 0x0a, 0x28, 0xf4, 0x07, 0x78, 0xfe, 0xdd, 0x82, 0xb2, 0xef, 0x7a, 0x3f, 0xb8, 0x00, 0x95, 0x97, 0x74, 0x54, 0xcd, 0xe7, 0x17, 0xd9, 0x2f, 0x83, 0xae, 0xdc, 0xec, 0x0d, 0x3c, 0xca, 0xa8, 0x4c, 0xa9, 0x7b, +0x45, 0x21, 0x59, 0x65, 0xab, 0xe6, 0xf5, 0x44, 0x88, 0xb6, 0xe4, 0x40, 0x46, 0x1d, 0x8a, 0x9d, 0x2c, 0x35, 0x92, 0x8d, 0x73, 0x4a, 0xb5, 0xfb, 0x18, 0x4b, 0xb0, 0x5e, 0x03, 0x6d, 0x36, 0xd1, 0x38, 0xa6, 0xed, 0xd0, 0x09, 0x3d, 0x84, 0xd4, +0x14, 0x55, 0x69, 0x3e, 0x1e, 0xd5, 0x7c, 0x79, 0x1f, 0xe3, 0xc6, 0x10, 0xd6, 0x9f, 0x02, 0xc4, 0x5f, 0x85, 0x6f, 0x89, 0xb7, 0x63, 0x33, 0x8e, 0x53, 0xb9, 0x61, 0x2d, 0x90, 0xf2, 0x93, 0x25, 0xea, 0x29, 0x68, 0x04, 0x60, 0x66, 0x62, 0xb4, +0x19, 0x8f, 0xcf, 0xb3, 0x71, 0x76, 0x31, 0x56, 0x08, 0x4e, 0x47, 0xd7, 0x48, 0x39, 0x11, 0xe5, 0x2b, 0xa1, 0xe2, 0xda, 0xa2, 0x0b, 0xd2, 0x20, 0xf9, 0xc2, 0x13, 0xe8, 0x6a, 0x0f, 0xc0, 0x77, 0xa7, 0xf1, 0xa5, 0x8b, 0xfc, 0x0c, 0x98, 0xf0, +0xc9, 0xfa, 0xf8, 0xeb, 0xfd, 0x16, 0x5c, 0xce, 0x42, 0x4f, 0x64, 0x9e, 0xcc, 0x01, 0x6b, 0x7f, 0xcb, 0x24, 0xe9, 0xa3, 0xbe, 0xf6, 0x70, 0xba, 0xac, 0x75, 0xbb, 0xc8, 0xb1, 0x30, 0x37, 0x43, 0x51, 0xaf, 0x8c, 0x32, 0xc5, 0xbf, 0x52, 0x12, +0x57, 0x7e, 0xee, 0x6c, 0x4d, 0x72, 0x96, 0x5a, 0xbc, 0xc1, 0x58, 0xc7, 0xa4, 0x0e, 0xa0, 0x27, 0x8f, 0x39, 0x9c, 0x42, 0x6c, 0x4d, 0xa9, 0xd3, 0xb0, 0x29, 0x73, 0x40, 0xc9, 0xf1, 0xaa, 0xdc, 0x45, 0x0d, 0xdf, 0x33, 0x60, 0x51, 0x13, 0x74, +0x91, 0x5e, 0x49, 0x9f, 0x0a, 0x77, 0x80, 0x62, 0xab, 0x7a, 0x7e, 0x47, 0xda, 0x46, 0xe9, 0xe1, 0xc7, 0x7f, 0x8c, 0x7b, 0xad, 0x48, 0xc1, 0xeb, 0x16, 0xb8, 0xcf, 0xed, 0x61, 0x2c, 0x01, 0x88, 0x65, 0xfb, 0x5d, 0xf5, 0x9e, 0x57, 0xd1, 0x10, +0xa4, 0xdd, 0x66, 0xe7, 0xbd, 0x53, 0xb7, 0x68, 0x95, 0x6e, 0xc5, 0x1e, 0xea, 0xbb, 0x06, 0x50, 0x41, 0x76, 0x70, 0x84, 0xe2, 0x2f, 0xcd, 0x1a, 0xa8, 0x81, 0x55, 0x00, 0xf8, 0x5b, 0xef, 0x09, 0x3f, 0xb4, 0x36, 0xb2, 0xf2, 0xac, 0x72, 0x1c, +0xa6, 0x3c, 0x4f, 0xae, 0x03, 0x85, 0x37, 0x54, 0x34, 0x6f, 0xaf, 0x67, 0xcb, 0x3e, 0x17, 0x97, 0x8b, 0xe6, 0xd0, 0xca, 0xa5, 0xe4, 0x3d, 0x90, 0xde, 0xe8, 0xf6, 0xbf, 0x44, 0xc3, 0x12, 0x87, 0x6b, 0x21, 0x31, 0x4a, 0xc2, 0xd7, 0x8e, 0x18, +0x30, 0xbe, 0xce, 0x5c, 0x4c, 0xe5, 0xff, 0xd9, 0xee, 0x04, 0x15, 0x08, 0xba, 0x11, 0xb1, 0x0f, 0xa7, 0xf7, 0x89, 0x98, 0xc6, 0x9a, 0xf4, 0xdb, 0x83, 0x26, 0x69, 0x02, 0x9d, 0xa1, 0x6a, 0xb9, 0x1f, 0x1d, 0xfa, 0x79, 0x94, 0xe3, 0x2a, 0x58, +0xfd, 0x28, 0x2d, 0x32, 0x56, 0xb5, 0x6d, 0x22, 0x4e, 0x82, 0x78, 0xe0, 0x05, 0x0c, 0x27, 0xf3, 0x2b, 0xbc, 0x92, 0xd4, 0xc0, 0x3a, 0x0b, 0x64, 0xb3, 0xd6, 0xf0, 0x52, 0xf9, 0x14, 0x19, 0x71, 0x43, 0xd2, 0x0e, 0x7d, 0xb6, 0x75, 0x23, 0x35, +0xa0, 0xa3, 0xd8, 0x20, 0x96, 0x93, 0x24, 0x25, 0x5a, 0xfe, 0x5f, 0x07, 0x1b, 0x38, 0xcc, 0xc8, 0x7c, 0x2e, 0x4b, 0x99, 0x9b, 0xc4, 0x63, 0x59, 0xec, 0xfc, 0x8d, 0x86, 0x8a, 0xa2, 0x3b, 0xd5, 0x47, 0x7a, 0x94, 0x4d, 0xdd, 0x5e, 0x77, 0x40, +0xce, 0xc8, 0xd4, 0x4f, 0xc9, 0xa6, 0x29, 0xcc, 0x34, 0xca, 0x26, 0x71, 0x89, 0xb8, 0xcf, 0xf5, 0x61, 0x22, 0xd0, 0xb2, 0xb4, 0x2e, 0x56, 0x2d, 0x10, 0xe2, 0x79, 0xbb, 0xb3, 0x51, 0x33, 0x1b, 0xd7, 0xe9, 0x38, 0x2b, 0x99, 0x1d, 0x88, 0xbe, +0x69, 0x11, 0x85, 0x32, 0x8d, 0x58, 0xb0, 0xe5, 0x19, 0x37, 0xcd, 0xa9, 0x0c, 0x05, 0xe4, 0xec, 0xea, 0xc3, 0x93, 0x8c, 0xd1, 0x5d, 0x27, 0xaf, 0x03, 0x9f, 0xaa, 0x7e, 0x8a, 0xe0, 0x52, 0x95, 0xa0, 0x4e, 0x1f, 0x62, 0xa1, 0x65, 0x3d, 0x16, +0x90, 0xd9, 0x49, 0xc2, 0xdc, 0x7d, 0x8e, 0x0b, 0x7b, 0x24, 0x84, 0xe3, 0x2c, 0x1c, 0xc6, 0x72, 0xe1, 0xab, 0x06, 0xe7, 0x3f, 0xff, 0x6e, 0x7c, 0x97, 0x63, 0xbf, 0xbd, 0x35, 0x3a, 0xc5, 0x7f, 0xb6, 0x9c, 0x0e, 0xf4, 0xd2, 0x5f, 0x12, 0x6d, +0xb5, 0x4a, 0xac, 0x4c, 0x0f, 0x91, 0x81, 0xf2, 0x80, 0xc4, 0xcb, 0x78, 0xe8, 0x75, 0x45, 0x6a, 0xfc, 0x20, 0xa3, 0x13, 0x55, 0xeb, 0xda, 0x9b, 0x68, 0x08, 0xb9, 0x1e, 0xed, 0x15, 0xfe, 0x48, 0xf9, 0x42, 0x02, 0x30, 0x46, 0xef, 0xdb, 0x5b, +0x5a, 0xc7, 0xf1, 0x43, 0x01, 0xa5, 0xad, 0x9e, 0x36, 0xf3, 0x76, 0x53, 0x66, 0x44, 0x83, 0xe6, 0x98, 0x92, 0x14, 0x21, 0x17, 0x41, 0x07, 0x3b, 0xba, 0x18, 0xae, 0x00, 0x6c, 0xee, 0xc1, 0xd8, 0x64, 0xb7, 0xd6, 0x87, 0x9d, 0x86, 0xf6, 0x4b, +0xdf, 0x2a, 0x09, 0x2f, 0x70, 0x23, 0xf8, 0x67, 0xbc, 0x25, 0xd3, 0x8b, 0xfa, 0x3c, 0x31, 0xc0, 0x73, 0xde, 0x5c, 0xf7, 0x59, 0x04, 0x57, 0x50, 0x6f, 0xb1, 0xa7, 0xa4, 0x8f, 0x60, 0x0d, 0xfb, 0xa8, 0x39, 0x96, 0x3e, 0x1a, 0x6b, 0x82, 0xa2, +0x74, 0x28, 0x0a, 0xd5, 0x9a, 0x54, 0xfd, 0xf0, 0x1a, 0x14, 0x4d, 0xc2, 0x13, 0x3b, 0x9f, 0x4c, 0xe0, 0x26, 0x05, 0xb2, 0xf8, 0x2a, 0xb1, 0xe1, 0x5d, 0x9d, 0x8f, 0x6f, 0xec, 0x24, 0x4f, 0x9e, 0x03, 0x89, 0x5a, 0x80, 0x56, 0x17, 0xdc, 0xf6, +0xcd, 0x32, 0x70, 0x62, 0xc0, 0x58, 0xa0, 0x2e, 0xc8, 0xef, 0xee, 0xc3, 0xd9, 0x23, 0x47, 0xf9, 0x20, 0x5e, 0xdb, 0x90, 0xe9, 0xb8, 0xe8, 0x0a, 0x71, 0x09, 0x55, 0xa4, 0x00, 0x81, 0xac, 0xe4, 0x5f, 0x65, 0x52, 0x0e, 0x67, 0x06, 0xfa, 0x27, +0x6e, 0x7e, 0xc5, 0xae, 0xf3, 0x1c, 0xd1, 0x08, 0x59, 0x34, 0xd8, 0x2f, 0x6b, 0xca, 0x48, 0x6d, 0xba, 0x3a, 0x53, 0xcf, 0x28, 0x68, 0x0f, 0x1b, 0xfe, 0x69, 0x3c, 0x21, 0x4b, 0x8e, 0x44, 0xc1, 0x37, 0xe3, 0x3f, 0x96, 0xd6, 0x7a, 0x9c, 0x57, +0x2d, 0xf2, 0x3d, 0x0c, 0x72, 0xd4, 0xa5, 0x5c, 0x84, 0x7f, 0xc6, 0x10, 0xe2, 0xdf, 0xa2, 0x54, 0xce, 0xc7, 0xd3, 0xf5, 0xbd, 0x12, 0xf0, 0x63, 0xed, 0xab, 0x7d, 0x97, 0x42, 0x5b, 0xbb, 0x85, 0x73, 0xa8, 0xaf, 0x60, 0x29, 0x93, 0x30, 0x50, +0xdd, 0x6c, 0x45, 0x22, 0xd5, 0x64, 0x8d, 0x6a, 0x92, 0x99, 0x43, 0xe6, 0x1e, 0xb9, 0x88, 0x87, 0x9b, 0xc4, 0x8c, 0xa3, 0x78, 0xd2, 0xf7, 0x07, 0x77, 0x82, 0x1d, 0x15, 0x4e, 0xfb, 0x2c, 0x95, 0xf1, 0xeb, 0x1f, 0xa7, 0x36, 0x25, 0x01, 0x83, +0x66, 0xbe, 0x91, 0x79, 0x8a, 0xe5, 0x0d, 0xa6, 0x2b, 0x0b, 0x35, 0x76, 0x7c, 0xb0, 0xa1, 0x33, 0x41, 0xc9, 0xcc, 0x51, 0x02, 0x7b, 0x11, 0xfd, 0xea, 0xad, 0xb5, 0x46, 0xff, 0xa9, 0xaa, 0xd7, 0xb6, 0x04, 0x38, 0xb4, 0x4a, 0x18, 0x8b, 0x9a, +0xcb, 0xb7, 0xf4, 0x98, 0x3e, 0xd0, 0x75, 0x49, 0x61, 0xde, 0xda, 0xb3, 0x39, 0x94, 0x19, 0xfc, 0x16, 0x74, 0x40, 0x31, 0xbc, 0xe7, 0xbf, 0x86, 0xf1, 0x5f, 0xc2, 0x69, 0xed, 0x1e, 0x8a, 0xb5, 0x40, 0x31, 0x9c, 0xcf, 0x3c, 0x4a, 0x9d, 0x8c, +0x5c, 0xd8, 0x3d, 0x52, 0x79, 0x3e, 0x1f, 0xf4, 0x8e, 0xec, 0x64, 0x00, 0xea, 0x49, 0x6d, 0x3f, 0xfc, 0x38, 0x94, 0x9b, 0x72, 0xca, 0x34, 0xb3, 0x3a, 0x5d, 0x36, 0x29, 0x54, 0xc0, 0x89, 0x1a, 0x20, 0x15, 0x05, 0xa2, 0xa3, 0xb9, 0xdc, 0xb4, +0xe5, 0x12, 0xd9, 0x7d, 0x43, 0x67, 0x6a, 0xc5, 0x85, 0xa5, 0x57, 0xc8, 0x33, 0x10, 0x37, 0x4e, 0x4c, 0xee, 0xa4, 0x09, 0x76, 0x0a, 0x5a, 0x14, 0x13, 0x50, 0x23, 0x0d, 0x2a, 0x65, 0xb7, 0x5b, 0xc3, 0xf5, 0x48, 0xad, 0x2e, 0x42, 0x6f, 0x78, +0x84, 0xdb, 0xae, 0x87, 0xba, 0xf8, 0x98, 0x2d, 0xff, 0xd4, 0x77, 0xcd, 0x44, 0x02, 0xf7, 0x99, 0x4f, 0x60, 0x16, 0x25, 0xdf, 0x0f, 0x07, 0xbe, 0x88, 0x82, 0x6b, 0x0b, 0xf6, 0x1c, 0xa6, 0xeb, 0xac, 0xc6, 0x04, 0xc4, 0xc9, 0x1b, 0xc1, 0x27, +0xd5, 0x2f, 0xce, 0x45, 0xdd, 0x61, 0xe0, 0x9e, 0xd3, 0xe1, 0x7f, 0x9f, 0x01, 0x51, 0x19, 0x21, 0xb2, 0x0c, 0x17, 0x35, 0x93, 0x6e, 0xe4, 0xaf, 0x63, 0x3b, 0x62, 0xbd, 0x5e, 0xf2, 0x55, 0xa9, 0x59, 0xb6, 0xf9, 0xe2, 0x1d, 0xf0, 0xd6, 0xbb, +0x86, 0x53, 0x70, 0x41, 0x7a, 0xb1, 0xb8, 0x83, 0x0e, 0xd7, 0xfb, 0x39, 0xe6, 0x73, 0x7c, 0x8b, 0xaa, 0x80, 0x32, 0x7b, 0xe8, 0xbc, 0xfe, 0x71, 0x91, 0x56, 0xfd, 0xef, 0x4b, 0x03, 0x74, 0x97, 0x06, 0x47, 0x28, 0x4d, 0xa1, 0xd1, 0xd0, 0xde, +0x90, 0x2b, 0xa7, 0x58, 0xc7, 0x46, 0x96, 0x92, 0xd2, 0x24, 0x30, 0x8d, 0xab, 0x22, 0x75, 0x68, 0x81, 0x18, 0xe3, 0xbf, 0xf3, 0xe7, 0x6c, 0xcc, 0x11, 0x2c, 0xfa, 0x08, 0x95, 0xcb, 0xe9, 0x7e, 0x8f, 0xda, 0x9a, 0xa0, 0x26, 0x66, 0xa8, 0xb0, +0x24, 0xe8, 0x37, 0x99, 0x04, 0x4c, 0xdc, 0xdf, 0x49, 0x1a, 0x82, 0x3d, 0xab, 0x65, 0x4b, 0xc4, 0x3b, 0xc8, 0x94, 0x20, 0xcd, 0xea, 0xaf, 0x68, 0xd2, 0x26, 0xf7, 0xe6, 0xdb, 0x92, 0xf6, 0x3e, 0x45, 0x52, 0x38, 0x4f, 0xda, 0x73, 0x7f, 0x21, +0x07, 0x19, 0xd5, 0x72, 0x84, 0x9c, 0x5b, 0x7e, 0x6b, 0x55, 0x7a, 0x5e, 0xd6, 0xeb, 0xb1, 0xbd, 0xf3, 0x9b, 0xa2, 0xaa, 0x69, 0x13, 0x79, 0x43, 0x87, 0x5c, 0x3c, 0x23, 0x42, 0x5f, 0x5a, 0xbb, 0xb9, 0x7d, 0x95, 0x3f, 0xde, 0x53, 0xd8, 0xcc, +0xd7, 0x44, 0xe3, 0xe4, 0x4a, 0xec, 0x96, 0x2b, 0x9e, 0x0f, 0xb0, 0x08, 0x64, 0xfd, 0xb4, 0xa4, 0xef, 0x80, 0x76, 0xb7, 0x33, 0xd1, 0xd0, 0xd4, 0x71, 0x5d, 0x70, 0x12, 0x6e, 0x1e, 0x9a, 0x2d, 0xfb, 0x66, 0x89, 0x62, 0xbf, 0x40, 0x61, 0x15, +0x8a, 0x29, 0xa3, 0x9f, 0x01, 0x14, 0x22, 0x63, 0x00, 0x58, 0x78, 0xae, 0x50, 0xf8, 0x31, 0x77, 0x8b, 0x56, 0xe7, 0xfc, 0x34, 0x81, 0x54, 0x09, 0x0b, 0x74, 0x05, 0xa9, 0x11, 0x3a, 0x2c, 0xcb, 0x18, 0x75, 0x85, 0xcf, 0xc5, 0x60, 0x35, 0x1c, +0x2e, 0x4d, 0xb2, 0x0c, 0x16, 0x59, 0x98, 0xce, 0x0e, 0xee, 0x48, 0x7c, 0x57, 0xe5, 0xfa, 0xed, 0x91, 0x6c, 0x8c, 0xf4, 0xf9, 0x10, 0xd3, 0x90, 0xe2, 0xca, 0x17, 0x2f, 0xfe, 0x1b, 0x32, 0xf1, 0x8d, 0x06, 0xb8, 0x36, 0x28, 0x2a, 0xc3, 0xba, +0xa1, 0x7b, 0xad, 0xc7, 0xe1, 0x9d, 0xb6, 0x86, 0x8e, 0x83, 0xc2, 0xbc, 0x46, 0xd9, 0xf5, 0x1d, 0x93, 0x41, 0x51, 0x8f, 0xff, 0xc6, 0x02, 0xa0, 0x6f, 0x6a, 0xc1, 0xf0, 0x4e, 0x03, 0xc9, 0xc0, 0xbe, 0x67, 0xa8, 0xf2, 0xa6, 0xb5, 0x47, 0x97, +0xb3, 0x88, 0x25, 0xe0, 0xa5, 0xe9, 0x0d, 0x6d, 0x27, 0xa7, 0xac, 0x39, 0x30, 0x1f, 0xdd, 0x0a, ] +d0x6a0a4b20=[ 0xa804db29, 0x918a1495, 0x1a4cac4c, 0xa7169872, 0x05da70b2, 0xf03bc962, 0x5f000dae, 0x4096d150, 0x96b50b70, 0x0f12435b, 0x2c920405, 0x8cf9a73c, 0xdca9cd67, 0xd48491d9, 0x2bef3f4e, 0x18a9c31b, 0xc4000e7c, 0xbd5a343e, 0xd931997b, 0x151ccbb9, +0x94506427, 0x086f7810, 0xefad159c, 0xaf79e062, 0x1f96dcfe, 0x99a7482b, 0x0df72c0c, 0x17bb8040, 0x699c8149, 0xc1985a60, 0x1d73b3a9, 0x10849fa5, 0xa0298797, 0x6316960e, 0x47a9ceb5, 0x1d319707, 0x84d4fb82, 0x2e776b52, 0x21270ca7, 0x52b5050c, +0x4a5ee2b9, 0x587d36e5, 0x0598541c, 0x6ea39eac, 0xd11cc5c5, 0x073f1fe5, 0x36dea849, 0xf81695dc, 0xf854b172, 0x31a39302, 0x24fd7c15, 0x00000000, 0x8cbb8392, 0x642989eb, 0x3b6ba0eb, 0x8961f320, 0xbffd7fc7, 0xf704d687, 0xc6a74585, 0x155eef17, +0x6c04d555, 0x932d5f6c, 0xcc2d52c2, 0xde4ca230, 0xe5652675, 0x76487919, 0x9b0003d2, 0x61b1ddf7, 0x398ecfbc, 0x5a9859b2, 0x290a5019, 0x6354b2a0, 0x3b298445, 0xd661fe8e, 0x9c7d3899, 0x2e354ffc, 0x9b42277c, 0xd973bdd5, 0xdb96d282, 0xcc6f766c, +0xc6e5612b, 0x73d02d05, 0xb5354c2e, 0x810e8b30, 0x7bbf5515, 0xcb506989, 0x02a74bf9, 0x1a0e88e2, 0x4d61fd5c, 0x96f72fde, 0xb8c26022, 0x450e854c, 0xf2dea635, 0xdbd4f62c, 0xaaa390d0, 0x6c46f1fb, 0xc9b506de, 0x94124089, 0x5f422900, 0x265a37ec, +0x9eda7360, 0x795a3a42, 0x4a1cc617, 0xed0a5e65, 0x69dea5e7, 0xa5b1d38b, 0x8bc6b8d9, 0xe7c26d8c, 0x077d3b4b, 0x004224ae, 0x4f84920b, 0xcec83d95, 0xc9f72270, 0xd623da20, 0xa06ba339, 0x3304d8fb, 0xb79207d7, 0x739209ab, 0xf5a39d7e, 0x83ebe467, +0xe25a3990, 0x31e1b7ac, 0xbd181090, 0xaddeab9b, 0x52f721a2, 0xfd8ec1c0, 0x50124ef5, 0x3c54bf0e, 0xff6bae97, 0x5de562f9, 0xa846ff87, 0x8e5eecc5, 0xf29c829b, 0x1223d45c, 0xf746f229, 0xb0ef3c9c, 0x3479e3b0, 0x6b79ee1e, 0x572d5110, 0xd3f9aa92, +0xce8a193b, 0xa5f3f725, 0x0db508a2, 0x6ee1ba02, 0x48f9a940, 0x3c169ba0, 0x10c6bb0b, 0x26181342, 0xcb124d27, 0x7c804af0, 0x7bfd71bb, 0x99e56c85, 0xe7804922, 0x7cc26e5e, 0x9c3f1c37, 0x74ef32e0, 0xa754bcdc, 0xe0bf56c7, 0x3eb1d059, 0x0f5067f5, +0xba652bdb, 0x668ec212, 0x91c8303b, 0x7e270109, 0xde0e869e, 0xb880448c, 0xaf3bc4cc, 0x936f7bc2, 0x814caf9e, 0x3ef3f4f7, 0x5da74657, 0xc37d3537, 0xf079edcc, 0xfaf3fa8b, 0xc33f1199, 0xaae1b47e, 0x50506a5b, 0xb0ad1832, 0x8e1cc86b, 0xfab1de25, +0xe52702db, 0x1fd4f850, 0xf5e1b9d0, 0x0a8a1747, 0xbfbf5b69, 0x18ebe7b5, 0x83a9c0c9, 0x4273be07, 0x39cceb12, 0xba270f75, 0x717766fc, 0xd15ee16b, 0x294874b7, 0x343bc71e, 0x863194d5, 0x2380475e, 0xff298a39, 0x760a5db7, 0xad9c8f35, 0x17f9a4ee, +0x74ad164e, 0xdcebe9c9, 0xfdcce56e, 0x583f124b, 0x9e9857ce, 0xed487acb, 0xd3bb8e3c, 0x47ebea1b, 0x5ada7d1c, 0xa2cce8c0, 0x61f3f959, 0x3346fc55, 0x8b849c77, 0x55c83e47, 0x42319aa9, 0xe0fd7269, 0x2bad1be0, 0x082d5cbe, 0xb20a53cb, 0x8673b07b, +0x369c8ce7, 0x6b3bcab0, 0x0ac833e9, 0xd4c6b577, 0x79181eec, 0x40d4f5fe, 0x4d23d9f2, 0x24bf58bb, 0x1261f0f2, 0x48bb8dee, 0x576f75be, 0x66cce6bc, 0xb7d02379, 0x23c263f0, 0xb5776880, 0x454ca1e2, 0xc4422ad2, 0x02e56f57, 0x558a1ae9, 0xa28ecc6e, +0x2cd020ab, 0x71354252, 0xe8920a79, 0x8923d78e, 0xe2181d3e, 0xe8d02ed7, 0x4fc6b6a5, 0x8496df2c, 0xc1da7ece, 0xea354180, 0xb2487765, 0xea77652e, 0x21652809, 0x646bad45, 0x7e6525a7, 0xefef3132, 0xff7dbb80, 0x08260948, 0xd523421e, 0x185a6915, +0x146fee38, 0x23f370ef, 0x0a77477d, 0xfef63bb9, 0x56bb6181, 0xac5ed45d, 0xdedf855a, 0x9bc24a8a, 0xfd2cf5b5, 0x46c701dc, 0x6376b163, 0x797d9643, 0x52a8efe4, 0x018b8039, 0x4ee10894, 0x5a8ee6ac, 0x266b7eb3, 0xa06b5370, 0xb58f3d71, 0x48a3c8c4, +0x5e9d68c9, 0x6d12787b, 0x86002dc3, 0xd89d450a, 0xb655f37d, 0x3ba919fa, 0x97f7cda7, 0xd6f98c12, 0x942d03ab, 0x688a7627, 0xe3345cf0, 0xc0c72c1f, 0xa478dd15, 0x95a68392, 0xa9c6da01, 0x5ccc26fc, 0x66eebf3f, 0x474c81e5, 0x3c605993, 0xb017332d, +0xe727d295, 0x91b50df7, 0x492848fd, 0x7d6e1826, 0x4d3bc698, 0x8fada4b2, 0x2bd579a7, 0x2c1c39ce, 0xdc8ecb6f, 0x7ce5981f, 0x36171eee, 0x0fef4921, 0xdf540563, 0xc685ec4f, 0x60ac7f6f, 0x44964fe9, 0x1c49e770, 0x878badfa, 0xe8c89bb4, 0x845163f6, +0xbe73fa35, 0x6127ff56, 0x0642c050, 0xe6ac52ac, 0x17b52034, 0x8dfcea87, 0xe16512c5, 0xf2c3bc94, 0x67653f06, 0x7692df62, 0x903e8dce, 0xf3483cad, 0x3a2299c3, 0x42d48fb9, 0x1f93297c, 0x5f16e8f0, 0x0c35872d, 0x6b50b82b, 0x78f6167a, 0xe0ee92fc, +0x926fc3fb, 0x9e5a44d6, 0xbff87a0c, 0x2fc6f7c2, 0xa23a1d45, 0xdd054b56, 0x6c99f842, 0x11f7e064, 0x27e0fe8a, 0x39f857cf, 0xecdb15d1, 0x4f6a88ad, 0x435f0f80, 0x4af286f1, 0xbbebf469, 0x93e443c2, 0xd916c533, 0x4cb046a1, 0xb19cb314, 0xf50afcfd, +0xb7de7344, 0xcea3e507, 0x8398239f, 0x1a0b2720, 0xee8a5be4, 0x6adb3812, 0x72815107, 0x54ea2fb4, 0xdacc0b3f, 0x81c96daa, 0xa7a21319, 0xaa1c140d, 0x7f3f5613, 0x0bfcc744, 0xfca7758c, 0x451dcfd0, 0xf1197298, 0x00000000, 0x107c605d, 0x70d01f32, +0x89ef64e2, 0x2278f0d6, 0x3debd9aa, 0xef01dbdd, 0x53236fdd, 0xcf28653e, 0x715b9f0b, 0xbda93439, 0x07c94069, 0xeb1255b8, 0x15e46e01, 0xcd792b0b, 0x98188486, 0x58dfa899, 0xa1e0d349, 0x338f10b2, 0xd361824e, 0x379c9ed7, 0xb9baba5c, 0xc70e6c76, +0xab979434, 0xc4d4a27a, 0x4b7906c8, 0x13a6ae51, 0xf93f7bd0, 0xae0f9a68, 0x85dae3cf, 0x09ad8971, 0xf092f2a1, 0x9a49cab3, 0x25b1b0bf, 0x6901f61e, 0xf4817cc4, 0x9d808ada, 0xc8e12557, 0xc31de213, 0x02514e35, 0x5d47a6c5, 0xb404bd48, 0x04138e65, +0x9fd1c4ef, 0x35cdd0e2, 0x3055debe, 0xea99d581, 0x122d2e68, 0xadd55464, 0x21a23eda, 0x1e18a945, 0x7548116e, 0x05980e5c, 0x74c39157, 0x517221e8, 0xf75bb2c8, 0x3873d7f6, 0x730ad13e, 0x64bff10a, 0x8864e4db, 0x7b2cd876, 0xb2467d18, 0xb3cdfd21, +0xd2ea0277, 0x7eb4d62a, 0xe2bfdcc9, 0x3204908b, 0xf8b4fbe9, 0x2e4d77fb, 0x77195f5b, 0x8e26248b, 0x29843792, 0x5b056695, 0x6f43364e, 0x5561af8d, 0x50f9a1d1, 0x163ea00d, 0xc96aa56e, 0x9c0b0ae3, 0xccf2ab32, 0xd7720c2b, 0xe5769ca0, 0xd0bb4c42, +0xf6d032f1, 0x410e41b5, 0xe9431b8d, 0x280fb7ab, 0xa3b19d7c, 0x2d97b9f7, 0x344650db, 0x3e3117a6, 0x967c4d9e, 0xba607450, 0x2a5ef99e, 0xc14cac26, 0xc296622a, 0x1b80a719, 0x0dbe0714, 0x2029bee3, 0xcb3beb5b, 0xbc22b400, 0x8a35aaee, 0x62fd315a, +0x8c776abe, 0xc55f2243, 0x31de5e87, 0xcab06b62, 0x999304bf, 0x7aa7584f, 0x03dace0c, 0xa6299320, 0xaf841a51, 0xd4a8c227, 0xe4fd1c99, 0x595428a0, 0x65347133, 0x19d1e92c, 0x5730e1b8, 0x0e64c918, 0xdb478b06, 0xa84d5a38, 0xfb6e35e5, 0xd130cc7b, +0x6ec8b677, 0xed5095e8, 0x3fba979f, 0xb8313a65, 0x8bbe2ad7, 0xfae5b5dc, 0x8042ed93, 0x1dc26749, 0x4085c18c, 0xa5f35d2c, 0x8213a3a6, 0x243a3086, 0xf3d14903, 0x914f30c4, 0xe1c4173b, 0xa36c0c3c, 0x14ebbb50, 0xff7ba947, 0x4df7f68f, 0xee9bfab3, +0xd8447421, 0xe3c64039, 0x9aec6f26, 0xe73af253, 0xe0334df5, 0x88f9311e, 0xc3f022f9, 0x9444d860, 0x514a1ff1, 0x97b1d5ac, 0x1f48e4b2, 0xb585e06e, 0x5c17a57b, 0x57b4fa99, 0x36df8e92, 0xa29b56f2, 0x95b382ae, 0x7adf22d3, 0x7dd69d75, 0x31d63134, +0x5ae94013, 0x86518658, 0x74779595, 0xe2311af7, 0x8453d15a, 0x52bf123d, 0x0ba35fe2, 0xdbb179ed, 0x50bd453f, 0xb670eda2, 0xccafcf71, 0x6597c661, 0x8ff08eb8, 0x8afb661c, 0xb08e08ca, 0x64609caf, 0xc4f99d5f, 0xfb871b2d, 0x24cad0aa, 0x40aa4c05, +0x6ac82be9, 0xd6ecc367, 0x2d6bd84a, 0xe8651fdb, 0x0d5dba8a, 0xa8cf53de, 0xbb2d5728, 0x9de5d080, 0x34ddd990, 0xc50ec791, 0x3a756ed6, 0x9e10dd4c, 0xe4cfff9f, 0xcba670d7, 0x4c00ac41, 0xa9380910, 0xb1795204, 0xda462323, 0x02025702, 0x7675c297, +0x8c058374, 0xa09901f0, 0x6662cbad, 0x2e9ed586, 0x29976a20, 0xe9924515, 0x253d8a64, 0x4afe4929, 0x835a6efc, 0xd012260f, 0x708b27ff, 0x0f5fed88, 0xf22613cd, 0xc2077837, 0x82ad3432, 0x591c4ddf, 0xbe26bf8c, 0x06fee568, 0xa592e954, 0xf1d31e01, +0xbada0de6, 0xfd79fe45, 0xef6ca07d, 0xfe8cf389, 0x92ba3d08, 0x629e79c7, 0x4654a96d, 0xac33e1b4, 0x0a54052c, 0x490b44e5, 0x1d4ab3b0, 0xb37b0506, 0x18415b14, 0xf9854c2f, 0x0856522e, 0xca512a19, 0x0709bfa6, 0x47a3f3a3, 0xc6fbca5d, 0x42a81b07, +0x890e6bd0, 0xe538a551, 0x387739d4, 0x6e349983, 0x33d46636, 0x23c36f0c, 0x48fc1e2b, 0xd3e72bc3, 0x792a2f1f, 0xaacd04dc, 0xcead9873, 0x80af6330, 0xb92f002a, 0x09a108e0, 0x12155e38, 0x5b1e1add, 0x5441f755, 0x19b601da, 0xbfd1e542, 0x67959163, +0xe6cda89d, 0xadc4bb7a, 0xdcb8c64b, 0x3c8b8bbe, 0x45a1a4a1, 0x1017093a, 0x050be8a4, 0x8e07d476, 0x9fe78782, 0xf87216e1, 0x21c1380e, 0x4456fe6f, 0xbc24e88e, 0x9b1b35e8, 0x85a48b94, 0x934d67c6, 0xd9b32eef, 0x00000000, 0x98ee3824, 0x2c9c8284, +0x78dd75d1, 0xc1f275fb, 0x5de0ffb5, 0xafc6ec78, 0x7fd4ca77, 0xf52fac6b, 0x7e2390b9, 0x534848f3, 0x286030ee, 0x4e02fb43, 0xf4d8f6a5, 0xfc8ea48b, 0x3d7cd170, 0x4ff5a18d, 0x87a6dc96, 0xf02444cf, 0xd4ee9465, 0x7580cf5b, 0x9c128a4e, 0xc0052f35, +0x815839fe, 0x5e15f279, 0x63692309, 0xc8537d1b, 0x11e053f4, 0x32233cf8, 0x415d16cb, 0x1a430c16, 0xdeba9149, 0xf6daa1a7, 0x737e2a33, 0x728970fd, 0x616b740b, 0x171eb69c, 0x6c36ce81, 0x58eb1711, 0xc70c9093, 0xfa7041e3, 0xa16e5b3e, 0xab3a5e12, +0xae31b6b6, 0x693d2625, 0x6b3f7127, 0xec99adb1, 0xd71b99a9, 0xd519ceab, 0xb787b76c, 0x6fc3c34d, 0x223435c2, 0x6dc1944f, 0x3b823418, 0x01f75ace, 0xcd5895bf, 0x3980631a, 0x68ca7ceb, 0x435f41c9, 0xbdd3b240, 0x273fdd66, 0x90b86a0a, 0x03f50dcc, +0xdf4dcb87, 0x203662c0, 0xb472baa0, 0x16e9ec52, 0x5fe2a8b7, 0x96468f62, 0x26c887a8, 0x55b6ad9b, 0x717c7d31, 0x1bb456d8, 0xa667e498, 0x2f698f48, 0x1cbde97e, 0xeb901217, 0x13e204f6, 0x04fcb26a, 0xa790be56, 0x30216bfa, 0x352a835e, 0xc9a427d5, +0x1ebfbe7c, 0x3f7e8672, 0x77829859, 0x4b0913e7, 0x3728d45c, 0x8df2d9ba, 0x7b28781d, 0x151ce19e, 0xd210710d, 0x2b953d22, 0xa465b39a, 0xdd4f9c85, 0x2a6267ec, 0x991962ea, 0x7c21c7bb, 0x5643a057, 0x0caae044, 0x3e89dcbc, 0x0ea8b746, 0xb8d85ae4, +0xed6ef77f, 0xea6748d9, 0xb28c5fc8, 0x609c2ec5, 0x8b0c3cd2, 0xf72dfb69, 0xcf5ac2bd, 0xd1e57cc1, 0x46208aef, 0xb4628e4c, 0xc596a1bb, 0xf471e438, 0x02f69c7b, 0x94da63bd, 0x92e98326, 0x0278838f, 0x190e36ed, 0xc7603dc0, 0x0633e09b, 0xb87873c7, +0x375abaec, 0x661678ea, 0x6a0c8561, 0xdc1688a2, 0x98c09e36, 0x833834a0, 0x81cea8db, 0x4e711470, 0xfed6e6dc, 0x0eec61f0, 0x5993436d, 0x7f9651f3, 0xc3a54120, 0xe934b1c1, 0x044b6314, 0xfa139a3c, 0x0aa702e4, 0x3311d9f8, 0x48cceb1f, 0x0e627e04, +0xcf31a35f, 0xb029ed58, 0x9c05e2d6, 0xf86b19b3, 0xba8eefbc, 0x31e74583, 0x5fa0a3f6, 0x1dcb4a0d, 0x5dd82079, 0xb2df7123, 0x115fa872, 0x39b6db1c, 0x20b8edf1, 0x159ad492, 0x3938c4e8, 0x2eda93f5, 0xaf143b2e, 0xd2fae952, 0xa5b339ca, 0x1f3dd676, +0x11d1b786, 0xf03a872c, 0x984e81c2, 0xb8f66c33, 0xedf1cd21, 0x94547c49, 0xe1eb30aa, 0x0c1afd8b, 0xa53d263e, 0xc98c5c30, 0x7b532d13, 0xa176452a, 0x35ac2697, 0x577f229d, 0x35223963, 0x899f3644, 0xdee014d9, 0x4a3a7764, 0x6a829a95, 0x909100a9, +0x77c7cf6c, 0x591d5c99, 0xc1ddc2af, 0x17e2571d, 0x5589bee6, 0x5bebc0e2, 0xa380d951, 0xb2516ed7, 0xe393b325, 0x2e548c01, 0x3f853b87, 0xaf9a24da, 0x339fc60c, 0x8d5a4aa4, 0xf24204a3, 0x28e9736e, 0x625d1bfe, 0x00000000, 0x4842f4eb, 0x4c0997ff, +0x9e7d6159, 0xe31dacd1, 0xd4c909c9, 0x877357b4, 0x1514cb66, 0xd6b18a46, 0x1d4555f9, 0xe5a053be, 0x87fd4840, 0x6cb17a0e, 0x2a1fef15, 0x5f2ebc02, 0xcbf4dfbf, 0x514cc206, 0xb4ec91b8, 0x8dd45550, 0x1b76b562, 0xe756cfc5, 0x37d4a518, 0x3f0b2473, +0x42e5f60f, 0x891129b0, 0xfc207aa7, 0xf8e50647, 0x5b65df16, 0x19802919, 0xc7ee2234, 0x7302b38c, 0x1fb3c982, 0x2c2c0f8e, 0x46ae951b, 0x9ab81db9, 0xc32b5ed4, 0x2605129e, 0xba00f048, 0x7749d098, 0xef894eae, 0xd0826add, 0x4ab46890, 0xf2cc1b57, +0xcb7ac04b, 0x64e0e491, 0x44d61694, 0xa745a5b1, 0xa7cbba45, 0x60259871, 0xde6e0b2d, 0xe52e4c4a, 0x6c3f65fa, 0x2036f205, 0xbec58ca8, 0x92679cd2, 0x7f184e07, 0xf4fffbcc, 0x717a3003, 0xf6877843, 0x4c87880b, 0xc153dd5b, 0x57f13d69, 0x850bd43b, +0x53ba5e7d, 0xe1652f5e, 0x176c48e9, 0xab5f583a, 0x008e1ff4, 0xa1f85ade, 0x83b62b54, 0x51c2ddf2, 0x7deed27c, 0x8be7b5cb, 0x9ef37ead, 0x28676c9a, 0xcfbfbcab, 0x75bf4ce3, 0x687406ee, 0x646efb65, 0x04c57ce0, 0xf0b498d8, 0x22c06e7e, 0x79a5b168, +0x8140b72f, 0x8b69aa3f, 0xdaab77cd, 0x3bce5893, 0x7d60cd88, 0x06bdff6f, 0x8585cbcf, 0x75315317, 0xd274f6a6, 0x5d563f8d, 0xdc989756, 0x62d3040a, 0xb0a7f2ac, 0xeb4c324e, 0x2ca2107a, 0x6698671e, 0x426be9fb, 0x24f38ee5, 0x44580960, 0xc90243c4, +0xbe4b935c, 0xd447163d, 0x962cffc6, 0xabd147ce, 0xd63f95b2, 0x13a93409, 0x3d73a7fc, 0xed7fd2d5, 0x8facd6df, 0x4eff0b84, 0x0a291d10, 0x224e718a, 0x247d9111, 0x2a91f0e1, 0x8f22c92b, 0xad6cb8a1, 0x31695a77, 0x40136a74, 0x3dfdb808, 0x6ec9f981, +0xa927dbb5, 0x68fa191a, 0x3b404767, 0x08519e9f, 0x71f42ff7, 0xef07515a, 0xfcae6553, 0xd85debb6, 0x08df816b, 0xd00c7529, 0x13272bfd, 0xfe58f928, 0x6e47e675, 0xcdc73f24, 0x7bdd32e7, 0x60ab8785, 0x409d7580, 0x5507a112, 0x96a2e032, 0xf60967b7, +0xb6941237, 0x738cac78, 0xd8d3f442, 0xbc3310d3, 0xade2a755, 0xda256839, 0x9a36024d, 0xbcbd0f27, 0xcd4920d0, 0x9c8bfd22, 0xb61a0dc3, 0xe9baae35, 0xa9a9c441, 0xe7d8d031, 0x53344189, 0x268b0d6a, 0x1bf8aa96, 0xc518be4f, 0x901f1f5d, 0x0c94e27f, +0x792bae9c, 0xfa9d85c8, 0xa30ec6a5, 0xebc22dba, 0xca3eb250, 0x2c2729c9, 0x967f7bd0, 0x9dec3a45, 0x838504e9, 0x0a763e75, 0xafa22d20, 0x673b3562, 0x8ab1ef6e, 0xc232a836, 0xed57540d, 0xadd80933, 0xcb0643b1, 0xd4578cfc, 0x1c131abf, 0x496638b8, +0xb289c67e, 0x56ea79f4, 0x43cd88cc, 0x1f8c414c, 0x721cc45a, 0x5f031c72, 0xc9a1e9a3, 0x32939964, 0x324e1765, 0xb3b1379f, 0x8a6c616f, 0x14c28ed8, 0x00000000, 0xe4be318b, 0x96a2f5d1, 0xe6c41598, 0xc1707dc4, 0xe7216a78, 0x979a0430, 0x027a2413, +0x38382910, 0x5da4b660, 0x039f5bf3, 0x49bbb6b9, 0x4228f72c, 0x1527f138, 0x5fde9273, 0x268c99bd, 0xdf194368, 0x71839fa9, 0xdfc4cd69, 0xdc86189b, 0x54905de7, 0xe7fce479, 0xc97c67a2, 0x15fa7f39, 0xc2ef2637, 0xb36cb99e, 0x4a24ed4a, 0x570f0614, +0x6603c483, 0x08d19467, 0xb91a87eb, 0xf94854d4, 0x5ee66392, 0x080c1a66, 0xae9adcc1, 0xc30a59d7, 0xe6199b99, 0x41b7acdf, 0x2cfaa7c8, 0xba85dc18, 0xb1cb138c, 0xae4752c0, 0x431006cd, 0x3900d8f1, 0x94d8d1c2, 0x4bc192aa, 0x6d908516, 0xf0a13152, +0x78b7742e, 0x39dd56f0, 0xd5b2f31c, 0x5c9c4781, 0x25ce4c4f, 0x16b8aacb, 0xc0488c25, 0xa64b48a6, 0xfa0a8126, 0x82607b09, 0xba585219, 0xbbbd2df9, 0x3ba772e3, 0x55a8ac06, 0x48834758, 0x8b891e8f, 0x0aabb074, 0x659c9f70, 0x0b934195, 0x7066e049, +0x7a10de3c, 0x94055fc3, 0x24f6bdae, 0xfad70f27, 0xc1adf3c5, 0x6ca874f7, 0x2769e65d, 0x9f4b9057, 0x30e9bd77, 0x57d28815, 0x1f51cf4d, 0x0342d5f2, 0x801a5f1a, 0xd62da8ef, 0x6e0fdee5, 0x2dc25629, 0x3376e684, 0x408f5d3e, 0xb8fff80b, 0xef2d701e, +0x485ec959, 0xa4ece2b4, 0x65411171, 0xf1444eb2, 0x5d793861, 0x9c0945a5, 0xec6fa5ec, 0xdd63677b, 0x8b54908e, 0x17805b2a, 0x6479e090, 0x73f9bbba, 0x6c75faf6, 0x55752207, 0x7acd503d, 0x732435bb, 0x798f85cf, 0x892eb49d, 0xb9c709ea, 0xa7ae3746, +0x6f372f04, 0x4af9634b, 0x8816457c, 0x9e7361b6, 0xd715590e, 0xf33e6aa1, 0x166524ca, 0x38e5a711, 0xb1169d8d, 0xf870a535, 0x141f00d9, 0x2fb8723a, 0xf2db1541, 0x175dd52b, 0xed8ada0c, 0x1e693eac, 0x09e96586, 0x79520bce, 0x7bf5a1dc, 0x0138f1e1, +0x5637f7f5, 0x88cbcb7d, 0x1df6655f, 0x3a420d03, 0xaf7fa321, 0x9f961e56, 0x6feaa105, 0xcae33c51, 0x2d1fd828, 0x80c7d11b, 0xa5099d54, 0xb02e6c6c, 0x310cc297, 0xe55b4e6b, 0xc8991842, 0xc3d7d7d6, 0xa4316cb5, 0xf07cbf53, 0xa5d41355, 0x70bb6e48, +0x2f65fc3b, 0x953dae22, 0x0b4ecf94, 0xf3e3e4a0, 0xf2069b40, 0x4052d33f, 0x67e6bb63, 0x9d31b444, 0x66de4a82, 0xf199c0b3, 0x4b1c1cab, 0xc0950224, 0x544dd3e6, 0x786afa2f, 0x0934eb87, 0xfb3270c7, 0xd56f7d1d, 0x1cce94be, 0xb0f3e26d, 0xeff0fe1f, +0x64a46e91, 0x3b7afce2, 0x72c14a5b, 0xa773b947, 0x3a9f8302, 0xac3d76d3, 0xd7c8d70f, 0xe463bf8a, 0xc8449643, 0xddbee97a, 0x6ed250e4, 0x416a22de, 0x242b33af, 0xfbeffec6, 0xa696c6a7, 0xeec80ffe, 0x2e5d0dda, 0xad058732, 0x02a7aa12, 0xe586c06a, +0x8122aefb, 0x6d4d0b17, 0xb254487f, 0x97478a31, 0x1eb4b0ad, 0x9eaeefb7, 0xd48a02fd, 0x715e11a8, 0xf8ad2b34, 0x01e57fe0, 0xb822760a, 0xdc5b969a, 0x83588ae8, 0xecb22bed, 0x2e8083db, 0xdefc3c88, 0xee1581ff, 0xd6f026ee, 0x42f5792d, 0x5c41c980, +0x5e3bed93, 0x1d2beb5e, 0x9cd4cba4, 0x7b282fdd, 0xbb60a3f8, 0x2513c24e, 0x89f33a9c, 0x00dd8e01, 0x31d14c96, 0x81ff20fa, 0x95e02023, 0xcbdbcdb0, 0x27b4685c, 0xde21b289, 0x30343376, 0x82bdf508, 0x265117bc, 0xace0f8d2, 0xf995dad5, 0x33ab6885, +0x93ce9391, 0x6d9853b2, 0x8663a170, 0xc1e76f8a, 0xc8c22ab0, 0x4de1359d, 0xc27594db, 0x99ab68f6, 0x2aced844, 0xed70c395, 0x157f77ed, 0x51694246, 0x2c45e913, 0x4d337091, 0xbf593f8e, 0x9597e7ca, 0x51bb074a, 0xd876d257, 0xe71538f2, 0x9f2059a1, +0x4ea18bc0, 0xfe84852f, 0xcd09a5ba, 0xaa264863, 0x7d2cab55, 0x67fda8d5, 0xfe56c023, 0xbccbc4df, 0xe8bb4c9f, 0x9545a2c6, 0xb9d20ed9, 0xd153976d, 0x26f25778, 0x71c26165, 0x1c5a32d7, 0xfb4f0a25, 0x335f6599, 0xf4333b44, 0x7e6c1508, 0x41ddbaa1, +0xba40f588, 0x05cb8f0a, 0x7dfeee59, 0x163fc9b0, 0x2c97ac1f, 0xb53cc4e9, 0x8c065a17, 0x5ec7362b, 0xc4fea58c, 0x99792dfa, 0xfdc43b72, 0xa9b4b332, 0x0a65fb67, 0x13f446ba, 0x1066bdeb, 0x16ed8cbc, 0x9ff21cad, 0x298e6619, 0xacad7934, 0x54a2cd4c, +0x3694ea93, 0xdbe42906, 0x0392fb51, 0x1c8877db, 0x71102469, 0xd70ae336, 0xe2deb7f8, 0xce491be7, 0x85f15a21, 0x48f8ff9b, 0xfb9d4f29, 0xde2fa60c, 0xeee238c4, 0x0c3c8f3c, 0x9c60e7fc, 0xeb29b7ce, 0x4bb841c6, 0xe8690993, 0x96d75997, 0x23eb9d7e, +0xf26a4f1f, 0x4784cefa, 0x908e2dcc, 0x26201274, 0x78356153, 0x8a5f2e4c, 0x905c68c0, 0xf1f8b44e, 0xbf8b7a82, 0xafedc769, 0x15ad32e1, 0x89cdd51d, 0xe14c4ca9, 0x64bd1688, 0xcb8294ed, 0x3c2354f8, 0x78e7245f, 0x301fdbc4, 0xaf3f8265, 0xdefde300, +0x5229fc1b, 0xb67c7ab4, 0xa043b304, 0x80e89027, 0xf12af142, 0x4e73cecc, 0xf7738519, 0x2f05574e, 0x2a1c9d48, 0xe7c77dfe, 0xa3030d59, 0x0ceeca30, 0xe487c3a3, 0xd4981867, 0x410fffad, 0x85231f2d, 0xcddbe0b6, 0x6ed8edef, 0xb9004bd5, 0x7ba79a02, +0x393a9efe, 0x688199b4, 0x7b75df0e, 0x0519ca06, 0x62e462d3, 0x5bdefc2d, 0x35d454ce, 0xe19e09a5, 0x57e27311, 0x6e0aa8e3, 0xc76c5edd, 0x584c077c, 0x0340be5d, 0x5e157327, 0xa091f608, 0x83a82e7a, 0xb0250eef, 0x2339d872, 0xee307dc8, 0x931cd69d, +0xd2c16c3c, 0x1943f8d1, 0x7282df38, 0x30cd9ec8, 0xf2b80a13, 0xbc1981d3, 0x0fae746d, 0xf4e17e48, 0x338d2095, 0xa61ac75f, 0x803ad52b, 0x39e8dbf2, 0xd2132930, 0xdd6f1851, 0x6bc127e9, 0x9cb2a2f0, 0xd7d8a63a, 0x8cd41f1b, 0x61a4dc8e, 0x5d55cd7a, +0x25b2e925, 0x8f94a146, 0xebfbf2c2, 0x00d2450c, 0xa5883c0e, 0x7ebe5004, 0xd44a5d6b, 0x74dbab63, 0xc8106fbc, 0xe20cf2f4, 0x2fd71242, 0x1a03468c, 0x8a8d6b40, 0xa3d14855, 0xe45586af, 0x3646af9f, 0x429d04fc, 0xc2a7d1d7, 0xeda28699, 0x779b153e, +0x3aa865af, 0x6853dcb8, 0xb0f74be3, 0x646f5384, 0x5d878876, 0xd8a4975b, 0xa6c88253, 0x8f46e44a, 0x132603b6, 0xc42ce080, 0x7409ee6f, 0x0659745b, 0xac7f3c38, 0x10b4f8e7, 0x837a6b76, 0xcb50d1e1, 0x4b6a04ca, 0xf80fb478, 0xd181d261, 0x1ad10380, +0x3a7a20a3, 0x295c2315, 0xb3b7f5be, 0x0925453a, 0xa966f63e, 0x672fedd9, 0xdb366c0a, 0x44c470a7, 0xc1352a86, 0x6d4a16be, 0x2560ac29, 0x3f63eaa5, 0xf8ddf174, 0x6b1362e5, 0x424f41f0, 0x5730361d, 0x3fb1afa9, 0xb365b0b2, 0x72509a34, 0x482aba97, +0x54708840, 0x589e4270, 0xa55a7902, 0xb5ee81e5, 0x068b3157, 0x0ab7be6b, 0x891f9011, 0x1991bddd, 0x0f7c3161, 0x9a3993a7, 0x61769982, 0xba92b084, 0x1f1a8c8a, 0xfd167e7e, 0x00000000, 0x96051c9b, 0x09f70036, 0x1fc8c986, 0x47568bf6, 0x86b1e47c, +0xddbd5d5d, 0x3cf111f4, 0xaaf40d6f, 0x623627df, 0x52fbb917, 0x9aebd6ab, 0xc7be1bd1, 0x77495032, 0x5b0cb921, 0x20ab2323, 0x2079662f, 0xf7a1c015, 0x350611c2, 0xb6ae3fb8, 0x441635ab, 0xce9b5eeb, 0xf79306d7, 0x85afe942, 0x7f97fb5f, 0xf6d33e10, +0x723cef95, 0x64f61ad9, 0x3433d4b8, 0xedb2df96, 0x914d899a, 0x415526f8, 0xe603ee4e, 0x178acd8b, 0xc0c87f3c, 0xecf2e751, 0xaf8f543d, 0x014038c7, 0xd018af62, 0x7ae5731e, 0x20d1b460, 0x498cba73, 0xeeda72c5, 0x50c5ce61, 0x15a2581f, 0x65b6221e, +0xb5ae8d7c, 0x8804fd88, 0x3369c96d, 0x6e0713c6, 0xc4facfba, 0xd15897a5, 0xaecf6cfa, 0x474f03ea, 0xe159f39b, 0x9757ac88, 0x8c364d0e, 0x737cd752, 0x12f845ca, 0xd42a1fe4, 0x280828eb, 0x9bbc8085, 0x460f3b2d, 0x99941511, 0x4567967e, 0xdae9a67d, +0xdf9b2e3c, 0x900db15d, 0x38d8f8b5, 0xc811e3b7, 0xcb794ee4, 0x922524c9, 0xb945a171, 0x18094cd5, 0xbc372930, 0xc6d25a2e, 0xa756c8b6, 0x02289594, 0x3cea4833, 0xddb3bba8, 0x760e5f13, 0x9afcb842, 0xbd7711f7, 0x361b412c, 0xba2d0c22, 0xf4fbab84, +0x7dbf6ecb, 0xe8c057d7, 0xaafddc7c, 0x6f472b01, 0x4f969f61, 0x4ed6a7a6, 0x9617944f, 0x61849298, 0xc3a0d26f, 0xb78618e8, 0xc79262e9, 0x579fd3b4, 0x3f82e560, 0x8e1ed89a, 0xa3647830, 0x0f83815e, 0x2948102c, 0xb2f490a9, 0xb4eeb5bb, 0x2d7aa0aa, +0xfb782ada, 0x581c52ea, 0x54f77ee7, 0x3001643e, 0x3bb055e6, 0xf950bf4e, 0x8b6c50db, 0xfc22370f, 0x774e67d4, 0x40151e3f, 0xe42b7bda, 0x0432b086, 0xd6028a70, 0xa8d549e8, 0x2c3a986d, 0x60c4aa5f, 0xf8108789, 0x66de8f4d, 0x278ba9b5, 0xeba8fa84, +0x8a2c681c, 0xca397623, 0x84efd185, 0xb6c6202f, 0x2a20bd7f, 0xb80599b6, 0x23b91933, 0x87877cd6, 0x0999a44c, 0x7566f240, 0xf0c91b02, 0x63ac070c, 0xa616f071, 0xa57e5d22, 0xfd620fc8, 0x6b759b87, 0x70147a01, 0x5d6edaab, 0x82f5f497, 0x5185f6a6, +0x437db36c, 0x83b5cc50, 0x7426ca87, 0x2b6085b8, 0xef9a4a02, 0x14e260d8, 0xe743d689, 0x0368ad53, 0x7ba54bd9, 0x13b87d0d, 0x22f921f4, 0xd8c133e9, 0xcc235331, 0x56dfeb73, 0x715442c6, 0x16caf54c, 0x93651c0e, 0x5a34c77e, 0x21918ca7, 0x31415cf9, +0xfe0aa29b, 0xa43e65e5, 0x1c3bfc53, 0xb19c3dfa, 0x681d36d4, 0x679eb78a, 0x9ce69d50, 0xada7c1a9, 0xa00cd563, 0xc5baf77d, 0x819d59c4, 0xabbde4bb, 0x10d0d05e, 0xf3a1b651, 0x1190e899, 0x19497412, 0x80dd6103, 0xe2315ec8, 0x375b79eb, 0xe9806f10, +0xcd636bf6, 0x5c2ee26c, 0x24e304e6, 0x0dab14ca, 0x0ec3b999, 0xd9810b2e, 0xe019cb5c, 0x2e120df9, 0xd2303af6, 0xa14ceda4, 0xeae8c243, 0xf18923c5, 0x1e1369c7, 0xa995712f, 0xc2e0eaa8, 0x08d99c8b, 0x4cfe3232, 0x9da6a597, 0x4ae41720, 0x7ed7c398, +0x52ed5bf5, 0x798dde4d, 0x2f52353e, 0x1f535100, 0x3229f1aa, 0x6c2f8652, 0x00000000, 0x78cde68a, 0x423d8bab, 0xbe1fbca4, 0x53ad6332, 0x943f01db, 0x3998c072, 0x4427aeb9, 0x55b74620, 0x3ec2dda7, 0x1b61e186, 0xc951db70, 0x8944c54f, 0xd56a2723, +0x98d42dd6, 0x86c74411, 0x5f464f3f, 0xe56b431d, 0xcf4bfe62, 0x1a21d941, 0xf2e18e96, 0xd742b2b7, 0x48cc82b4, 0xdcf3836f, 0x7cff560c, 0x1d7bc494, 0xd3700231, 0x3573ec7f, 0x6a35a340, 0x8d7675c9, 0x957f391c, 0x25a33c21, 0x8f5ee05d, 0xb0dc053d, +0x5b74ffb9, 0xdba99eba, 0xdedb16fb, 0x0af1091f, 0xace7f96e, 0xff4a9a5c, 0x0bb131d8, 0xa22440f7, 0xe371660f, 0xb3b4a86e, 0x26cb9172, 0x075a1dd5, 0x9ece08c4, 0x05728841, 0xf5bb9343, 0x4dbe0af5, 0x3af06d21, 0xbb6d34e5, 0x9f8e3003, 0x6d6fbe95, +0x695d0e13, 0x061a2512, 0x0ceb2c0d, 0x4ba42fe7, 0xce0bc6a5, 0x3daa70f4, 0x595c6a2d, 0xc18847fb, 0x62ec3fcb, 0x5e0677f8, 0xbf5f8463, 0xfa38121d, 0x783d04bf, 0x4c94a18c, 0x0afc4a89, 0x39e55ed0, 0x5a240b3e, 0x60873c75, 0x805c6ee9, 0x3d138621, +0x222e257a, 0xc572ec77, 0x5955485e, 0xd0842f5e, 0xcb787e0f, 0xa5c2faf9, 0xe0db529c, 0x67378d1f, 0xa6b3b999, 0x98d17cd8, 0x84aab618, 0x8a970e9b, 0x3e55efba, 0x15f6c329, 0xbe3eaba8, 0x7600bc3c, 0xb03439d0, 0x50d841b7, 0xea1032ee, 0x11373123, +0xea271815, 0xf85640ad, 0x39d2742b, 0x9f56e749, 0xac4ff310, 0x832d2d89, 0xaf3eb070, 0x0e3db883, 0x349e8fc8, 0x04c1f20a, 0x6dcbc796, 0x4b2410e6, 0x4ca38b77, 0x7b7b6d24, 0xed97a97f, 0x5ed2d3cf, 0xcfb98c05, 0xde8ebd26, 0xc1b31e7d, 0x37efcca8, +0x2c24b702, 0x72f664cd, 0x96ecc45b, 0xffd1db3c, 0x09ba2312, 0xfb102936, 0x127158b8, 0xf1db4944, 0x6eba84f6, 0x2f55f462, 0xe961718e, 0xe76be3f6, 0x63f67f15, 0x921a1caa, 0xa5f5d002, 0x8aa02460, 0x718727ad, 0x690a359c, 0xf2aa0a24, 0xd472f7af, +0x215f661a, 0x21684ce1, 0xc63485ec, 0x5da390af, 0xf65cd2d5, 0x7571ff5c, 0xda7865d7, 0xac78d9eb, 0xe3aa11fc, 0x96dbeea0, 0xb372504b, 0xa8b92be1, 0x188d1231, 0xcb4f54f4, 0x11001bd8, 0xb7b3a241, 0xe75cc90d, 0xe41aa096, 0x429e33f4, 0x0d4cfbe3, +0x6e8dae0d, 0xe42d8a6d, 0x9f61cdb2, 0x332e3ea2, 0x6471e484, 0x4519a865, 0xddc8d4bd, 0x00372afb, 0x693d1f67, 0xe9565b75, 0xf29d20df, 0x7f8db5d5, 0x48555386, 0xa10308f3, 0x8e61d66a, 0x15c1e9d2, 0xddfffe46, 0xe0ec7867, 0x2f62de99, 0x8d27bff1, +0x41d85a6f, 0xd93e0c4c, 0xaf099a8b, 0xf66bf82e, 0x16b0aab2, 0xccffe59e, 0x465fc1fe, 0xbe098153, 0xd3c246c5, 0x98e65623, 0x7b4c47df, 0xeee6ea1f, 0xb78488ba, 0x098d09e9, 0xb9b93039, 0xa2456168, 0xb4c2e121, 0xdeb997dd, 0x42a9190f, 0xa88e011a, +0x9b971543, 0xb3457ab0, 0x71b00d56, 0x04f6d8f1, 0x9c108ed2, 0x12467243, 0x2b940668, 0x5a1321c5, 0xc603af17, 0x34a9a533, 0x922d3651, 0xb003132b, 0x26d8fd8b, 0x30685739, 0xd703b4cf, 0x16878049, 0xf8616a56, 0x95aaadc0, 0x6a4c5c07, 0xd3f56c3e, +0x1c4ce03b, 0xbd78c233, 0x7ccbdc4e, 0x1bcb7baa, 0xd445dd54, 0x915c7531, 0x5d94ba54, 0xf52d91b5, 0x6a7b76fc, 0x22190f81, 0xcf8ea6fe, 0x0346699b, 0x87dbf578, 0x831a0772, 0x5419b3bd, 0xd0b305a5, 0xda4f4f2c, 0x7fba9f2e, 0x1f3da35b, 0x28d26ff3, +0x763796c7, 0xccc8cf65, 0xc8093d6f, 0xfb2703cd, 0xf51abb4e, 0x7cfcf6b5, 0x5ee5f934, 0x9ba03fb8, 0x4b133a1d, 0x542e9946, 0x849d9ce3, 0x2ba32c93, 0x539e282c, 0x0d7bd118, 0x4fe5e2ec, 0x6700a7e4, 0x28e54508, 0x305f7dc2, 0x18ba38ca, 0x63c155ee, +0x50ef6b4c, 0xa6849362, 0x72c14e36, 0xabc86881, 0xc545c68c, 0x1c7bcac0, 0xfc97b2a7, 0x07879b91, 0x1f0a89a0, 0x8e56fc91, 0x1bfc5151, 0x41ef7094, 0x4fd2c817, 0x89e64dfb, 0x596262a5, 0x259e9410, 0x8d10950a, 0xc2f577e6, 0x2c139df9, 0x0e0a9278, +0x0acb6072, 0xbd4fe8c8, 0x3aa3374b, 0x452e829e, 0x7546d5a7, 0xbaff59a2, 0x3a941db0, 0xf1ec63bf, 0x53a902d7, 0x87ecdf83, 0xc2c25d1d, 0x00000000, 0xeda08384, 0x07b0b16a, 0x959d873b, 0x03714360, 0x4668eb05, 0xfca0985c, 0xa2724b93, 0xffe6f1c7, +0x916b5fca, 0xe39d3b07, 0x3e62c541, 0xd90926b7, 0x3d24acda, 0xc83e1794, 0xb98e1ac2, 0xc1843486, 0xeed1c0e4, 0x33191459, 0x806b4412, 0xd7349e34, 0x575fda26, 0xbac87359, 0x9c27a429, 0x25a9beeb, 0x89d16700, 0xb4f5cbda, 0x37d8e653, 0xabff427a, +0x4862797d, 0x780a2e44, 0x6dfced6d, 0x5768f0dd, 0x26efd770, 0x60b0168e, 0x6446ce7f, 0xa1342208, 0xa12efdba, 0xbc39627a, 0x7fc78bbf, 0x07f90042, 0xadb52960, 0xfe19b0e6, 0xd0e8227a, 0x0b6accea, 0x4bd886a1, 0x51361923, 0xb952faef, 0x8abcefc1, +0x290892de, 0xcf6d256d, 0x834ca38e, 0x40ba5239, 0xb5c13647, 0xfe11a894, 0x69bad895, 0xe4ff3716, 0x8ab4f7b3, 0x3884d9c4, 0xc16c7112, 0x8fdf6f26, 0x88266f64, 0xf5737c0c, 0x9cc9a499, 0x6cd95872, 0x73544717, 0x7aa40b58, 0xb0aaaed2, 0x58c6556c, +0xc69d6922, 0xf28a7c4e, 0x341f0d1e, 0x029298d7, 0x368d95c9, 0x4bd09ed3, 0x056380e7, 0x71c6dfc0, 0x6cd14000, 0x9539e8d6, 0x8344bbfc, 0x1d179fc0, 0x9531f0a4, 0x4c2186e3, 0xf7e1e4db, 0xeafe6369, 0xb5c92e35, 0x65210c4f, 0xc40ff1f5, 0x11845368, +0xb75bb6e2, 0xc407e987, 0xd9107647, 0x5da5d58b, 0x9b30a4db, 0xbea3e2df, 0x92c8f0e6, 0x317c8df9, 0x16754b58, 0x97ab7001, 0xc3f6f1b7, 0xed07632b, 0x513e0151, 0xa445652f, 0xb753ae90, 0x7836938f, 0xc89c3d5d, 0xfc833043, 0x5f3f552e, 0xc894252f, +0x7fcf93cd, 0xb2302e77, 0xb95ae29d, 0x07f11830, 0x49420604, 0x45d1caac, 0xa8d6a987, 0x67bb8cea, 0x5dadcdf9, 0x9e53243c, 0xbbc87a4a, 0x33e60d5c, 0xc3fee9c5, 0xd58ba29d, 0x20f8de91, 0x99aa247e, 0xf57b647e, 0x4228caee, 0xa3bc656d, 0x474b4a09, +0xaa4c2922, 0xef9de38e, 0xed0f7b59, 0xf9e8a8d6, 0x029a80a5, 0xd27abaad, 0x0c9bd4da, 0xb0a2b6a0, 0x226a4646, 0x1f850717, 0xe30e2f26, 0xdc73f6a0, 0x9e5b3c4e, 0x0c93cca8, 0x2709c6a1, 0x00081872, 0xa8deb1f5, 0x86273b1b, 0x3def4151, 0x9cc1bceb, +0x545599c4, 0xca0ea58a, 0x62d80c0d, 0x5a54cdbb, 0x53ac9986, 0xcf653d1f, 0x62d0147f, 0x81de3b59, 0x2ef1929c, 0xe864e3cc, 0xfc8b2831, 0xaf2fa9c5, 0xc6957150, 0x1d1f87b2, 0x9b38bca9, 0x4ebb0646, 0x8fd77754, 0xd0e03a08, 0xcdffbdba, 0xd272a2df, +0x0b62d498, 0x5a5cd5c9, 0xaf27b1b7, 0x14efcbfd, 0x4743527b, 0xdee16e77, 0x882e7716, 0x56c70113, 0x2701ded3, 0x167d532a, 0xbbc06238, 0x67b39498, 0x92c0e894, 0x14e7d38f, 0x3174958b, 0x97a36873, 0x09f04c4f, 0xf018e499, 0x494a1e76, 0x71cec7b2, +0xaa443150, 0xb2383605, 0x4220d29c, 0xadbd3112, 0x84b5a3cc, 0xe4f72f64, 0x2c630a4b, 0x58ce4d1e, 0x783e8bfd, 0x1ae687f0, 0xc1646960, 0x22625e34, 0x25934604, 0xd7112238, 0x45d9d2de, 0xf282643c, 0x0e094c0d, 0x604a94da, 0xdee97605, 0x09f8543d, +0x81d6232b, 0x259b5e76, 0x1aee9f82, 0xf7e9fca9, 0xe194af83, 0x18741f27, 0x53a481f4, 0x6e43d8d7, 0x1f8d1f65, 0x0e01547f, 0xdb82ee90, 0x84bdbbbe, 0x2c6b1239, 0x2ef98aee, 0x60428ca8, 0xa44d7d5d, 0xa126e5c8, 0x3a164113, 0x763fdf82, 0x36858dbb, +0xe19cb7f1, 0xeaf67b1b, 0x7aac132a, 0x90527043, 0x8d45ef83, 0xd7193a4a, 0x00000000, 0x6b284042, 0x118c4b1a, 0x74ad4755, 0x3417156c, 0xca06bdf8, 0xf010fceb, 0xef95fbfc, 0xe66dafc1, 0x7d551368, 0xdc7beed2, 0xd583baef, 0x74a55f27, 0xfb722873, +0xf9e0b0a4, 0xbeabfaad, 0xd9186e35, 0x388cc1b6, 0x187c0755, 0x131ed3cd, 0x7d5d0b1a, 0x3f7dd986, 0x69b2c0e7, 0x3de75923, 0x56cf1961, 0x3a1e5961, 0x3f75c1f4, 0xa3b47d1f, 0x99a23c0c, 0x1316cbbf, 0xcdf7a5c8, 0x5f374d5c, 0x4c299e91, 0x862f2369, +0x6529143d, 0x4eb31e34, 0x7637c7f0, 0x735c5f65, 0xa6dfe58a, 0xfb7a3001, 0x6e4bc0a5, 0x056b9895, 0xe86cfbbe, 0x905a6831, 0x20f0c6e3, 0xdb8af6e2, 0x33ee152e, 0x2b9a0a09, 0xa6d7fdf8, 0x6b205830, 0x29008aac, 0xbc317a08, 0xe3063754, 0xe665b7b3, +0x8d4df7f1, 0x2b92127b, 0x40b24a4b, 0x545d81b6, 0xb786cd97, 0x6f95ef0e, 0x9a2d81f2, 0x64b1cdab, 0xe6618432, 0x52bf91d3, 0x8aacb34a, 0x5c614a60, 0x33f4a56e, 0x7f14ddb6, 0x8f564a5c, 0x1d13cd10, 0xe52da029, 0xf31a4f9c, 0x84669494, 0x599bb376, +0x8c0e922a, 0xebe787f7, 0x18e93406, 0x034c241b, 0xa707ff2f, 0xaa81fcea, 0x818891ef, 0x490e7da3, 0x7c58f9ad, 0xbcb6135f, 0x156f37c3, 0x3556840e, 0x0eca27de, 0x574568c5, 0x108132b8, 0x1bb1ec70, 0x94f35a41, 0x77682765, 0x2b096d05, 0x7aee24a0, +0xd581dd31, 0x13d9eace, 0x8f42b631, 0x9c9b5cff, 0x4ce078d8, 0xd07b2427, 0x2851b573, 0x5ac36b00, 0x2b1d9168, 0xb124ecf7, 0xe38f8149, 0xdeb103f9, 0x8c1a6e47, 0x7292de73, 0xe8bf5f81, 0x71ca0605, 0xee1d7ee1, 0x41728770, 0xd8132299, 0x79a200bb, +0x0b30dec8, 0x3d3e82b0, 0x5f399216, 0x541db0b3, 0x52ab6dbe, 0x7424037e, 0x9fc38489, 0x06a22160, 0x202d4fa0, 0x13cd16a3, 0xb94cea49, 0x6213eccb, 0x00000000, 0xd06fd84a, 0x9109a357, 0xcd68e937, 0x7f0021db, 0x1e5fe90b, 0xa1b12222, 0x598f4f1b, +0x41667b1d, 0x89f46b3c, 0x18fdc86b, 0x911d5f3a, 0x087cfad3, 0x92517b21, 0x47c45a7d, 0x97bf7e5a, 0xb4cae98c, 0x5c75b60d, 0x99755984, 0x47d0a610, 0xd807def4, 0xa45f2759, 0x2039b3cd, 0xaa950087, 0x2ee7687e, 0x575194a8, 0x8ab84f27, 0xfe88b034, +0x9245874c, 0xfb66b54f, 0xf5ac9291, 0x94e7a62c, 0x54094cde, 0x4a56a5d5, 0xe675785f, 0xfe9c4c59, 0x0358d876, 0xa1a5de4f, 0xa9cdd8f1, 0x0ededbb3, 0x23616bbb, 0xa2fd0639, 0x361aa015, 0xc3a2cee9, 0x7c4c05c0, 0xbfeecb29, 0x38c47ba6, 0x423ea36b, +0x67e915dd, 0x819c6d82, 0xd6d90547, 0xa7130342, 0xe39b7d24, 0x1095ced5, 0xfdc4942f, 0x1d07317d, 0x777cdb08, 0x25c34adb, 0xc0fa169f, 0xf6e0b68a, 0x82d04999, 0xa9d9249c, 0xce303141, 0x4cf484b5, 0x35427863, 0xdb5f0682, 0xed45a697, 0x30ac7d18, +0xee09828c, 0x38d087cb, 0xac23dd8a, 0x873e4ce2, 0xb9581624, 0x268f6ec0, 0xac3721e7, 0xbca2ef32, 0xdb4bfaef, 0x4a4259b8, 0x9c8fa092, 0x615fc8d0, 0xc500ef89, 0xcbde343a, 0x69233203, 0x0d8603c5, 0x30b88175, 0x2845491e, 0x620710a6, 0xebf37b9a, +0x3e72a6ab, 0x06b6dd0d, 0xf0566b87, 0x71defa68, 0x2ef39413, 0x0b2422a5, 0x3d2a7edd, 0x422a5f06, 0xf30eb3f1, 0xfb724922, 0x25d7b6b6, 0xfdd06842, 0xe8aba3ec, 0x82c4b5f4, 0x79b6fcd6, 0xb130109a, 0xe0d7593f, 0x33e05903, 0xe0c3a552, 0x05faf916, +0x360e5c78, 0xf04297ea, 0xcd7c155a, 0xf83e6d39, 0xe5395c44, 0xf5b86efc, 0xc65837ff, 0x67fde9b0, 0x491a81ce, 0xddfd27e2, 0x9961a5e9, 0x162313d8, 0x9fd778e4, 0x9a397d9f, 0x086806be, 0xba14323f, 0x97ab8237, 0x7afad8cd, 0xd6cdf92a, 0x6ccd3778, +0xaf6ff991, 0x157bcbae, 0x44887e66, 0x6a7bea75, 0xbffa3744, 0xf82a9154, 0xd323fc51, 0x64a531c6, 0x1e4b1566, 0xa2e9fa54, 0xf6f44ae7, 0x847268f9, 0xb4de15e1, 0x872ab08f, 0xa44bdb34, 0x6a6f1618, 0x2dbfb008, 0xc3b63284, 0xce24cd2c, 0xc64ccb92, +0xc51413e4, 0xdea5ff94, 0xba00ce52, 0x2dab4c65, 0xcbcac857, 0xc886ec4c, 0x449c820b, 0xc0eeeaf2, 0x237597d6, 0x6f811363, 0x5ad7976d, 0x3e665ac6, 0xb268c8ec, 0x1637efb5, 0x269b92ad, 0x89e09751, 0xd595215c, 0x51f3b5c8, 0x3b9ca3d0, 0x7286221e, +0xaf7b05fc, 0x614b34bd, 0x4fb8a0ae, 0x1ba5101d, 0x51e749a5, 0x0d92ffa8, 0x7430ff13, 0x4fac5cc3, 0x0014fc6d, 0xb27c3481, 0xdde9db8f, 0xed515afa, 0x3b885fbd, 0xb79231fa, 0x05ee057b, 0x6937ce6e, 0xc8921021, 0x5f2d6e7b, 0x6cd9cb15, 0xd337003c, +0x5b888e73, 0x0483f57f, 0x0a73941d, 0x012a7f57, 0xda367f3d, 0xdf9ff515, 0xf65eae16, 0xfc2d3a0b, 0xe61d21f2, 0x29c15b03, 0x64a672ec, 0x2d42ae7c, 0x8712d936, 0x2298b049, 0x17c5d8cb, 0x2bee8604, 0xc229b9c3, 0x28eb2454, 0xcdf3a7f6, 0x5aa2f124, +0xb0606cb3, 0x610ff8c4, 0x3c2b5ecf, 0x4092eadd, 0xcfdc7af1, 0x783a416d, 0xd7c3bc0f, 0x15ea05cc, 0x219d1219, 0xab7a081d, 0x14c07a9b, 0x2c68d12b, 0xfa811273, 0xbd95af81, 0xb83c25a9, 0x8f4e902c, 0x9f0d1fc8, 0x23b2cf1e, 0xfd07455c, 0x44111fa2, +0xa20c3e50, 0x2e470c2c, 0x0cdfbc65, 0x3e0483c8, 0x988b48e7, 0x967b2985, 0x51fb1a6e, 0x5d24a60b, 0xacfc5f32, 0xe0b1098a, 0x77e05f58, 0x3772b585, 0xed44cab8, 0x126c52e3, 0xe7375ea5, 0xdeb58a42, 0x24349831, 0x3f2efc9f, 0x5e21045b, 0xbb3987f9, +0xb9165afe, 0x9454f482, 0x1169f0b3, 0xec6eb5ef, 0x6dd044a1, 0x9b8eeab7, 0x32db3fad, 0x1b1a64ae, 0x7cb9b412, 0x82bb531e, 0x3a8776b7, 0x9e27609f, 0x1f9991d1, 0x30f4e2aa, 0xd819a23a, 0x7fbc1642, 0x1eb3ee86, 0x20b76d4e, 0xadd62065, 0xf4717311, +0xe9c73fc7, 0xe8ed4090, 0x0fda1e35, 0x10438fe4, 0x3d012198, 0x60258793, 0xd3404970, 0x6ed5e6f1, 0x67a3d0bc, 0xb365cee3, 0x90d701fd, 0x022fdd07, 0xe51883a2, 0x75cf825f, 0x6b7c6cd9, 0xef6b17bf, 0xca75f0d9, 0x57573216, 0xc6aa4cbc, 0xe19b76dd, +0x49e4dc90, 0xb24fb1b4, 0x6fff99a6, 0x9c08bd98, 0x79103e3a, 0x1c9c3381, 0x1a301bf9, 0xc48591bb, 0xd5ec6108, 0xddb02812, 0xccd9d8a1, 0xcef605a6, 0x5c0ed95c, 0x31de9dfd, 0x853d0431, 0x4c4d56b8, 0x8c4b327c, 0x7b3fe33d, 0x632025c3, 0x70660877, +0x59a75374, 0x33f140fa, 0xcb5f8f8e, 0xaff9fd62, 0x8638a661, 0x7363aa27, 0xeac29d97, 0x8ae71a04, 0x50d16539, 0x76ca200f, 0x6953b1de, 0x91fd7eaa, 0xaed38235, 0xc9705289, 0xe432fcf5, 0xebe8e2c0, 0x99a137b0, 0xc12c1b93, 0xf774d141, 0xf0f2866e, +0xc303c694, 0x0b59eb4a, 0x9d22c2cf, 0x0976364d, 0xc78033eb, 0x06ac2878, 0xf8aecf74, 0xc85a2dde, 0xa1099c00, 0xa7a5b478, 0x957e8bd5, 0x658c0dbb, 0x714c7720, 0x3bad09e0, 0x588d2c23, 0x453b60f5, 0x4f48f4e8, 0x5578ef11, 0xd6e9c358, 0xfe02e70c, +0x0305a250, 0xd045eb20, 0xb4e399cc, 0xa3264107, 0x92f8dcfa, 0xb7e63b9c, 0x6689afeb, 0x347717d5, 0x7e966915, 0xa58a697f, 0xdc9a5745, 0xff28985b, 0xd4c61e5f, 0xa955d51a, 0x1935b9a9, 0x5f0b7b0c, 0xa87faa4d, 0xf3f7243e, 0xfbab6d24, 0xee4168e8, +0x84177b66, 0x4ae17ec0, 0x41b8958a, 0xb5c9e69b, 0x00000000, 0xa023e357, 0x085c491a, 0x4bcb0197, 0x80948e19, 0x6879ce89, 0xba13f8ae, 0x89e2b854, 0xc00664c4, 0xf1d8f939, 0x8bcd6553, 0xb14a13e4, 0x93d2a3ad, 0x8d614d2b, 0xe29ed48d, 0x975156d2, +0x6a56138e, 0x4e628bbf, 0x74e5fd08, 0x355d6882, 0x05a98a28, 0xa68fcb2f, 0xdb1c006a, 0x0786572f, 0x13462db4, 0x88c8c703, 0x48cea3c7, 0xc5afeeec, 0x6cfa3bf6, 0x463ec2a5, 0x54529046, 0xf2dd5b69, 0x567d4d41, 0x8e64ef7b, 0xa4a01628, 0x2ac4f953, +0x181fc6fe, 0xb6cc44cb, 0xf55b0c46, 0x7249d570, 0x83912c49, 0x3658cad2, 0x2f6d737b, 0xbcbfd0d6, 0x251ee766, 0xaa50774a, 0xd933dd6d, 0xbfba7286, 0x16efa79c, 0xd26a3627, 0x27313a61, 0x9aa495e0, 0xe3b4abda, 0x7a159c6a, 0x1db64cd6, 0x4714bdf2, +0xf984b023, 0x81bef14e, 0xd16f9477, 0x53d4c769, 0x0ef06162, 0x620a5a94, 0x42bd37da, 0x0df5c332, 0xbe900dd1, 0x261b4536, 0x52feb83e, 0x4397488d, 0x3982d4e7, 0x4d6729ef, 0x7d93cb45, 0x38a8abb0, 0x77e8c081, 0xa0bd5f5b, 0x7b849926, 0x7f3bcbda, +0x0464fe82, 0x96efd689, 0x3a3ed075, 0xe8901500, 0xecad9b03, 0x76f5b853, 0xd7559fda, 0x76acc8d2, 0x72c83650, 0xedb0e3d1, 0xd70cef5b, 0xd78e33a4, 0x93148c26, 0x32367750, 0xa9f1f02d, 0xd275690b, 0x37945d7e, 0x455c6b2e, 0x7e7fc389, 0x09ce7389, +0x7f62bb5b, 0xa4d9a1d9, 0xd22c198a, 0xe0431e5b, 0x4dd610f4, 0x32b4abaf, 0xdb39c67d, 0x9fa379ff, 0x96b6a608, 0x0cb7f5d9, 0x7ea46ff7, 0x413895ac, 0x40fe4100, 0xd6934b76, 0x9b9ef7fc, 0xa9a880ac, 0x44c3cf03, 0xa9732cd2, 0x3b23a8a7, 0xde9bec53, +0x0d2851f4, 0x3b7ad826, 0x724aeaaf, 0x730ee2fc, 0x0808a725, 0xe5e13475, 0xa4020da7, 0x01c6d4ac, 0xad4ea2d1, 0xa54605f4, 0xa1a02789, 0x3e818289, 0x3f475625, 0x96347af7, 0x45deb7d1, 0x7bdde9a7, 0x966d0a76, 0x0df3fd8a, 0x72139a2e, 0xad17d250, +0x49eb9ef7, 0x97290225, 0xa0e42fda, 0xe4fc4ca7, 0xa8ec88ff, 0xe563e88a, 0x9a0153d1, 0xd3eacd26, 0x3bf804d9, 0xe427e0d9, 0x9209f4f4, 0x36d0552d, 0x97abdeda, 0xec76377d, 0xd6119789, 0x7357927d, 0x4c10c458, 0xac88767d, 0xdfdfe400, 0x7ac09175, +0x9ffa097e, 0xdaff12d1, 0x7b0645d9, 0x9ee771ac, 0xede99350, 0x3f9cfa5b, 0xdf869481, 0x92508475, 0x05a22a2e, 0xd6ca3bf7, 0x9f78d581, 0x3ae57c0b, 0x9bc7877d, 0x08d30b5b, 0x45051baf, 0x49303289, 0xa1f95708, 0xd2aec575, 0xdaa66250, 0xa480d158, +0xe956c1ac, 0xe5b844f4, 0x019fa42d, 0xde1930ac, 0x40a73181, 0x977072a4, 0xa5c4d90b, 0x4ccb6826, 0x9b455b82, 0xa03f83a4, 0xdbe26a03, 0xec2f47fc, 0x48743ada, 0xdf5d38ff, 0xe0c1c2a4, 0x088a7bda, 0x37168181, 0x7a424d8a, 0x3f1e26a4, 0xda24beaf, +0x48af96a4, 0x41e339d2, 0xa122fb76, 0x4025ed7e, 0xe1dcba76, 0xa92a5c53, 0x33a9d37d, 0xa17b8bf7, 0xd3316158, 0xa59da98a, 0xd648e708, 0x4d0dbc8a, 0xd2f7b5f4, 0xa8372481, 0x93cf2058, 0x776a1c7e, 0x0d712175, 0x37cd2dff, 0x97f2ae5b, 0xe098b225, +0xe90fb12d, 0x3abc0c8a, 0x05798650, 0xe4a53c26, 0xe53a980b, 0x4c9218a7, 0x738c3e03, 0xdbbb1a82, 0x3fc58ada, 0xed323f2e, 0x09970308, 0xe01a6eda, 0x3ed8f208, 0x0520f6d1, 0xac0aaa82, 0x0cee8558, 0xe84bb97e, 0x360bf953, 0x00000000, 0x332b0f82, +0xa86e5400, 0xe15e6689, 0xadcc7e2e, 0x9b1c2b03, 0xe1071608, 0x41ba4953, 0xdb60b6fc, 0x094caf76, 0x49694208, 0x939650d9, 0x4d8f6075, 0x92d2588a, 0xac53da03, 0x01440853, 0x0851d7a4, 0x77b1b000, 0xa8b5f87e, 0x326f07d1, 0x4418637d, 0x7fb91725, +0x374ff100, 0x00dbac7e, 0x33f0a3fc, 0xa45b7d26, 0x043d8e03, 0x9a838f2e, 0xdec29cd2, 0x04bf52fc, 0xd36811d9, 0xe185caf7, 0x7efd1f76, 0x32eddb2e, 0x7e26b308, 0x00597081, 0x0c6c59a7, 0xa066f325, 0x05fb5aaf, 0x04e6227d, 0xd7d74325, 0x4587c750, +0xe9d41d53, 0xad950eaf, 0x7b5f3558, 0x9adaffaf, 0x77336cff, 0x3e5a2ef7, 0x0c352926, 0x729146d1, 0x7fe067a4, 0xd3b3bda7, 0x449abf82, 0x444113fc, 0x767764ac, 0x73d54e82, 0x407c9dff, 0x9e65ad53, 0x49b2ee76, 0x9a582350, 0x7a1b3d0b, 0x011d78d2, +0x9ebe012d, 0xde40402d, 0x482d4a5b, 0xe98d6dd2, 0x3ba17458, 0x928b280b, 0x365289d2, 0x4161e52d, 0x0082dcff, 0x3a67a0f4, 0x762e142d, 0x0915dff7, 0x7a99e1f4, 0xacd106fc, 0x9f21a500, 0xe47e9058, 0x4d54cc0b, 0x368925ac, 0x934dfca7, 0x33727f03, +0x48f6e625, 0x3e035e76, 0xed6b4faf, 0xe812c9ff, 0xa51f7575, 0xdf04487e, 0x9e3cddd2, 0x0daa8d0b, 0xe8c96581, 0xecf4eb82, 0xda7dce2e, 0x4c49b4d9, 0x4bedb796, 0x5dee1d7d, 0xa606cbd6, 0xddacf416, 0xcbaf5efd, 0xe9df9aae, 0xb0ec28c0, 0x76987e92, +0xacee2c58, 0xe3de34dd, 0x0d324152, 0x46dff6c4, 0x9f47e43c, 0xcb461700, 0xed0235bd, 0x78447ff2, 0x7671376f, 0x25aa628f, 0x639cddb6, 0xabddc379, 0xea31da9c, 0x64467b6a, 0x9275a56e, 0xf1e978d8, 0x5addf25c, 0xf633de04, 0x67a83b58, 0xd399bc8b, +0xb30268f2, 0x3e72c0cb, 0x4c37114a, 0xfcdb398a, 0x4fd95178, 0x759f775d, 0x0e35489d, 0x78ad360f, 0x929cec93, 0xc240b0bc, 0xf1003125, 0xcf9bb813, 0x113045ca, 0x11d90c37, 0xf8069699, 0x03ee4032, 0x0906a7bc, 0xda9f1b37, 0x6375944b, 0x39412fea, +0xdeabfdd9, 0x2cacc533, 0xa2db64c5, 0xda7652ca, 0x12de05f8, 0x95af03b2, 0x5a34bba1, 0x53321c1d, 0x09efee41, 0x72ac987c, 0x4cde58b7, 0xba04cf4e, 0x96414380, 0xd077fcb9, 0x15edead9, 0x5933b26e, 0xb7368e1c, 0x1ceb4d65, 0xedeb7c40, 0xc8a85732, +0x1b31ebb9, 0x420259d7, 0x289823dd, 0x0434e6ee, 0xc69d1faf, 0x6a9a7a0a, 0xff3579b8, 0x0ae8e78e, 0xfbe8d6ab, 0x04ddaf13, 0x8a434718, 0x98740b1d, 0xa501c219, 0x37746777, 0xf6da97f9, 0x00e949fd, 0xc6745652, 0x3d75c904, 0x9faeadc1, 0xb903c681, +0x25432b72, 0xfc327077, 0xe0d93d12, 0x674172a5, 0x8e9ee80b, 0x349a2745, 0xe4049201, 0x989d42e0, 0xf2ee7117, 0x57efb30e, 0xb9ea8f7c, 0x3a462625, 0x7b43763d, 0x42eb102a, 0xe3377d20, 0x8aaa0ee5, 0x7c99d0e1, 0x5d075480, 0x89444ed7, 0xeeec758f, +0x18dfab8b, 0x2b9f2a12, 0x1603aaeb, 0x5401f33c, 0x22998dae, 0x3aaf6fd8, 0x6e47d519, 0xde42b424, 0xb43187d3, 0xc147b973, 0xafe92597, 0xb3eb210f, 0x4803f7a4, 0x84760f85, 0xab348a84, 0x64af3297, 0x07daa6dc, 0x6eae9ce4, 0x0ddb08af, 0x0733ef21, +0xc59a1660, 0x2f428501, 0xd4431a57, 0x28716a20, 0xa8dacab6, 0x87984fb7, 0x7142d84e, 0xcc75f821, 0x2177cd9c, 0x34736eb8, 0xd7441398, 0xf8efdf64, 0x9b7302d2, 0x30478856, 0xa6ef822b, 0xfb019f56, 0xbe3029a0, 0xa5e88be4, 0x80aba096, 0x54e8bac1, +0x4531b6f6, 0x83aca959, 0x503515d2, 0xbdde6992, 0x3d9c80f9, 0xead89361, 0x39a86617, 0xbd37206f, 0xe03074ef, 0xc8411ecf, 0x1836e276, 0xc2a9f941, 0x6a7333f7, 0x1c020498, 0x75763ea0, 0x33a9c864, 0x12374c05, 0x1504a324, 0xdd45bdeb, 0x45d8ff0b, +0x00000000, 0x030709cf, 0x69743a38, 0xbed9605d, 0x379d2e8a, 0x2b7663ef, 0xa833834b, 0xf534d7cb, 0xa13524f7, 0x89ad072a, 0xee053c72, 0xa2322d38, 0xf5dd9e36, 0x4f301885, 0x6d40dcd6, 0xd99812f8, 0xcc9cb1dc, 0x8d70a839, 0xc5735f9d, 0x50dc5c2f, +0xac0765a5, 0xc1aef08e, 0x0a01ae73, 0x53db55e0, 0x699d73c5, 0x5ee914b2, 0x1fec44aa, 0xcf72f1ee, 0x0edc0160, 0x59dafb93, 0x9b9a4b2f, 0xb7dfc7e1, 0x9172aca1, 0x71ab91b3, 0x26ad6b40, 0x5706faf3, 0xa1dc6d0a, 0xe4eddbfc, 0x33408199, 0x8042e96b, +0x41055018, 0x16eae316, 0xffdc3045, 0x60729d84, 0x5e005d4f, 0xd09eb544, 0x7f7790d3, 0x7baa3fc0, 0x219e8461, 0x30aec1ab, 0xaf006c6a, 0x7245d181, 0x8e77a1f6, 0x2c458cce, 0x41ec19e5, 0x849f4678, 0x7f9ed92e, 0x9c40edf3, 0x2270c453, 0x1f050d57, +0x4636bf39, 0x48eabe59, 0x7c70991c, 0xe7039bce, 0x8d99e1c4, 0x1bd8a244, 0xb4d8ce2e, 0xd7ad5a65, 0x3e9b8936, 0x919be55c, 0x6da9952b, 0x95464a4f, 0x96a80a7d, 0xd370f576, 0xd9715b05, 0x8771064a, 0xbaed86b3, 0x609bd479, 0x4b04fe6b, 0x264422bd, +0xe7ead233, 0x8345e0a4, 0xb005613d, 0x9ca9a40e, 0xd4aa53aa, 0xe936d353, 0x2fabccfc, 0xf20738ea, 0x43dd86f9, 0xae74c7c4, 0xed37a894, 0x8e57a59b, 0xe591be09, 0xb890b8c7, 0x30197786, 0x8889cf41, 0xdbce34db, 0x5347fb9a, 0xcd2a4bd8, 0xd588c98f, +0xb096c6e0, 0xaed4af7e, 0xb0082f49, 0x0ed814fd, 0x100494ca, 0x18a28257, 0x5b4185bd, 0x38bf611b, 0xcd8a2362, 0xa64c38f0, 0x9813b222, 0xf3eb28a3, 0xeb49aaf4, 0xbed03bb4, 0x635e8c1c, 0xd5b6489c, 0x1edc8037, 0xd3c84afc, 0xa8942c0d, 0x96cba6df, +0x381f09a1, 0xa00cbb83, 0x43e307ea, 0x16e47f03, 0x5b7f04ae, 0x437dee43, 0xdb6e5c61, 0x43436f50, 0xe34fd4d3, 0x3881e008, 0x6db819f2, 0xe50f57a0, 0x26c38996, 0x75241ab6, 0x86f1b306, 0xf5952ac3, 0x4da5fabe, 0x7b5c66f1, 0x53d91233, 0x7dbc8d38, +0xa092522a, 0x80b13075, 0x6d8698e1, 0x30b91f3c, 0x453d6d30, 0xd356a355, 0x73fa706c, 0x7584720c, 0x5d9fef67, 0xf5ababd0, 0x988d5b8b, 0x73c4f17f, 0x88b74e52, 0xe3d13d7a, 0xbe4ed21d, 0x1e7ce88d, 0x881726e8, 0x10a4fc70, 0x06de6ada, 0x550778e9, +0x201de34c, 0x3659f4f5, 0xfd0dbd4d, 0x003e8113, 0x2663e12c, 0x164417b9, 0x0838ff34, 0xebd7435d, 0x189c0344, 0xf34b4019, 0x08067e27, 0xdbf0b5c8, 0x36f99c4f, 0x3027f695, 0xc58c5d45, 0xfd333c5e, 0xeda9413d, 0xc52c35ff, 0x751a9ba5, 0xb8ae39d4, +0xf3d5a9b0, 0xb0a847f3, 0xcbcaa011, 0xc3f25f25, 0x5bdf6c14, 0xe531d6b3, 0x6580e6c6, 0x802fd9dc, 0x00000000, 0x0ee695ee, 0xf50bc36a, 0xb648ac3a, 0x65208e7c, 0x98b3da98, 0x6bf89a81, 0xa83444b7, 0xfbed5684, 0xfb73bf2d, 0x0e787c47, 0xa8aaad1e, +0x96f527cc, 0xd5162026, 0x6d26f05b, 0x3e610bc1, 0x45a38499, 0x1ee20124, 0x63fee4a6, 0x30879e2f, 0xc5b2dc56, 0x808fb166, 0x067e0260, 0xdd105e01, 0x06408373, 0xa80ac5a4, 0x86cf3215, 0x08a6169d, 0x5be1ed07, 0xb6e8c480, 0xe37155c0, 0x8651dbbc, +0x288574c2, 0xbe70530e, 0xed092987, 0x28bbf5d1, 0x06e0ebc9, 0x103a15d9, 0xae4a46d7, 0xf375c10a, 0x9015cc05, 0xbeeebaa7, 0xcdb4a271, 0xb6d64593, 0x55999140, 0x5539f9fa, 0xebe9c24e, 0xc3ccde36, 0x7b62e7e2, 0xe3efbc69, 0x5d0106ce, 0x6b58f23b, +0x6d187148, 0x736499c5, 0x3e5f8ad2, 0x0e46fd54, 0xf5354279, 0x1e42699e, 0xcb5449b8, 0x459d058a, 0x4d9b7bad, 0xa0acd339, 0x96554f76, 0x866f5aaf, 0x28251c78, 0xe5af3f1a, 0xed97c02e, 0xc352379f, 0x902b4d16, 0x55a71053, 0x167a96aa, 0xa6ec504a, +0x382188b2, 0xcd14cacb, 0x4bdbf8de, 0x8ef7cd21, 0xb80e516e, 0x4d059204, 0xd528a135, 0xfd9354e4, 0x7d1ce582, 0x7d226491, 0x6b667328, 0x2023625f, 0x9ef359eb, 0x908b25ac, 0xdd8eb7a8, 0x26fd0885, 0xc36cb68c, 0xcb6ac8ab, 0x0898978e, 0x651e0f6f, +0x7bc28f58, 0xfdadd5f7, 0x8829a7fb, 0x9ecdd8f8, 0xd3682246, 0x53e79320, 0x90b5a4bf, 0xa6d2d159, 0xb830d07d, 0x3ec1637b, 0x281b9d6b, 0x4503ec23, 0x366775e6, 0xa0323a90, 0xfbd3d797, 0x2e659f0b, 0x63600d0f, 0x7d820c2b, 0x8e692488, 0xa672b9e3, +0x5da16e74, 0x8ec94c32, 0x2ec5f7b1, 0xb036ae5a, 0x75baf31f, 0x65be67d5, 0xeb772be7, 0x36c71d5c, 0x009ee9a9, 0x3effe268, 0xddb036bb, 0x2efb76a2, 0x63c065b5, 0xd3f6cbef, 0x982d3331, 0x801158cf, 0x6bc61b92, 0x2e5b1e18, 0x109a7d63, 0x4b7b9064, +0xaeea2e6d, 0x9e6db042, 0x735a18d6, 0x4b451177, 0xc512b4ec, 0x4be579cd, 0x9e533151, 0xdb50dd72, 0x1802eaed, 0xfb4d3e3e, 0xdd2edf12, 0x16dafe10, 0x265d603f, 0xb6762d29, 0xcbf42102, 0x00a068ba, 0x20bd8bf6, 0x53797a89, 0x183c6bfe, 0x7bfc0e4b, +0x20830ae5, 0x5d3f87dd, 0x4d3b1317, 0x966bce65, 0xa61ab9a7, 0x55b695d3, 0x154ea0fe, 0x3db92c0b, 0x56e6ac7a, 0x3596ce94, 0xd83a291d, 0xa87c9421, 0xf8d3f742, 0x2dee7a45, 0x38916a8e, 0x43a80c84, 0xedace789, 0x938c7733, 0x3bf0e312, 0x58b131c9, +0x6d27ff5d, 0x7d411926, 0x33eeb1b8, 0x081e52aa, 0x1066e67b, 0xfdca01f2, 0xd53d8d07, 0x7046bd3c, 0x96958183, 0xcb0cf6cf, 0x60205b47, 0x588081fc, 0x5da8c779, 0x35a77ea1, 0x40f8352d, 0x7e2090ba, 0xbb4a4bf3, 0x6b5f8071, 0x755f4b8c, 0x808b18d4, +0x48e66787, 0xb365a96c, 0xbd0384ea, 0x082fe29f, 0x36f74708, 0x98c21c30, 0x1d614261, 0xeefcde20, 0xad656291, 0x1d50f254, 0x13076fe7, 0xd374421e, 0x680fb9d8, 0xad54d2a4, 0x7b08d63f, 0x90dc4e9a, 0x88954a7e, 0x45d073a8, 0xb64defe9, 0xc3231450, +0xdb5ba081, 0x7d70a913, 0x45e1c39d, 0x53ff5aca, 0x0e662d86, 0x00000000, 0x1b288d78, 0x4bb65e2e, 0x95c5b82a, 0x1878b4d1, 0xc85ccf66, 0x2ddfca70, 0x48d7d7b2, 0x9e8bd329, 0xab2cad88, 0x85a35e51, 0x1e00cbfd, 0xa3034f17, 0x6341d2db, 0xb03590c5, +0xb82bc26f, 0x1b193d4d, 0x06787f2c, 0x96a431b6, 0xf39d9c41, 0x0b7fdb36, 0xfbb27ede, 0xe5b2b523, 0x36c6f73d, 0x65081dc2, 0x3d889c3e, 0xa84d2414, 0xc86d7f53, 0x9ddbea80, 0x86c2d7cd, 0x98f3ac05, 0x26a01146, 0x25f028ef, 0xf8e24777, 0xde425631, +0x8592ee64, 0xd015cb82, 0xf0fc15dd, 0x70770d09, 0xb51dd640, 0xce15007f, 0x4399bcb1, 0x5be10860, 0xcd7489e3, 0x5ef8fed0, 0x80baa8e1, 0x3ed8a597, 0x88a4fa4b, 0xc60b52d5, 0x20e9de5f, 0x1057564e, 0x50af6363, 0x5bd0b855, 0xe8b51139, 0x23b9e7f6, +0x0e579db3, 0x0361899c, 0x86f367f8, 0x3bc15327, 0x0b4e6b03, 0x9dea5ab5, 0xeecd6e15, 0xae355b38, 0x637062ee, 0x83db217d, 0x509ed356, 0xf5d45358, 0x6011eb72, 0xc312a465, 0xa062c68b, 0x2b960569, 0xd0247bb7, 0xcd4539d6, 0x732734a0, 0x8bf4c3e2, +0xb3541959, 0x1e317bc8, 0x8bc573d7, 0xb52c6675, 0x4b87ee1b, 0xfdfbb1c7, 0x9ba395ac, 0x40c98518, 0xe3caca0f, 0xd80b9928, 0xe3fb7a3a, 0x3ee915a2, 0x38a0dabb, 0x5ec94ee5, 0xbe620d76, 0x763ec210, 0xf6b5dac4, 0x0031b035, 0xe884a10c, 0x0649cf19, +0x0d36142f, 0xb67c5fdc, 0x756efbb9, 0x2ba7b55c, 0xc0732df9, 0x83ea9148, 0x33df018d, 0xd345f22b, 0x30be8811, 0xb00420f0, 0x558725e6, 0x93bdc706, 0xbb7bfbc6, 0xe0ab4393, 0xdd23dfad, 0x46b1fa34, 0x28c63cc0, 0xce24b04a, 0xfeab886e, 0x9b922599, +0x162f2962, 0x05284685, 0x1336dfd2, 0x8edc8567, 0xed9d57bc, 0x95f4081f, 0xc63ae2e0, 0x25c198da, 0x7b39660a, 0xe09af3a6, 0x760f7225, 0xa54a800e, 0x8d8cbcce, 0xa332ff22, 0x20d86e6a, 0x6e4676c1, 0xbd3234df, 0xdd126f98, 0xf0cda5e8, 0x2e8ff3d9, +0x53ceeaff, 0x7858ef96, 0x2ebe43ec, 0x6539adf7, 0x73168495, 0x8dbd0cfb, 0xebd498a5, 0xe6d33cbf, 0xa57b303b, 0xfe9a385b, 0x6e77c6f4, 0x035039a9, 0x90edfeaf, 0x4dce2102, 0xcb3d46fa, 0xfb83ceeb, 0xa62b0992, 0xd50c3d32, 0xd66db4ae, 0x28f78cf5, +0xe5830516, 0x4e9e18ab, 0xc56adb49, 0x683e09ed, 0x6b6e3044, 0xf3ac2c74, 0xc0429dcc, 0xab1d1dbd, 0x184904e4, 0xdb6a10b4, 0x308f3824, 0xb81a725a, 0x56d71c4f, 0x157f10cb, 0x9eba631c, 0x8eed3552, 0xa05376be, 0xebe52890, 0xc55b6b7c, 0x0519f6b0, +0x4dff9137, 0x7e11208f, 0x4eafa89e, 0x5d99774c, 0xbe53bd43, 0xe6e28c8a, 0x46804a01, 0x238857c3, 0xd65c049b, 0xae04eb0d, 0x78695fa3, 0xde73e604, 0xf5e5e36d, 0x6d164f68, 0xf6846af1, 0x6669945e, 0x161e9957, 0x0d07a41a, 0x2691a173, 0x6658246b, +0xeeeccdcc, 0xf0033ce4, 0x722da1e2, 0x2ab6b5d5, 0xfc4bc0f7, 0x9c269a66, 0xff54ded1, 0x697c54c4, 0x4c7af56c, 0x6534a8d7, 0x9fde7208, 0x748cbbca, 0xbad8d3a0, 0xf0e4caac, 0xc4bd8e51, 0xba3f25e8, 0x17190935, 0x5eddf857, 0xf55acea2, 0xf645d084, +0xb031359b, 0x0559f246, 0x6c25a682, 0x32f85ed5, 0x8d797f33, 0xa7cfcae6, 0x822e9d06, 0xc1e47c17, 0x205f53ee, 0x3100b6bb, 0xc45a7819, 0xc2fb6231, 0x8e666115, 0x0fb0147d, 0x7e655df1, 0x9f398440, 0x0caf0a5b, 0x1bb6036e, 0xd5059d4c, 0x40d5ff37, +0x54341e6c, 0x997f6820, 0x84687166, 0x6a634ae2, 0xadc1da95, 0x6395b2ff, 0xb6902fb3, 0xed1425a2, 0x8b3f9353, 0x29a9abf3, 0x26fe49c6, 0x606d5a91, 0x516dec2a, 0x95379433, 0x1df0ef0e, 0xa271cee8, 0xc812840a, 0xf6a226cc, 0x31e740f3, 0x456bfb39, +0x4923072a, 0x9089903d, 0x88208d75, 0x20b8a5a6, 0x4f821d02, 0xa29638a0, 0x294e5dbb, 0x662bb6f1, 0x3e57548e, 0xbf66d7ae, 0xe84dd7e4, 0xe1bb2ff9, 0x43cae111, 0x82c96b4e, 0x66cc40b9, 0x777453a4, 0x699ba28c, 0xeb52c9c2, 0xc21c9479, 0xe71a35d1, +0xa87fde9b, 0x57ccf602, 0xdcf36551, 0x4f65eb4a, 0x0c48fc13, 0xebb53f8a, 0xedf3d3ea, 0xbc9e3fc0, 0x34beb2b5, 0x587ce27f, 0x6a84bcaa, 0xffb32899, 0x3b0ea6c8, 0x81318320, 0x87909908, 0xa1892686, 0x96288a15, 0xf31c22c2, 0x1b51f526, 0x3be95080, +0x06a11a28, 0xf5bd38ea, 0x2f08b1db, 0xcb0d9a2c, 0x746b4d82, 0x345944fd, 0x115fe555, 0x184eeb00, 0x5dc2e671, 0x2a51439d, 0xab8736f5, 0xf91232b1, 0x608aacd9, 0x5272f20c, 0xd5e26b04, 0x99989e68, 0xe4e2ddbf, 0xceb39e22, 0x3811b8ee, 0x7793a5ec, +0x4032097f, 0x7b3cafb7, 0x17feff7d, 0xdfec7b77, 0x81d67568, 0x25e157e0, 0x9a607606, 0xa7283cae, 0x572b004a, 0x2fef4793, 0xdf0b8d3f, 0x46931357, 0x321fa89d, 0xa4d0d4c0, 0x5d251039, 0x2506a1a8, 0xe243c797, 0x12a70d3b, 0xd94d615f, 0xe8aa21ac, +0x6cc250ca, 0x00e7f648, 0x637244b7, 0x0a0e1073, 0x7d9db59f, 0x4a3c190c, 0x37a1ac93, 0xc7a29077, 0x5e3a0e1f, 0xbf8121e6, 0xd05c6f0a, 0x18a91d48, 0xcdac8004, 0xaedec4b3, 0x4674e51f, 0xd9aa9717, 0x8d9e897b, 0xd0bb9942, 0x4adbef44, 0x37465adb, +0xdc149319, 0xcd4b764c, 0x72ca57aa, 0xfcac36bf, 0x09110e55, 0x3dafbce0, 0xcbea6c64, 0x432d1759, 0x52950444, 0x589b1437, 0x03f8e86e, 0x87776f40, 0x0646ec60, 0xb3c9ddf5, 0xae3932fb, 0xda527f79, 0x6fdd4eec, 0xa16ed0ce, 0x8e81975d, 0x458c0d71, +0xe7fdc399, 0xf9f5c4f9, 0x8bd8651b, 0xa4372288, 0xe2a431df, 0x2619bf8e, 0x906e6675, 0x4c9d0324, 0xb0d6c3d3, 0x2c17affd, 0xd343712c, 0xe4052bf7, 0x9a87804e, 0xa89828d3, 0xab60c0bd, 0x88c77b3d, 0xd61a836a, 0xee0b3b84, 0xc1038a5f, 0xbc79c988, +0x1d171946, 0x1240fb73, 0x38f64ea6, 0xb677d9fb, 0xd6fd7522, 0x7132bfc4, 0x3eb0a2c6, 0xc8f57242, 0x1e080760, 0x23a7bb80, 0xb32e2bbd, 0x0ae9e63b, 0x7e82abb9, 0x14061713, 0x93717853, 0x9cc16c2e, 0x7d7a43d7, 0x0f57e235, 0x71d5498c, 0xdab58931, +0xe15cd9b1, 0x7bdb59ff, 0x1eeff128, 0x6f3ab8a4, 0x3d484aa8, 0x96cf7c5d, 0x09f6f81d, 0xad262cdd, 0x11b8131d, 0x5b63fc59, 0xfaeadadf, 0x031f1e26, 0x7823b191, 0xc745663f, 0x65d35e9f, 0x54d3e824, 0x14e1e15b, 0xb58f3195, 0x93968e1b, 0x49c4f162, +0xfa0d2c97, 0x95d0627b, 0x2cf059b5, 0x00000000, 0x05be040e, 0x23404dc8, 0x518a1a62, 0xd3a48764, 0xf3fbd48a, 0x5b840a11, 0xce54686a, 0xb9203bce, 0x848f872e, 0x78c447d9, 0xb9c7cd86, 0xb568c7dd, ] + +d0x6a0a9b20=[ 0x00000000, 0x7637d858, 0xd5cbfdc7, 0xa3fc259f, 0x15233e67, 0x6314e63f, 0xc0e8c3a0, 0xb6df1bf8, 0x27e4da11, 0x51d30249, 0xf22f27d6, 0x8418ff8e, 0x32c7e476, 0x44f03c2e, 0xe70c19b1, 0x913bc1e9, 0x4e9bd3d1, 0x38ac0b89, 0x9b502e16, 0xed67f64e, +0x5bb8edb6, 0x2d8f35ee, 0x8e731071, 0xf844c829, 0x697f09c0, 0x1f48d198, 0xbcb4f407, 0xca832c5f, 0x7c5c37a7, 0x0a6befff, 0xa997ca60, 0xdfa01238, 0xcda35bd7, 0xbb94838f, 0x1868a610, 0x6e5f7e48, 0xd88065b0, 0xaeb7bde8, 0x0d4b9877, 0x7b7c402f, +0xea4781c6, 0x9c70599e, 0x3f8c7c01, 0x49bba459, 0xff64bfa1, 0x895367f9, 0x2aaf4266, 0x5c989a3e, 0x83388806, 0xf50f505e, 0x56f375c1, 0x20c4ad99, 0x961bb661, 0xe02c6e39, 0x43d04ba6, 0x35e793fe, 0xa4dc5217, 0xd2eb8a4f, 0x7117afd0, 0x07207788, +0xb1ff6c70, 0xc7c8b428, 0x643491b7, 0x120349ef, 0x9c7284cc, 0xea455c94, 0x49b9790b, 0x3f8ea153, 0x8951baab, 0xff6662f3, 0x5c9a476c, 0x2aad9f34, 0xbb965edd, 0xcda18685, 0x6e5da31a, 0x186a7b42, 0xaeb560ba, 0xd882b8e2, 0x7b7e9d7d, 0x0d494525, +0xd2e9571d, 0xa4de8f45, 0x0722aada, 0x71157282, 0xc7ca697a, 0xb1fdb122, 0x120194bd, 0x64364ce5, 0xf50d8d0c, 0x833a5554, 0x20c670cb, 0x56f1a893, 0xe02eb36b, 0x96196b33, 0x35e54eac, 0x43d296f4, 0x51d1df1b, 0x27e60743, 0x841a22dc, 0xf22dfa84, +0x44f2e17c, 0x32c53924, 0x91391cbb, 0xe70ec4e3, 0x7635050a, 0x0002dd52, 0xa3fef8cd, 0xd5c92095, 0x63163b6d, 0x1521e335, 0xb6ddc6aa, 0xc0ea1ef2, 0x1f4a0cca, 0x697dd492, 0xca81f10d, 0xbcb62955, 0x0a6932ad, 0x7c5eeaf5, 0xdfa2cf6a, 0xa9951732, +0x38aed6db, 0x4e990e83, 0xed652b1c, 0x9b52f344, 0x2d8de8bc, 0x5bba30e4, 0xf846157b, 0x8e71cd23, 0x2b54b6bf, 0x5d636ee7, 0xfe9f4b78, 0x88a89320, 0x3e7788d8, 0x48405080, 0xebbc751f, 0x9d8bad47, 0x0cb06cae, 0x7a87b4f6, 0xd97b9169, 0xaf4c4931, +0x199352c9, 0x6fa48a91, 0xcc58af0e, 0xba6f7756, 0x65cf656e, 0x13f8bd36, 0xb00498a9, 0xc63340f1, 0x70ec5b09, 0x06db8351, 0xa527a6ce, 0xd3107e96, 0x422bbf7f, 0x341c6727, 0x97e042b8, 0xe1d79ae0, 0x57088118, 0x213f5940, 0x82c37cdf, 0xf4f4a487, +0xe6f7ed68, 0x90c03530, 0x333c10af, 0x450bc8f7, 0xf3d4d30f, 0x85e30b57, 0x261f2ec8, 0x5028f690, 0xc1133779, 0xb724ef21, 0x14d8cabe, 0x62ef12e6, 0xd430091e, 0xa207d146, 0x01fbf4d9, 0x77cc2c81, 0xa86c3eb9, 0xde5be6e1, 0x7da7c37e, 0x0b901b26, +0xbd4f00de, 0xcb78d886, 0x6884fd19, 0x1eb32541, 0x8f88e4a8, 0xf9bf3cf0, 0x5a43196f, 0x2c74c137, 0x9aabdacf, 0xec9c0297, 0x4f602708, 0x3957ff50, 0xb7263273, 0xc111ea2b, 0x62edcfb4, 0x14da17ec, 0xa2050c14, 0xd432d44c, 0x77cef1d3, 0x01f9298b, +0x90c2e862, 0xe6f5303a, 0x450915a5, 0x333ecdfd, 0x85e1d605, 0xf3d60e5d, 0x502a2bc2, 0x261df39a, 0xf9bde1a2, 0x8f8a39fa, 0x2c761c65, 0x5a41c43d, 0xec9edfc5, 0x9aa9079d, 0x39552202, 0x4f62fa5a, 0xde593bb3, 0xa86ee3eb, 0x0b92c674, 0x7da51e2c, +0xcb7a05d4, 0xbd4ddd8c, 0x1eb1f813, 0x6886204b, 0x7a8569a4, 0x0cb2b1fc, 0xaf4e9463, 0xd9794c3b, 0x6fa657c3, 0x19918f9b, 0xba6daa04, 0xcc5a725c, 0x5d61b3b5, 0x2b566bed, 0x88aa4e72, 0xfe9d962a, 0x48428dd2, 0x3e75558a, 0x9d897015, 0xebbea84d, +0x341eba75, 0x4229622d, 0xe1d547b2, 0x97e29fea, 0x213d8412, 0x570a5c4a, 0xf4f679d5, 0x82c1a18d, 0x13fa6064, 0x65cdb83c, 0xc6319da3, 0xb00645fb, 0x06d95e03, 0x70ee865b, 0xd312a3c4, 0xa5257b9c, 0x00000000, 0x58125ff8, 0x028ccc0b, 0x5a9e93f3, +0x194f2e84, 0x415d717c, 0x1bc3e28f, 0x43d1bd77, 0x17e9fb17, 0x4ffba4ef, 0x1565371c, 0x4d7768e4, 0x0ea6d593, 0x56b48a6b, 0x0c2a1998, 0x54384660, 0x3fc894cd, 0x67dacb35, 0x3d4458c6, 0x6556073e, 0x2687ba49, 0x7e95e5b1, 0x240b7642, 0x7c1929ba, +0x28216fda, 0x70333022, 0x2aada3d1, 0x72bffc29, 0x316e415e, 0x697c1ea6, 0x33e28d55, 0x6bf0d2ad, 0xd174e330, 0x8966bcc8, 0xd3f82f3b, 0x8bea70c3, 0xc83bcdb4, 0x9029924c, 0xcab701bf, 0x92a55e47, 0xc69d1827, 0x9e8f47df, 0xc411d42c, 0x9c038bd4, +0xdfd236a3, 0x87c0695b, 0xdd5efaa8, 0x854ca550, 0xeebc77fd, 0xb6ae2805, 0xec30bbf6, 0xb422e40e, 0xf7f35979, 0xafe10681, 0xf57f9572, 0xad6dca8a, 0xf9558cea, 0xa147d312, 0xfbd940e1, 0xa3cb1f19, 0xe01aa26e, 0xb808fd96, 0xe2966e65, 0xba84319d, +0x63f930e8, 0x3beb6f10, 0x6175fce3, 0x3967a31b, 0x7ab61e6c, 0x22a44194, 0x783ad267, 0x20288d9f, 0x7410cbff, 0x2c029407, 0x769c07f4, 0x2e8e580c, 0x6d5fe57b, 0x354dba83, 0x6fd32970, 0x37c17688, 0x5c31a425, 0x0423fbdd, 0x5ebd682e, 0x06af37d6, +0x457e8aa1, 0x1d6cd559, 0x47f246aa, 0x1fe01952, 0x4bd85f32, 0x13ca00ca, 0x49549339, 0x1146ccc1, 0x529771b6, 0x0a852e4e, 0x501bbdbd, 0x0809e245, 0xb28dd3d8, 0xea9f8c20, 0xb0011fd3, 0xe813402b, 0xabc2fd5c, 0xf3d0a2a4, 0xa94e3157, 0xf15c6eaf, +0xa56428cf, 0xfd767737, 0xa7e8e4c4, 0xfffabb3c, 0xbc2b064b, 0xe43959b3, 0xbea7ca40, 0xe6b595b8, 0x8d454715, 0xd55718ed, 0x8fc98b1e, 0xd7dbd4e6, 0x940a6991, 0xcc183669, 0x9686a59a, 0xce94fa62, 0x9aacbc02, 0xc2bee3fa, 0x98207009, 0xc0322ff1, +0x83e39286, 0xdbf1cd7e, 0x816f5e8d, 0xd97d0175, 0x233c51a5, 0x7b2e0e5d, 0x21b09dae, 0x79a2c256, 0x3a737f21, 0x626120d9, 0x38ffb32a, 0x60edecd2, 0x34d5aab2, 0x6cc7f54a, 0x365966b9, 0x6e4b3941, 0x2d9a8436, 0x7588dbce, 0x2f16483d, 0x770417c5, +0x1cf4c568, 0x44e69a90, 0x1e780963, 0x466a569b, 0x05bbebec, 0x5da9b414, 0x073727e7, 0x5f25781f, 0x0b1d3e7f, 0x530f6187, 0x0991f274, 0x5183ad8c, 0x125210fb, 0x4a404f03, 0x10dedcf0, 0x48cc8308, 0xf248b295, 0xaa5aed6d, 0xf0c47e9e, 0xa8d62166, +0xeb079c11, 0xb315c3e9, 0xe98b501a, 0xb1990fe2, 0xe5a14982, 0xbdb3167a, 0xe72d8589, 0xbf3fda71, 0xfcee6706, 0xa4fc38fe, 0xfe62ab0d, 0xa670f4f5, 0xcd802658, 0x959279a0, 0xcf0cea53, 0x971eb5ab, 0xd4cf08dc, 0x8cdd5724, 0xd643c4d7, 0x8e519b2f, +0xda69dd4f, 0x827b82b7, 0xd8e51144, 0x80f74ebc, 0xc326f3cb, 0x9b34ac33, 0xc1aa3fc0, 0x99b86038, 0x40c5614d, 0x18d73eb5, 0x4249ad46, 0x1a5bf2be, 0x598a4fc9, 0x01981031, 0x5b0683c2, 0x0314dc3a, 0x572c9a5a, 0x0f3ec5a2, 0x55a05651, 0x0db209a9, +0x4e63b4de, 0x1671eb26, 0x4cef78d5, 0x14fd272d, 0x7f0df580, 0x271faa78, 0x7d81398b, 0x25936673, 0x6642db04, 0x3e5084fc, 0x64ce170f, 0x3cdc48f7, 0x68e40e97, 0x30f6516f, 0x6a68c29c, 0x327a9d64, 0x71ab2013, 0x29b97feb, 0x7327ec18, 0x2b35b3e0, +0x91b1827d, 0xc9a3dd85, 0x933d4e76, 0xcb2f118e, 0x88feacf9, 0xd0ecf301, 0x8a7260f2, 0xd2603f0a, 0x8658796a, 0xde4a2692, 0x84d4b561, 0xdcc6ea99, 0x9f1757ee, 0xc7050816, 0x9d9b9be5, 0xc589c41d, 0xae7916b0, 0xf66b4948, 0xacf5dabb, 0xf4e78543, +0xb7363834, 0xef2467cc, 0xb5baf43f, 0xeda8abc7, 0xb990eda7, 0xe182b25f, 0xbb1c21ac, 0xe30e7e54, 0xa0dfc323, 0xf8cd9cdb, 0xa2530f28, 0xfa4150d0, 0x00000000, 0x2e8929e4, 0x2888b89f, 0x0601917b, 0xc96ae7c4, 0xe7e3ce20, 0xe1e25f5b, 0xcf6b76bf, +0x98304279, 0xb6b96b9d, 0xb0b8fae6, 0x9e31d302, 0x515aa5bd, 0x7fd38c59, 0x79d21d22, 0x575b34c6, 0xfb794c2a, 0xd5f065ce, 0xd3f1f4b5, 0xfd78dd51, 0x3213abee, 0x1c9a820a, 0x1a9b1371, 0x34123a95, 0x63490e53, 0x4dc027b7, 0x4bc1b6cc, 0x65489f28, +0xaa23e997, 0x84aac073, 0x82ab5108, 0xac2278ec, 0x550193c6, 0x7b88ba22, 0x7d892b59, 0x530002bd, 0x9c6b7402, 0xb2e25de6, 0xb4e3cc9d, 0x9a6ae579, 0xcd31d1bf, 0xe3b8f85b, 0xe5b96920, 0xcb3040c4, 0x045b367b, 0x2ad21f9f, 0x2cd38ee4, 0x025aa700, +0xae78dfec, 0x80f1f608, 0x86f06773, 0xa8794e97, 0x67123828, 0x499b11cc, 0x4f9a80b7, 0x6113a953, 0x36489d95, 0x18c1b471, 0x1ec0250a, 0x30490cee, 0xff227a51, 0xd1ab53b5, 0xd7aac2ce, 0xf923eb2a, 0xd84daa99, 0xf6c4837d, 0xf0c51206, 0xde4c3be2, +0x11274d5d, 0x3fae64b9, 0x39aff5c2, 0x1726dc26, 0x407de8e0, 0x6ef4c104, 0x68f5507f, 0x467c799b, 0x89170f24, 0xa79e26c0, 0xa19fb7bb, 0x8f169e5f, 0x2334e6b3, 0x0dbdcf57, 0x0bbc5e2c, 0x253577c8, 0xea5e0177, 0xc4d72893, 0xc2d6b9e8, 0xec5f900c, +0xbb04a4ca, 0x958d8d2e, 0x938c1c55, 0xbd0535b1, 0x726e430e, 0x5ce76aea, 0x5ae6fb91, 0x746fd275, 0x8d4c395f, 0xa3c510bb, 0xa5c481c0, 0x8b4da824, 0x4426de9b, 0x6aaff77f, 0x6cae6604, 0x42274fe0, 0x157c7b26, 0x3bf552c2, 0x3df4c3b9, 0x137dea5d, +0xdc169ce2, 0xf29fb506, 0xf49e247d, 0xda170d99, 0x76357575, 0x58bc5c91, 0x5ebdcdea, 0x7034e40e, 0xbf5f92b1, 0x91d6bb55, 0x97d72a2e, 0xb95e03ca, 0xee05370c, 0xc08c1ee8, 0xc68d8f93, 0xe804a677, 0x276fd0c8, 0x09e6f92c, 0x0fe76857, 0x216e41b3, +0x35440e6b, 0x1bcd278f, 0x1dccb6f4, 0x33459f10, 0xfc2ee9af, 0xd2a7c04b, 0xd4a65130, 0xfa2f78d4, 0xad744c12, 0x83fd65f6, 0x85fcf48d, 0xab75dd69, 0x641eabd6, 0x4a978232, 0x4c961349, 0x621f3aad, 0xce3d4241, 0xe0b46ba5, 0xe6b5fade, 0xc83cd33a, +0x0757a585, 0x29de8c61, 0x2fdf1d1a, 0x015634fe, 0x560d0038, 0x788429dc, 0x7e85b8a7, 0x500c9143, 0x9f67e7fc, 0xb1eece18, 0xb7ef5f63, 0x99667687, 0x60459dad, 0x4eccb449, 0x48cd2532, 0x66440cd6, 0xa92f7a69, 0x87a6538d, 0x81a7c2f6, 0xaf2eeb12, +0xf875dfd4, 0xd6fcf630, 0xd0fd674b, 0xfe744eaf, 0x311f3810, 0x1f9611f4, 0x1997808f, 0x371ea96b, 0x9b3cd187, 0xb5b5f863, 0xb3b46918, 0x9d3d40fc, 0x52563643, 0x7cdf1fa7, 0x7ade8edc, 0x5457a738, 0x030c93fe, 0x2d85ba1a, 0x2b842b61, 0x050d0285, +0xca66743a, 0xe4ef5dde, 0xe2eecca5, 0xcc67e541, 0xed09a4f2, 0xc3808d16, 0xc5811c6d, 0xeb083589, 0x24634336, 0x0aea6ad2, 0x0cebfba9, 0x2262d24d, 0x7539e68b, 0x5bb0cf6f, 0x5db15e14, 0x733877f0, 0xbc53014f, 0x92da28ab, 0x94dbb9d0, 0xba529034, +0x1670e8d8, 0x38f9c13c, 0x3ef85047, 0x107179a3, 0xdf1a0f1c, 0xf19326f8, 0xf792b783, 0xd91b9e67, 0x8e40aaa1, 0xa0c98345, 0xa6c8123e, 0x88413bda, 0x472a4d65, 0x69a36481, 0x6fa2f5fa, 0x412bdc1e, 0xb8083734, 0x96811ed0, 0x90808fab, 0xbe09a64f, +0x7162d0f0, 0x5febf914, 0x59ea686f, 0x7763418b, 0x2038754d, 0x0eb15ca9, 0x08b0cdd2, 0x2639e436, 0xe9529289, 0xc7dbbb6d, 0xc1da2a16, 0xef5303f2, 0x43717b1e, 0x6df852fa, 0x6bf9c381, 0x4570ea65, 0x8a1b9cda, 0xa492b53e, 0xa2932445, 0x8c1a0da1, +0xdb413967, 0xf5c81083, 0xf3c981f8, 0xdd40a81c, 0x122bdea3, 0x3ca2f747, 0x3aa3663c, 0x142a4fd8, 0x00000000, 0xf46082be, 0x2ea54e89, 0xdac5cc37, 0x8cb762bd, 0x78d7e003, 0xa2122c34, 0x5672ae8a, 0x90387d72, 0x6458ffcc, 0xbe9d33fb, 0x4afdb145, +0x1c8f1fcf, 0xe8ef9d71, 0x322a5146, 0xc64ad3f8, 0x0c1a9a9a, 0xf87a1824, 0x22bfd413, 0xd6df56ad, 0x80adf827, 0x74cd7a99, 0xae08b6ae, 0x5a683410, 0x9c22e7e8, 0x68426556, 0xb287a961, 0x46e72bdf, 0x10958555, 0xe4f507eb, 0x3e30cbdc, 0xca504962, +0xc35cb9b8, 0x373c3b06, 0xedf9f731, 0x1999758f, 0x4febdb05, 0xbb8b59bb, 0x614e958c, 0x952e1732, 0x5364c4ca, 0xa7044674, 0x7dc18a43, 0x89a108fd, 0xdfd3a677, 0x2bb324c9, 0xf176e8fe, 0x05166a40, 0xcf462322, 0x3b26a19c, 0xe1e36dab, 0x1583ef15, +0x43f1419f, 0xb791c321, 0x6d540f16, 0x99348da8, 0x5f7e5e50, 0xab1edcee, 0x71db10d9, 0x85bb9267, 0xd3c93ced, 0x27a9be53, 0xfd6c7264, 0x090cf0da, 0x95df97e9, 0x61bf1557, 0xbb7ad960, 0x4f1a5bde, 0x1968f554, 0xed0877ea, 0x37cdbbdd, 0xc3ad3963, +0x05e7ea9b, 0xf1876825, 0x2b42a412, 0xdf2226ac, 0x89508826, 0x7d300a98, 0xa7f5c6af, 0x53954411, 0x99c50d73, 0x6da58fcd, 0xb76043fa, 0x4300c144, 0x15726fce, 0xe112ed70, 0x3bd72147, 0xcfb7a3f9, 0x09fd7001, 0xfd9df2bf, 0x27583e88, 0xd338bc36, +0x854a12bc, 0x712a9002, 0xabef5c35, 0x5f8fde8b, 0x56832e51, 0xa2e3acef, 0x782660d8, 0x8c46e266, 0xda344cec, 0x2e54ce52, 0xf4910265, 0x00f180db, 0xc6bb5323, 0x32dbd19d, 0xe81e1daa, 0x1c7e9f14, 0x4a0c319e, 0xbe6cb320, 0x64a97f17, 0x90c9fda9, +0x5a99b4cb, 0xaef93675, 0x743cfa42, 0x805c78fc, 0xd62ed676, 0x224e54c8, 0xf88b98ff, 0x0ceb1a41, 0xcaa1c9b9, 0x3ec14b07, 0xe4048730, 0x1064058e, 0x4616ab04, 0xb27629ba, 0x68b3e58d, 0x9cd36733, 0xea8b2b1e, 0x1eeba9a0, 0xc42e6597, 0x304ee729, +0x663c49a3, 0x925ccb1d, 0x4899072a, 0xbcf98594, 0x7ab3566c, 0x8ed3d4d2, 0x541618e5, 0xa0769a5b, 0xf60434d1, 0x0264b66f, 0xd8a17a58, 0x2cc1f8e6, 0xe691b184, 0x12f1333a, 0xc834ff0d, 0x3c547db3, 0x6a26d339, 0x9e465187, 0x44839db0, 0xb0e31f0e, +0x76a9ccf6, 0x82c94e48, 0x580c827f, 0xac6c00c1, 0xfa1eae4b, 0x0e7e2cf5, 0xd4bbe0c2, 0x20db627c, 0x29d792a6, 0xddb71018, 0x0772dc2f, 0xf3125e91, 0xa560f01b, 0x510072a5, 0x8bc5be92, 0x7fa53c2c, 0xb9efefd4, 0x4d8f6d6a, 0x974aa15d, 0x632a23e3, +0x35588d69, 0xc1380fd7, 0x1bfdc3e0, 0xef9d415e, 0x25cd083c, 0xd1ad8a82, 0x0b6846b5, 0xff08c40b, 0xa97a6a81, 0x5d1ae83f, 0x87df2408, 0x73bfa6b6, 0xb5f5754e, 0x4195f7f0, 0x9b503bc7, 0x6f30b979, 0x394217f3, 0xcd22954d, 0x17e7597a, 0xe387dbc4, +0x7f54bcf7, 0x8b343e49, 0x51f1f27e, 0xa59170c0, 0xf3e3de4a, 0x07835cf4, 0xdd4690c3, 0x2926127d, 0xef6cc185, 0x1b0c433b, 0xc1c98f0c, 0x35a90db2, 0x63dba338, 0x97bb2186, 0x4d7eedb1, 0xb91e6f0f, 0x734e266d, 0x872ea4d3, 0x5deb68e4, 0xa98bea5a, +0xfff944d0, 0x0b99c66e, 0xd15c0a59, 0x253c88e7, 0xe3765b1f, 0x1716d9a1, 0xcdd31596, 0x39b39728, 0x6fc139a2, 0x9ba1bb1c, 0x4164772b, 0xb504f595, 0xbc08054f, 0x486887f1, 0x92ad4bc6, 0x66cdc978, 0x30bf67f2, 0xc4dfe54c, 0x1e1a297b, 0xea7aabc5, +0x2c30783d, 0xd850fa83, 0x029536b4, 0xf6f5b40a, 0xa0871a80, 0x54e7983e, 0x8e225409, 0x7a42d6b7, 0xb0129fd5, 0x44721d6b, 0x9eb7d15c, 0x6ad753e2, 0x3ca5fd68, 0xc8c57fd6, 0x1200b3e1, 0xe660315f, 0x202ae2a7, 0xd44a6019, 0x0e8fac2e, 0xfaef2e90, +0xac9d801a, 0x58fd02a4, 0x8238ce93, 0x76584c2d, 0x00000000, 0x4ddd2447, 0x934d9510, 0xde90b157, 0x5003d711, 0x1ddef356, 0xc34e4201, 0x8e936646, 0x4008fad7, 0x0dd5de90, 0xd3456fc7, 0x9e984b80, 0x100b2dc6, 0x5dd60981, 0x8346b8d6, 0xce9b9c91, +0x65da2389, 0x280707ce, 0xf697b699, 0xbb4a92de, 0x35d9f498, 0x7804d0df, 0xa6946188, 0xeb4945cf, 0x25d2d95e, 0x680ffd19, 0xb69f4c4e, 0xfb426809, 0x75d10e4f, 0x380c2a08, 0xe69c9b5f, 0xab41bf18, 0x634f2679, 0x2e92023e, 0xf002b369, 0xbddf972e, +0x334cf168, 0x7e91d52f, 0xa0016478, 0xeddc403f, 0x2347dcae, 0x6e9af8e9, 0xb00a49be, 0xfdd76df9, 0x73440bbf, 0x3e992ff8, 0xe0099eaf, 0xadd4bae8, 0x069505f0, 0x4b4821b7, 0x95d890e0, 0xd805b4a7, 0x5696d2e1, 0x1b4bf6a6, 0xc5db47f1, 0x880663b6, +0x469dff27, 0x0b40db60, 0xd5d06a37, 0x980d4e70, 0x169e2836, 0x5b430c71, 0x85d3bd26, 0xc80e9961, 0x421e0e29, 0x0fc32a6e, 0xd1539b39, 0x9c8ebf7e, 0x121dd938, 0x5fc0fd7f, 0x81504c28, 0xcc8d686f, 0x0216f4fe, 0x4fcbd0b9, 0x915b61ee, 0xdc8645a9, +0x521523ef, 0x1fc807a8, 0xc158b6ff, 0x8c8592b8, 0x27c42da0, 0x6a1909e7, 0xb489b8b0, 0xf9549cf7, 0x77c7fab1, 0x3a1adef6, 0xe48a6fa1, 0xa9574be6, 0x67ccd777, 0x2a11f330, 0xf4814267, 0xb95c6620, 0x37cf0066, 0x7a122421, 0xa4829576, 0xe95fb131, +0x21512850, 0x6c8c0c17, 0xb21cbd40, 0xffc19907, 0x7152ff41, 0x3c8fdb06, 0xe21f6a51, 0xafc24e16, 0x6159d287, 0x2c84f6c0, 0xf2144797, 0xbfc963d0, 0x315a0596, 0x7c8721d1, 0xa2179086, 0xefcab4c1, 0x448b0bd9, 0x09562f9e, 0xd7c69ec9, 0x9a1bba8e, +0x1488dcc8, 0x5955f88f, 0x87c549d8, 0xca186d9f, 0x0483f10e, 0x495ed549, 0x97ce641e, 0xda134059, 0x5480261f, 0x195d0258, 0xc7cdb30f, 0x8a109748, 0xb87c47e2, 0xf5a163a5, 0x2b31d2f2, 0x66ecf6b5, 0xe87f90f3, 0xa5a2b4b4, 0x7b3205e3, 0x36ef21a4, +0xf874bd35, 0xb5a99972, 0x6b392825, 0x26e40c62, 0xa8776a24, 0xe5aa4e63, 0x3b3aff34, 0x76e7db73, 0xdda6646b, 0x907b402c, 0x4eebf17b, 0x0336d53c, 0x8da5b37a, 0xc078973d, 0x1ee8266a, 0x5335022d, 0x9dae9ebc, 0xd073bafb, 0x0ee30bac, 0x433e2feb, +0xcdad49ad, 0x80706dea, 0x5ee0dcbd, 0x133df8fa, 0xdb33619b, 0x96ee45dc, 0x487ef48b, 0x05a3d0cc, 0x8b30b68a, 0xc6ed92cd, 0x187d239a, 0x55a007dd, 0x9b3b9b4c, 0xd6e6bf0b, 0x08760e5c, 0x45ab2a1b, 0xcb384c5d, 0x86e5681a, 0x5875d94d, 0x15a8fd0a, +0xbee94212, 0xf3346655, 0x2da4d702, 0x6079f345, 0xeeea9503, 0xa337b144, 0x7da70013, 0x307a2454, 0xfee1b8c5, 0xb33c9c82, 0x6dac2dd5, 0x20710992, 0xaee26fd4, 0xe33f4b93, 0x3daffac4, 0x7072de83, 0xfa6249cb, 0xb7bf6d8c, 0x692fdcdb, 0x24f2f89c, +0xaa619eda, 0xe7bcba9d, 0x392c0bca, 0x74f12f8d, 0xba6ab31c, 0xf7b7975b, 0x2927260c, 0x64fa024b, 0xea69640d, 0xa7b4404a, 0x7924f11d, 0x34f9d55a, 0x9fb86a42, 0xd2654e05, 0x0cf5ff52, 0x4128db15, 0xcfbbbd53, 0x82669914, 0x5cf62843, 0x112b0c04, +0xdfb09095, 0x926db4d2, 0x4cfd0585, 0x012021c2, 0x8fb34784, 0xc26e63c3, 0x1cfed294, 0x5123f6d3, 0x992d6fb2, 0xd4f04bf5, 0x0a60faa2, 0x47bddee5, 0xc92eb8a3, 0x84f39ce4, 0x5a632db3, 0x17be09f4, 0xd9259565, 0x94f8b122, 0x4a680075, 0x07b52432, +0x89264274, 0xc4fb6633, 0x1a6bd764, 0x57b6f323, 0xfcf74c3b, 0xb12a687c, 0x6fbad92b, 0x2267fd6c, 0xacf49b2a, 0xe129bf6d, 0x3fb90e3a, 0x72642a7d, 0xbcffb6ec, 0xf12292ab, 0x2fb223fc, 0x626f07bb, 0xecfc61fd, 0xa12145ba, 0x7fb1f4ed, 0x326cd0aa, +0x00000000, 0x2ad2948a, 0xf6f96392, 0xdc2bf718, 0x54e2c57e, 0x7e3051f4, 0xa21ba6ec, 0x88c93266, 0x57c5c32c, 0x7d1757a6, 0xa13ca0be, 0x8bee3434, 0x03270652, 0x29f592d8, 0xf5de65c0, 0xdf0cf14a, 0x227abda2, 0x08a82928, 0xd483de30, 0xfe514aba, +0x769878dc, 0x5c4aec56, 0x80611b4e, 0xaab38fc4, 0x75bf7e8e, 0x5f6dea04, 0x83461d1c, 0xa9948996, 0x215dbbf0, 0x0b8f2f7a, 0xd7a4d862, 0xfd764ce8, 0x5c140b47, 0x76c69fcd, 0xaaed68d5, 0x803ffc5f, 0x08f6ce39, 0x22245ab3, 0xfe0fadab, 0xd4dd3921, +0x0bd1c86b, 0x21035ce1, 0xfd28abf9, 0xd7fa3f73, 0x5f330d15, 0x75e1999f, 0xa9ca6e87, 0x8318fa0d, 0x7e6eb6e5, 0x54bc226f, 0x8897d577, 0xa24541fd, 0x2a8c739b, 0x005ee711, 0xdc751009, 0xf6a78483, 0x29ab75c9, 0x0379e143, 0xdf52165b, 0xf58082d1, +0x7d49b0b7, 0x579b243d, 0x8bb0d325, 0xa16247af, 0x622043a3, 0x48f2d729, 0x94d92031, 0xbe0bb4bb, 0x36c286dd, 0x1c101257, 0xc03be54f, 0xeae971c5, 0x35e5808f, 0x1f371405, 0xc31ce31d, 0xe9ce7797, 0x610745f1, 0x4bd5d17b, 0x97fe2663, 0xbd2cb2e9, +0x405afe01, 0x6a886a8b, 0xb6a39d93, 0x9c710919, 0x14b83b7f, 0x3e6aaff5, 0xe24158ed, 0xc893cc67, 0x179f3d2d, 0x3d4da9a7, 0xe1665ebf, 0xcbb4ca35, 0x437df853, 0x69af6cd9, 0xb5849bc1, 0x9f560f4b, 0x3e3448e4, 0x14e6dc6e, 0xc8cd2b76, 0xe21fbffc, +0x6ad68d9a, 0x40041910, 0x9c2fee08, 0xb6fd7a82, 0x69f18bc8, 0x43231f42, 0x9f08e85a, 0xb5da7cd0, 0x3d134eb6, 0x17c1da3c, 0xcbea2d24, 0xe138b9ae, 0x1c4ef546, 0x369c61cc, 0xeab796d4, 0xc065025e, 0x48ac3038, 0x627ea4b2, 0xbe5553aa, 0x9487c720, +0x4b8b366a, 0x6159a2e0, 0xbd7255f8, 0x97a0c172, 0x1f69f314, 0x35bb679e, 0xe9909086, 0xc342040c, 0x212eafd4, 0x0bfc3b5e, 0xd7d7cc46, 0xfd0558cc, 0x75cc6aaa, 0x5f1efe20, 0x83350938, 0xa9e79db2, 0x76eb6cf8, 0x5c39f872, 0x80120f6a, 0xaac09be0, +0x2209a986, 0x08db3d0c, 0xd4f0ca14, 0xfe225e9e, 0x03541276, 0x298686fc, 0xf5ad71e4, 0xdf7fe56e, 0x57b6d708, 0x7d644382, 0xa14fb49a, 0x8b9d2010, 0x5491d15a, 0x7e4345d0, 0xa268b2c8, 0x88ba2642, 0x00731424, 0x2aa180ae, 0xf68a77b6, 0xdc58e33c, +0x7d3aa493, 0x57e83019, 0x8bc3c701, 0xa111538b, 0x29d861ed, 0x030af567, 0xdf21027f, 0xf5f396f5, 0x2aff67bf, 0x002df335, 0xdc06042d, 0xf6d490a7, 0x7e1da2c1, 0x54cf364b, 0x88e4c153, 0xa23655d9, 0x5f401931, 0x75928dbb, 0xa9b97aa3, 0x836bee29, +0x0ba2dc4f, 0x217048c5, 0xfd5bbfdd, 0xd7892b57, 0x0885da1d, 0x22574e97, 0xfe7cb98f, 0xd4ae2d05, 0x5c671f63, 0x76b58be9, 0xaa9e7cf1, 0x804ce87b, 0x430eec77, 0x69dc78fd, 0xb5f78fe5, 0x9f251b6f, 0x17ec2909, 0x3d3ebd83, 0xe1154a9b, 0xcbc7de11, +0x14cb2f5b, 0x3e19bbd1, 0xe2324cc9, 0xc8e0d843, 0x4029ea25, 0x6afb7eaf, 0xb6d089b7, 0x9c021d3d, 0x617451d5, 0x4ba6c55f, 0x978d3247, 0xbd5fa6cd, 0x359694ab, 0x1f440021, 0xc36ff739, 0xe9bd63b3, 0x36b192f9, 0x1c630673, 0xc048f16b, 0xea9a65e1, +0x62535787, 0x4881c30d, 0x94aa3415, 0xbe78a09f, 0x1f1ae730, 0x35c873ba, 0xe9e384a2, 0xc3311028, 0x4bf8224e, 0x612ab6c4, 0xbd0141dc, 0x97d3d556, 0x48df241c, 0x620db096, 0xbe26478e, 0x94f4d304, 0x1c3de162, 0x36ef75e8, 0xeac482f0, 0xc016167a, +0x3d605a92, 0x17b2ce18, 0xcb993900, 0xe14bad8a, 0x69829fec, 0x43500b66, 0x9f7bfc7e, 0xb5a968f4, 0x6aa599be, 0x40770d34, 0x9c5cfa2c, 0xb68e6ea6, 0x3e475cc0, 0x1495c84a, 0xc8be3f52, 0xe26cabd8, 0x00000000, 0x8e7e46e7, 0xb005e724, 0x3e7ba1c3, +0x9b90c798, 0x15ee817f, 0x2b9520bc, 0xa5eb665b, 0xd7d7881e, 0x59a9cef9, 0x67d26f3a, 0xe9ac29dd, 0x4c474f86, 0xc2390961, 0xfc42a8a2, 0x723cee45, 0x4d5b65ac, 0xc325234b, 0xfd5e8288, 0x7320c46f, 0xd6cba234, 0x58b5e4d3, 0x66ce4510, 0xe8b003f7, +0x9a8cedb2, 0x14f2ab55, 0x2a890a96, 0xa4f74c71, 0x011c2a2a, 0x8f626ccd, 0xb119cd0e, 0x3f678be9, 0x84c2db5e, 0x0abc9db9, 0x34c73c7a, 0xbab97a9d, 0x1f521cc6, 0x912c5a21, 0xaf57fbe2, 0x2129bd05, 0x53155340, 0xdd6b15a7, 0xe310b464, 0x6d6ef283, +0xc88594d8, 0x46fbd23f, 0x788073fc, 0xf6fe351b, 0xc999bef2, 0x47e7f815, 0x799c59d6, 0xf7e21f31, 0x5209796a, 0xdc773f8d, 0xe20c9e4e, 0x6c72d8a9, 0x1e4e36ec, 0x9030700b, 0xae4bd1c8, 0x2035972f, 0x85def174, 0x0ba0b793, 0x35db1650, 0xbba550b7, +0xebae10a3, 0x65d05644, 0x5babf787, 0xd5d5b160, 0x703ed73b, 0xfe4091dc, 0xc03b301f, 0x4e4576f8, 0x3c7998bd, 0xb207de5a, 0x8c7c7f99, 0x0202397e, 0xa7e95f25, 0x299719c2, 0x17ecb801, 0x9992fee6, 0xa6f5750f, 0x288b33e8, 0x16f0922b, 0x988ed4cc, +0x3d65b297, 0xb31bf470, 0x8d6055b3, 0x031e1354, 0x7122fd11, 0xff5cbbf6, 0xc1271a35, 0x4f595cd2, 0xeab23a89, 0x64cc7c6e, 0x5ab7ddad, 0xd4c99b4a, 0x6f6ccbfd, 0xe1128d1a, 0xdf692cd9, 0x51176a3e, 0xf4fc0c65, 0x7a824a82, 0x44f9eb41, 0xca87ada6, +0xb8bb43e3, 0x36c50504, 0x08bea4c7, 0x86c0e220, 0x232b847b, 0xad55c29c, 0x932e635f, 0x1d5025b8, 0x2237ae51, 0xac49e8b6, 0x92324975, 0x1c4c0f92, 0xb9a769c9, 0x37d92f2e, 0x09a28eed, 0x87dcc80a, 0xf5e0264f, 0x7b9e60a8, 0x45e5c16b, 0xcb9b878c, +0x6e70e1d7, 0xe00ea730, 0xde7506f3, 0x500b4014, 0xf44324e9, 0x7a3d620e, 0x4446c3cd, 0xca38852a, 0x6fd3e371, 0xe1ada596, 0xdfd60455, 0x51a842b2, 0x2394acf7, 0xadeaea10, 0x93914bd3, 0x1def0d34, 0xb8046b6f, 0x367a2d88, 0x08018c4b, 0x867fcaac, +0xb9184145, 0x376607a2, 0x091da661, 0x8763e086, 0x228886dd, 0xacf6c03a, 0x928d61f9, 0x1cf3271e, 0x6ecfc95b, 0xe0b18fbc, 0xdeca2e7f, 0x50b46898, 0xf55f0ec3, 0x7b214824, 0x455ae9e7, 0xcb24af00, 0x7081ffb7, 0xfeffb950, 0xc0841893, 0x4efa5e74, +0xeb11382f, 0x656f7ec8, 0x5b14df0b, 0xd56a99ec, 0xa75677a9, 0x2928314e, 0x1753908d, 0x992dd66a, 0x3cc6b031, 0xb2b8f6d6, 0x8cc35715, 0x02bd11f2, 0x3dda9a1b, 0xb3a4dcfc, 0x8ddf7d3f, 0x03a13bd8, 0xa64a5d83, 0x28341b64, 0x164fbaa7, 0x9831fc40, +0xea0d1205, 0x647354e2, 0x5a08f521, 0xd476b3c6, 0x719dd59d, 0xffe3937a, 0xc19832b9, 0x4fe6745e, 0x1fed344a, 0x919372ad, 0xafe8d36e, 0x21969589, 0x847df3d2, 0x0a03b535, 0x347814f6, 0xba065211, 0xc83abc54, 0x4644fab3, 0x783f5b70, 0xf6411d97, +0x53aa7bcc, 0xddd43d2b, 0xe3af9ce8, 0x6dd1da0f, 0x52b651e6, 0xdcc81701, 0xe2b3b6c2, 0x6ccdf025, 0xc926967e, 0x4758d099, 0x7923715a, 0xf75d37bd, 0x8561d9f8, 0x0b1f9f1f, 0x35643edc, 0xbb1a783b, 0x1ef11e60, 0x908f5887, 0xaef4f944, 0x208abfa3, +0x9b2fef14, 0x1551a9f3, 0x2b2a0830, 0xa5544ed7, 0x00bf288c, 0x8ec16e6b, 0xb0bacfa8, 0x3ec4894f, 0x4cf8670a, 0xc28621ed, 0xfcfd802e, 0x7283c6c9, 0xd768a092, 0x5916e675, 0x676d47b6, 0xe9130151, 0xd6748ab8, 0x580acc5f, 0x66716d9c, 0xe80f2b7b, +0x4de44d20, 0xc39a0bc7, 0xfde1aa04, 0x739fece3, 0x01a302a6, 0x8fdd4441, 0xb1a6e582, 0x3fd8a365, 0x9a33c53e, 0x144d83d9, 0x2a36221a, 0xa44864fd, 0x00000000, 0xdccec05f, 0xce2d7eee, 0x12e3beb1, 0xe8817ee3, 0x344fbebc, 0x26ac000d, 0xfa62c052, +0xc9934c1f, 0x155d8c40, 0x07be32f1, 0xdb70f2ae, 0x211232fc, 0xfddcf2a3, 0xef3f4c12, 0x33f18c4d, 0x8c7361e2, 0x50bda1bd, 0x425e1f0c, 0x9e90df53, 0x64f21f01, 0xb83cdf5e, 0xaadf61ef, 0x7611a1b0, 0x45e02dfd, 0x992eeda2, 0x8bcd5313, 0x5703934c, +0xad61531e, 0x71af9341, 0x634c2df0, 0xbf82edaf, 0xf3f55f35, 0x2f3b9f6a, 0x3dd821db, 0xe116e184, 0x1b7421d6, 0xc7bae189, 0xd5595f38, 0x09979f67, 0x3a66132a, 0xe6a8d375, 0xf44b6dc4, 0x2885ad9b, 0xd2e76dc9, 0x0e29ad96, 0x1cca1327, 0xc004d378, +0x7f863ed7, 0xa348fe88, 0xb1ab4039, 0x6d658066, 0x97074034, 0x4bc9806b, 0x592a3eda, 0x85e4fe85, 0xb61572c8, 0x6adbb297, 0x78380c26, 0xa4f6cc79, 0x5e940c2b, 0x825acc74, 0x90b972c5, 0x4c77b29a, 0x99b7b016, 0x45797049, 0x579acef8, 0x8b540ea7, +0x7136cef5, 0xadf80eaa, 0xbf1bb01b, 0x63d57044, 0x5024fc09, 0x8cea3c56, 0x9e0982e7, 0x42c742b8, 0xb8a582ea, 0x646b42b5, 0x7688fc04, 0xaa463c5b, 0x15c4d1f4, 0xc90a11ab, 0xdbe9af1a, 0x07276f45, 0xfd45af17, 0x218b6f48, 0x3368d1f9, 0xefa611a6, +0xdc579deb, 0x00995db4, 0x127ae305, 0xceb4235a, 0x34d6e308, 0xe8182357, 0xfafb9de6, 0x26355db9, 0x6a42ef23, 0xb68c2f7c, 0xa46f91cd, 0x78a15192, 0x82c391c0, 0x5e0d519f, 0x4ceeef2e, 0x90202f71, 0xa3d1a33c, 0x7f1f6363, 0x6dfcddd2, 0xb1321d8d, +0x4b50dddf, 0x979e1d80, 0x857da331, 0x59b3636e, 0xe6318ec1, 0x3aff4e9e, 0x281cf02f, 0xf4d23070, 0x0eb0f022, 0xd27e307d, 0xc09d8ecc, 0x1c534e93, 0x2fa2c2de, 0xf36c0281, 0xe18fbc30, 0x3d417c6f, 0xc723bc3d, 0x1bed7c62, 0x090ec2d3, 0xd5c0028c, +0x109c5749, 0xcc529716, 0xdeb129a7, 0x027fe9f8, 0xf81d29aa, 0x24d3e9f5, 0x36305744, 0xeafe971b, 0xd90f1b56, 0x05c1db09, 0x172265b8, 0xcbeca5e7, 0x318e65b5, 0xed40a5ea, 0xffa31b5b, 0x236ddb04, 0x9cef36ab, 0x4021f6f4, 0x52c24845, 0x8e0c881a, +0x746e4848, 0xa8a08817, 0xba4336a6, 0x668df6f9, 0x557c7ab4, 0x89b2baeb, 0x9b51045a, 0x479fc405, 0xbdfd0457, 0x6133c408, 0x73d07ab9, 0xaf1ebae6, 0xe369087c, 0x3fa7c823, 0x2d447692, 0xf18ab6cd, 0x0be8769f, 0xd726b6c0, 0xc5c50871, 0x190bc82e, +0x2afa4463, 0xf634843c, 0xe4d73a8d, 0x3819fad2, 0xc27b3a80, 0x1eb5fadf, 0x0c56446e, 0xd0988431, 0x6f1a699e, 0xb3d4a9c1, 0xa1371770, 0x7df9d72f, 0x879b177d, 0x5b55d722, 0x49b66993, 0x9578a9cc, 0xa6892581, 0x7a47e5de, 0x68a45b6f, 0xb46a9b30, +0x4e085b62, 0x92c69b3d, 0x8025258c, 0x5cebe5d3, 0x892be75f, 0x55e52700, 0x470699b1, 0x9bc859ee, 0x61aa99bc, 0xbd6459e3, 0xaf87e752, 0x7349270d, 0x40b8ab40, 0x9c766b1f, 0x8e95d5ae, 0x525b15f1, 0xa839d5a3, 0x74f715fc, 0x6614ab4d, 0xbada6b12, +0x055886bd, 0xd99646e2, 0xcb75f853, 0x17bb380c, 0xedd9f85e, 0x31173801, 0x23f486b0, 0xff3a46ef, 0xcccbcaa2, 0x10050afd, 0x02e6b44c, 0xde287413, 0x244ab441, 0xf884741e, 0xea67caaf, 0x36a90af0, 0x7adeb86a, 0xa6107835, 0xb4f3c684, 0x683d06db, +0x925fc689, 0x4e9106d6, 0x5c72b867, 0x80bc7838, 0xb34df475, 0x6f83342a, 0x7d608a9b, 0xa1ae4ac4, 0x5bcc8a96, 0x87024ac9, 0x95e1f478, 0x492f3427, 0xf6add988, 0x2a6319d7, 0x3880a766, 0xe44e6739, 0x1e2ca76b, 0xc2e26734, 0xd001d985, 0x0ccf19da, +0x3f3e9597, 0xe3f055c8, 0xf113eb79, 0x2ddd2b26, 0xd7bfeb74, 0x0b712b2b, 0x1992959a, 0xc55c55c5, 0x00000000, 0x47616595, 0x87aaaf89, 0xc0cbca1c, 0xaee3a89f, 0xe982cd0a, 0x29490716, 0x6e286283, 0xc71edf32, 0x807fbaa7, 0x40b470bb, 0x07d5152e, +0x69fd77ad, 0x2e9c1238, 0xee57d824, 0xa936bdb1, 0x767ee9fd, 0x311f8c68, 0xf1d44674, 0xb6b523e1, 0xd89d4162, 0x9ffc24f7, 0x5f37eeeb, 0x18568b7e, 0xb16036cf, 0xf601535a, 0x36ca9946, 0x71abfcd3, 0x1f839e50, 0x58e2fbc5, 0x982931d9, 0xdf48544c, +0x3004b21c, 0x7765d789, 0xb7ae1d95, 0xf0cf7800, 0x9ee71a83, 0xd9867f16, 0x194db50a, 0x5e2cd09f, 0xf71a6d2e, 0xb07b08bb, 0x70b0c2a7, 0x37d1a732, 0x59f9c5b1, 0x1e98a024, 0xde536a38, 0x99320fad, 0x467a5be1, 0x011b3e74, 0xc1d0f468, 0x86b191fd, +0xe899f37e, 0xaff896eb, 0x6f335cf7, 0x28523962, 0x816484d3, 0xc605e146, 0x06ce2b5a, 0x41af4ecf, 0x2f872c4c, 0x68e649d9, 0xa82d83c5, 0xef4ce650, 0xbf6b490f, 0xf80a2c9a, 0x38c1e686, 0x7fa08313, 0x1188e190, 0x56e98405, 0x96224e19, 0xd1432b8c, +0x7875963d, 0x3f14f3a8, 0xffdf39b4, 0xb8be5c21, 0xd6963ea2, 0x91f75b37, 0x513c912b, 0x165df4be, 0xc915a0f2, 0x8e74c567, 0x4ebf0f7b, 0x09de6aee, 0x67f6086d, 0x20976df8, 0xe05ca7e4, 0xa73dc271, 0x0e0b7fc0, 0x496a1a55, 0x89a1d049, 0xcec0b5dc, +0xa0e8d75f, 0xe789b2ca, 0x274278d6, 0x60231d43, 0x8f6ffb13, 0xc80e9e86, 0x08c5549a, 0x4fa4310f, 0x218c538c, 0x66ed3619, 0xa626fc05, 0xe1479990, 0x48712421, 0x0f1041b4, 0xcfdb8ba8, 0x88baee3d, 0xe6928cbe, 0xa1f3e92b, 0x61382337, 0x265946a2, +0xf91112ee, 0xbe70777b, 0x7ebbbd67, 0x39dad8f2, 0x57f2ba71, 0x1093dfe4, 0xd05815f8, 0x9739706d, 0x3e0fcddc, 0x796ea849, 0xb9a56255, 0xfec407c0, 0x90ec6543, 0xd78d00d6, 0x1746caca, 0x5027af5f, 0xaf3c930f, 0xe85df69a, 0x28963c86, 0x6ff75913, +0x01df3b90, 0x46be5e05, 0x86759419, 0xc114f18c, 0x68224c3d, 0x2f4329a8, 0xef88e3b4, 0xa8e98621, 0xc6c1e4a2, 0x81a08137, 0x416b4b2b, 0x060a2ebe, 0xd9427af2, 0x9e231f67, 0x5ee8d57b, 0x1989b0ee, 0x77a1d26d, 0x30c0b7f8, 0xf00b7de4, 0xb76a1871, +0x1e5ca5c0, 0x593dc055, 0x99f60a49, 0xde976fdc, 0xb0bf0d5f, 0xf7de68ca, 0x3715a2d6, 0x7074c743, 0x9f382113, 0xd8594486, 0x18928e9a, 0x5ff3eb0f, 0x31db898c, 0x76baec19, 0xb6712605, 0xf1104390, 0x5826fe21, 0x1f479bb4, 0xdf8c51a8, 0x98ed343d, +0xf6c556be, 0xb1a4332b, 0x716ff937, 0x360e9ca2, 0xe946c8ee, 0xae27ad7b, 0x6eec6767, 0x298d02f2, 0x47a56071, 0x00c405e4, 0xc00fcff8, 0x876eaa6d, 0x2e5817dc, 0x69397249, 0xa9f2b855, 0xee93ddc0, 0x80bbbf43, 0xc7dadad6, 0x071110ca, 0x4070755f, +0x1057da00, 0x5736bf95, 0x97fd7589, 0xd09c101c, 0xbeb4729f, 0xf9d5170a, 0x391edd16, 0x7e7fb883, 0xd7490532, 0x902860a7, 0x50e3aabb, 0x1782cf2e, 0x79aaadad, 0x3ecbc838, 0xfe000224, 0xb96167b1, 0x662933fd, 0x21485668, 0xe1839c74, 0xa6e2f9e1, +0xc8ca9b62, 0x8fabfef7, 0x4f6034eb, 0x0801517e, 0xa137eccf, 0xe656895a, 0x269d4346, 0x61fc26d3, 0x0fd44450, 0x48b521c5, 0x887eebd9, 0xcf1f8e4c, 0x2053681c, 0x67320d89, 0xa7f9c795, 0xe098a200, 0x8eb0c083, 0xc9d1a516, 0x091a6f0a, 0x4e7b0a9f, +0xe74db72e, 0xa02cd2bb, 0x60e718a7, 0x27867d32, 0x49ae1fb1, 0x0ecf7a24, 0xce04b038, 0x8965d5ad, 0x562d81e1, 0x114ce474, 0xd1872e68, 0x96e64bfd, 0xf8ce297e, 0xbfaf4ceb, 0x7f6486f7, 0x3805e362, 0x91335ed3, 0xd6523b46, 0x1699f15a, 0x51f894cf, +0x3fd0f64c, 0x78b193d9, 0xb87a59c5, 0xff1b3c50, 0x00000000, 0x0abacec4, 0x6af454c7, 0x604e9a03, 0x19e9c30f, 0x13530dcb, 0x731d97c8, 0x79a7590c, 0x6184d23f, 0x6b3e1cfb, 0x0b7086f8, 0x01ca483c, 0x786d1130, 0x72d7dff4, 0x129945f7, 0x18238b33, +0x56f54fe8, 0x5c4f812c, 0x3c011b2f, 0x36bbd5eb, 0x4f1c8ce7, 0x45a64223, 0x25e8d820, 0x2f5216e4, 0x37719dd7, 0x3dcb5313, 0x5d85c910, 0x573f07d4, 0x2e985ed8, 0x2422901c, 0x446c0a1f, 0x4ed6c4db, 0xa59c34a2, 0xaf26fa66, 0xcf686065, 0xc5d2aea1, +0xbc75f7ad, 0xb6cf3969, 0xd681a36a, 0xdc3b6dae, 0xc418e69d, 0xcea22859, 0xaeecb25a, 0xa4567c9e, 0xddf12592, 0xd74beb56, 0xb7057155, 0xbdbfbf91, 0xf3697b4a, 0xf9d3b58e, 0x999d2f8d, 0x9327e149, 0xea80b845, 0xe03a7681, 0x8074ec82, 0x8ace2246, +0x92eda975, 0x985767b1, 0xf819fdb2, 0xf2a33376, 0x8b046a7a, 0x81bea4be, 0xe1f03ebd, 0xeb4af079, 0xc91f931c, 0xc3a55dd8, 0xa3ebc7db, 0xa951091f, 0xd0f65013, 0xda4c9ed7, 0xba0204d4, 0xb0b8ca10, 0xa89b4123, 0xa2218fe7, 0xc26f15e4, 0xc8d5db20, +0xb172822c, 0xbbc84ce8, 0xdb86d6eb, 0xd13c182f, 0x9feadcf4, 0x95501230, 0xf51e8833, 0xffa446f7, 0x86031ffb, 0x8cb9d13f, 0xecf74b3c, 0xe64d85f8, 0xfe6e0ecb, 0xf4d4c00f, 0x949a5a0c, 0x9e2094c8, 0xe787cdc4, 0xed3d0300, 0x8d739903, 0x87c957c7, +0x6c83a7be, 0x6639697a, 0x0677f379, 0x0ccd3dbd, 0x756a64b1, 0x7fd0aa75, 0x1f9e3076, 0x1524feb2, 0x0d077581, 0x07bdbb45, 0x67f32146, 0x6d49ef82, 0x14eeb68e, 0x1e54784a, 0x7e1ae249, 0x74a02c8d, 0x3a76e856, 0x30cc2692, 0x5082bc91, 0x5a387255, +0x239f2b59, 0x2925e59d, 0x496b7f9e, 0x43d1b15a, 0x5bf23a69, 0x5148f4ad, 0x31066eae, 0x3bbca06a, 0x421bf966, 0x48a137a2, 0x28efada1, 0x22556365, 0xe0b13378, 0xea0bfdbc, 0x8a4567bf, 0x80ffa97b, 0xf958f077, 0xf3e23eb3, 0x93aca4b0, 0x99166a74, +0x8135e147, 0x8b8f2f83, 0xebc1b580, 0xe17b7b44, 0x98dc2248, 0x9266ec8c, 0xf228768f, 0xf892b84b, 0xb6447c90, 0xbcfeb254, 0xdcb02857, 0xd60ae693, 0xafadbf9f, 0xa517715b, 0xc559eb58, 0xcfe3259c, 0xd7c0aeaf, 0xdd7a606b, 0xbd34fa68, 0xb78e34ac, +0xce296da0, 0xc493a364, 0xa4dd3967, 0xae67f7a3, 0x452d07da, 0x4f97c91e, 0x2fd9531d, 0x25639dd9, 0x5cc4c4d5, 0x567e0a11, 0x36309012, 0x3c8a5ed6, 0x24a9d5e5, 0x2e131b21, 0x4e5d8122, 0x44e74fe6, 0x3d4016ea, 0x37fad82e, 0x57b4422d, 0x5d0e8ce9, +0x13d84832, 0x196286f6, 0x792c1cf5, 0x7396d231, 0x0a318b3d, 0x008b45f9, 0x60c5dffa, 0x6a7f113e, 0x725c9a0d, 0x78e654c9, 0x18a8ceca, 0x1212000e, 0x6bb55902, 0x610f97c6, 0x01410dc5, 0x0bfbc301, 0x29aea064, 0x23146ea0, 0x435af4a3, 0x49e03a67, +0x3047636b, 0x3afdadaf, 0x5ab337ac, 0x5009f968, 0x482a725b, 0x4290bc9f, 0x22de269c, 0x2864e858, 0x51c3b154, 0x5b797f90, 0x3b37e593, 0x318d2b57, 0x7f5bef8c, 0x75e12148, 0x15afbb4b, 0x1f15758f, 0x66b22c83, 0x6c08e247, 0x0c467844, 0x06fcb680, +0x1edf3db3, 0x1465f377, 0x742b6974, 0x7e91a7b0, 0x0736febc, 0x0d8c3078, 0x6dc2aa7b, 0x677864bf, 0x8c3294c6, 0x86885a02, 0xe6c6c001, 0xec7c0ec5, 0x95db57c9, 0x9f61990d, 0xff2f030e, 0xf595cdca, 0xedb646f9, 0xe70c883d, 0x8742123e, 0x8df8dcfa, +0xf45f85f6, 0xfee54b32, 0x9eabd131, 0x94111ff5, 0xdac7db2e, 0xd07d15ea, 0xb0338fe9, 0xba89412d, 0xc32e1821, 0xc994d6e5, 0xa9da4ce6, 0xa3608222, 0xbb430911, 0xb1f9c7d5, 0xd1b75dd6, 0xdb0d9312, 0xa2aaca1e, 0xa81004da, 0xc85e9ed9, 0xc2e4501d, +0x00000000, 0xdfcb028a, 0xeb446ab3, 0x348f6839, 0x47751af9, 0x98be1873, 0xac31704a, 0x73fa72c0, 0xc50849b0, 0x1ac34b3a, 0x2e4c2303, 0xf1872189, 0x827d5349, 0x5db651c3, 0x693939fa, 0xb6f23b70, 0x8841f545, 0x578af7cf, 0x63059ff6, 0xbcce9d7c, +0xcf34efbc, 0x10ffed36, 0x2470850f, 0xfbbb8785, 0x4d49bcf5, 0x9282be7f, 0xa60dd646, 0x79c6d4cc, 0x0a3ca60c, 0xd5f7a486, 0xe178ccbf, 0x3eb3ce35, 0xb5f5035d, 0x6a3e01d7, 0x5eb169ee, 0x817a6b64, 0xf28019a4, 0x2d4b1b2e, 0x19c47317, 0xc60f719d, +0x70fd4aed, 0xaf364867, 0x9bb9205e, 0x447222d4, 0x37885014, 0xe843529e, 0xdccc3aa7, 0x0307382d, 0x3db4f618, 0xe27ff492, 0xd6f09cab, 0x093b9e21, 0x7ac1ece1, 0xa50aee6b, 0x91858652, 0x4e4e84d8, 0xf8bcbfa8, 0x2777bd22, 0x13f8d51b, 0xcc33d791, +0xbfc9a551, 0x6002a7db, 0x548dcfe2, 0x8b46cd68, 0x43225e74, 0x9ce95cfe, 0xa86634c7, 0x77ad364d, 0x0457448d, 0xdb9c4607, 0xef132e3e, 0x30d82cb4, 0x862a17c4, 0x59e1154e, 0x6d6e7d77, 0xb2a57ffd, 0xc15f0d3d, 0x1e940fb7, 0x2a1b678e, 0xf5d06504, +0xcb63ab31, 0x14a8a9bb, 0x2027c182, 0xffecc308, 0x8c16b1c8, 0x53ddb342, 0x6752db7b, 0xb899d9f1, 0x0e6be281, 0xd1a0e00b, 0xe52f8832, 0x3ae48ab8, 0x491ef878, 0x96d5faf2, 0xa25a92cb, 0x7d919041, 0xf6d75d29, 0x291c5fa3, 0x1d93379a, 0xc2583510, +0xb1a247d0, 0x6e69455a, 0x5ae62d63, 0x852d2fe9, 0x33df1499, 0xec141613, 0xd89b7e2a, 0x07507ca0, 0x74aa0e60, 0xab610cea, 0x9fee64d3, 0x40256659, 0x7e96a86c, 0xa15daae6, 0x95d2c2df, 0x4a19c055, 0x39e3b295, 0xe628b01f, 0xd2a7d826, 0x0d6cdaac, +0xbb9ee1dc, 0x6455e356, 0x50da8b6f, 0x8f1189e5, 0xfcebfb25, 0x2320f9af, 0x17af9196, 0xc864931c, 0xa9184b13, 0x76d34999, 0x425c21a0, 0x9d97232a, 0xee6d51ea, 0x31a65360, 0x05293b59, 0xdae239d3, 0x6c1002a3, 0xb3db0029, 0x87546810, 0x589f6a9a, +0x2b65185a, 0xf4ae1ad0, 0xc02172e9, 0x1fea7063, 0x2159be56, 0xfe92bcdc, 0xca1dd4e5, 0x15d6d66f, 0x662ca4af, 0xb9e7a625, 0x8d68ce1c, 0x52a3cc96, 0xe451f7e6, 0x3b9af56c, 0x0f159d55, 0xd0de9fdf, 0xa324ed1f, 0x7cefef95, 0x486087ac, 0x97ab8526, +0x1ced484e, 0xc3264ac4, 0xf7a922fd, 0x28622077, 0x5b9852b7, 0x8453503d, 0xb0dc3804, 0x6f173a8e, 0xd9e501fe, 0x062e0374, 0x32a16b4d, 0xed6a69c7, 0x9e901b07, 0x415b198d, 0x75d471b4, 0xaa1f733e, 0x94acbd0b, 0x4b67bf81, 0x7fe8d7b8, 0xa023d532, +0xd3d9a7f2, 0x0c12a578, 0x389dcd41, 0xe756cfcb, 0x51a4f4bb, 0x8e6ff631, 0xbae09e08, 0x652b9c82, 0x16d1ee42, 0xc91aecc8, 0xfd9584f1, 0x225e867b, 0xea3a1567, 0x35f117ed, 0x017e7fd4, 0xdeb57d5e, 0xad4f0f9e, 0x72840d14, 0x460b652d, 0x99c067a7, +0x2f325cd7, 0xf0f95e5d, 0xc4763664, 0x1bbd34ee, 0x6847462e, 0xb78c44a4, 0x83032c9d, 0x5cc82e17, 0x627be022, 0xbdb0e2a8, 0x893f8a91, 0x56f4881b, 0x250efadb, 0xfac5f851, 0xce4a9068, 0x118192e2, 0xa773a992, 0x78b8ab18, 0x4c37c321, 0x93fcc1ab, +0xe006b36b, 0x3fcdb1e1, 0x0b42d9d8, 0xd489db52, 0x5fcf163a, 0x800414b0, 0xb48b7c89, 0x6b407e03, 0x18ba0cc3, 0xc7710e49, 0xf3fe6670, 0x2c3564fa, 0x9ac75f8a, 0x450c5d00, 0x71833539, 0xae4837b3, 0xddb24573, 0x027947f9, 0x36f62fc0, 0xe93d2d4a, +0xd78ee37f, 0x0845e1f5, 0x3cca89cc, 0xe3018b46, 0x90fbf986, 0x4f30fb0c, 0x7bbf9335, 0xa47491bf, 0x1286aacf, 0xcd4da845, 0xf9c2c07c, 0x2609c2f6, 0x55f3b036, 0x8a38b2bc, 0xbeb7da85, 0x617cd80f, 0x00000000, 0xbd8f0129, 0x77022552, 0xca8d247b, +0xe9e3082e, 0x546c0907, 0x9ee12d7c, 0x236e2c55, 0x8da2e066, 0x302de14f, 0xfaa0c534, 0x472fc41d, 0x6441e848, 0xd9cee961, 0x1343cd1a, 0xaecccc33, 0xf4ab4d32, 0x49244c1b, 0x83a96860, 0x3e266949, 0x1d48451c, 0xa0c74435, 0x6a4a604e, 0xd7c56167, +0x7909ad54, 0xc486ac7d, 0x0e0b8806, 0xb384892f, 0x90eaa57a, 0x2d65a453, 0xe7e88028, 0x5a678101, 0xe0d6d75b, 0x5d59d672, 0x97d4f209, 0x2a5bf320, 0x0935df75, 0xb4bade5c, 0x7e37fa27, 0xc3b8fb0e, 0x6d74373d, 0xd0fb3614, 0x1a76126f, 0xa7f91346, +0x84973f13, 0x39183e3a, 0xf3951a41, 0x4e1a1b68, 0x147d9a69, 0xa9f29b40, 0x637fbf3b, 0xdef0be12, 0xfd9e9247, 0x4011936e, 0x8a9cb715, 0x3713b63c, 0x99df7a0f, 0x24507b26, 0xeedd5f5d, 0x53525e74, 0x703c7221, 0xcdb37308, 0x073e5773, 0xbab1565a, +0xd1b74432, 0x6c38451b, 0xa6b56160, 0x1b3a6049, 0x38544c1c, 0x85db4d35, 0x4f56694e, 0xf2d96867, 0x5c15a454, 0xe19aa57d, 0x2b178106, 0x9698802f, 0xb5f6ac7a, 0x0879ad53, 0xc2f48928, 0x7f7b8801, 0x251c0900, 0x98930829, 0x521e2c52, 0xef912d7b, +0xccff012e, 0x71700007, 0xbbfd247c, 0x06722555, 0xa8bee966, 0x1531e84f, 0xdfbccc34, 0x6233cd1d, 0x415de148, 0xfcd2e061, 0x365fc41a, 0x8bd0c533, 0x31619369, 0x8cee9240, 0x4663b63b, 0xfbecb712, 0xd8829b47, 0x650d9a6e, 0xaf80be15, 0x120fbf3c, +0xbcc3730f, 0x014c7226, 0xcbc1565d, 0x764e5774, 0x55207b21, 0xe8af7a08, 0x22225e73, 0x9fad5f5a, 0xc5cade5b, 0x7845df72, 0xb2c8fb09, 0x0f47fa20, 0x2c29d675, 0x91a6d75c, 0x5b2bf327, 0xe6a4f20e, 0x48683e3d, 0xf5e73f14, 0x3f6a1b6f, 0x82e51a46, +0xa18b3613, 0x1c04373a, 0xd6891341, 0x6b061268, 0xd4221011, 0x69ad1138, 0xa3203543, 0x1eaf346a, 0x3dc1183f, 0x804e1916, 0x4ac33d6d, 0xf74c3c44, 0x5980f077, 0xe40ff15e, 0x2e82d525, 0x930dd40c, 0xb063f859, 0x0decf970, 0xc761dd0b, 0x7aeedc22, +0x20895d23, 0x9d065c0a, 0x578b7871, 0xea047958, 0xc96a550d, 0x74e55424, 0xbe68705f, 0x03e77176, 0xad2bbd45, 0x10a4bc6c, 0xda299817, 0x67a6993e, 0x44c8b56b, 0xf947b442, 0x33ca9039, 0x8e459110, 0x34f4c74a, 0x897bc663, 0x43f6e218, 0xfe79e331, +0xdd17cf64, 0x6098ce4d, 0xaa15ea36, 0x179aeb1f, 0xb956272c, 0x04d92605, 0xce54027e, 0x73db0357, 0x50b52f02, 0xed3a2e2b, 0x27b70a50, 0x9a380b79, 0xc05f8a78, 0x7dd08b51, 0xb75daf2a, 0x0ad2ae03, 0x29bc8256, 0x9433837f, 0x5ebea704, 0xe331a62d, +0x4dfd6a1e, 0xf0726b37, 0x3aff4f4c, 0x87704e65, 0xa41e6230, 0x19916319, 0xd31c4762, 0x6e93464b, 0x05955423, 0xb81a550a, 0x72977171, 0xcf187058, 0xec765c0d, 0x51f95d24, 0x9b74795f, 0x26fb7876, 0x8837b445, 0x35b8b56c, 0xff359117, 0x42ba903e, +0x61d4bc6b, 0xdc5bbd42, 0x16d69939, 0xab599810, 0xf13e1911, 0x4cb11838, 0x863c3c43, 0x3bb33d6a, 0x18dd113f, 0xa5521016, 0x6fdf346d, 0xd2503544, 0x7c9cf977, 0xc113f85e, 0x0b9edc25, 0xb611dd0c, 0x957ff159, 0x28f0f070, 0xe27dd40b, 0x5ff2d522, +0xe5438378, 0x58cc8251, 0x9241a62a, 0x2fcea703, 0x0ca08b56, 0xb12f8a7f, 0x7ba2ae04, 0xc62daf2d, 0x68e1631e, 0xd56e6237, 0x1fe3464c, 0xa26c4765, 0x81026b30, 0x3c8d6a19, 0xf6004e62, 0x4b8f4f4b, 0x11e8ce4a, 0xac67cf63, 0x66eaeb18, 0xdb65ea31, +0xf80bc664, 0x4584c74d, 0x8f09e336, 0x3286e21f, 0x9c4a2e2c, 0x21c52f05, 0xeb480b7e, 0x56c70a57, 0x75a92602, 0xc826272b, 0x02ab0350, 0xbf240279, 0x00000000, 0xec53bc25, 0x0b7f7822, 0xe72cc407, 0x38c0f405, 0xd4934820, 0x33bf8c27, 0xdfec3002, +0x49a0674d, 0xa5f3db68, 0x42df1f6f, 0xae8ca34a, 0x71609348, 0x9d332f6d, 0x7a1feb6a, 0x964c574f, 0x6421225e, 0x88729e7b, 0x6f5e5a7c, 0x830de659, 0x5ce1d65b, 0xb0b26a7e, 0x579eae79, 0xbbcd125c, 0x2d814513, 0xc1d2f936, 0x26fe3d31, 0xcaad8114, +0x1541b116, 0xf9120d33, 0x1e3ec934, 0xf26d7511, 0xa22fc9b3, 0x4e7c7596, 0xa950b191, 0x45030db4, 0x9aef3db6, 0x76bc8193, 0x91904594, 0x7dc3f9b1, 0xeb8faefe, 0x07dc12db, 0xe0f0d6dc, 0x0ca36af9, 0xd34f5afb, 0x3f1ce6de, 0xd83022d9, 0x34639efc, +0xc60eebed, 0x2a5d57c8, 0xcd7193cf, 0x21222fea, 0xfece1fe8, 0x129da3cd, 0xf5b167ca, 0x19e2dbef, 0x8fae8ca0, 0x63fd3085, 0x84d1f482, 0x688248a7, 0xb76e78a5, 0x5b3dc480, 0xbc110087, 0x5042bca2, 0xa9a81b0c, 0x45fba729, 0xa2d7632e, 0x4e84df0b, +0x9168ef09, 0x7d3b532c, 0x9a17972b, 0x76442b0e, 0xe0087c41, 0x0c5bc064, 0xeb770463, 0x0724b846, 0xd8c88844, 0x349b3461, 0xd3b7f066, 0x3fe44c43, 0xcd893952, 0x21da8577, 0xc6f64170, 0x2aa5fd55, 0xf549cd57, 0x191a7172, 0xfe36b575, 0x12650950, +0x84295e1f, 0x687ae23a, 0x8f56263d, 0x63059a18, 0xbce9aa1a, 0x50ba163f, 0xb796d238, 0x5bc56e1d, 0x0b87d2bf, 0xe7d46e9a, 0x00f8aa9d, 0xecab16b8, 0x334726ba, 0xdf149a9f, 0x38385e98, 0xd46be2bd, 0x4227b5f2, 0xae7409d7, 0x4958cdd0, 0xa50b71f5, +0x7ae741f7, 0x96b4fdd2, 0x719839d5, 0x9dcb85f0, 0x6fa6f0e1, 0x83f54cc4, 0x64d988c3, 0x888a34e6, 0x576604e4, 0xbb35b8c1, 0x5c197cc6, 0xb04ac0e3, 0x260697ac, 0xca552b89, 0x2d79ef8e, 0xc12a53ab, 0x1ec663a9, 0xf295df8c, 0x15b91b8b, 0xf9eaa7ae, +0xfa5fe6ac, 0x160c5a89, 0xf1209e8e, 0x1d7322ab, 0xc29f12a9, 0x2eccae8c, 0xc9e06a8b, 0x25b3d6ae, 0xb3ff81e1, 0x5fac3dc4, 0xb880f9c3, 0x54d345e6, 0x8b3f75e4, 0x676cc9c1, 0x80400dc6, 0x6c13b1e3, 0x9e7ec4f2, 0x722d78d7, 0x9501bcd0, 0x795200f5, +0xa6be30f7, 0x4aed8cd2, 0xadc148d5, 0x4192f4f0, 0xd7dea3bf, 0x3b8d1f9a, 0xdca1db9d, 0x30f267b8, 0xef1e57ba, 0x034deb9f, 0xe4612f98, 0x083293bd, 0x58702f1f, 0xb423933a, 0x530f573d, 0xbf5ceb18, 0x60b0db1a, 0x8ce3673f, 0x6bcfa338, 0x879c1f1d, +0x11d04852, 0xfd83f477, 0x1aaf3070, 0xf6fc8c55, 0x2910bc57, 0xc5430072, 0x226fc475, 0xce3c7850, 0x3c510d41, 0xd002b164, 0x372e7563, 0xdb7dc946, 0x0491f944, 0xe8c24561, 0x0fee8166, 0xe3bd3d43, 0x75f16a0c, 0x99a2d629, 0x7e8e122e, 0x92ddae0b, +0x4d319e09, 0xa162222c, 0x464ee62b, 0xaa1d5a0e, 0x53f7fda0, 0xbfa44185, 0x58888582, 0xb4db39a7, 0x6b3709a5, 0x8764b580, 0x60487187, 0x8c1bcda2, 0x1a579aed, 0xf60426c8, 0x1128e2cf, 0xfd7b5eea, 0x22976ee8, 0xcec4d2cd, 0x29e816ca, 0xc5bbaaef, +0x37d6dffe, 0xdb8563db, 0x3ca9a7dc, 0xd0fa1bf9, 0x0f162bfb, 0xe34597de, 0x046953d9, 0xe83aeffc, 0x7e76b8b3, 0x92250496, 0x7509c091, 0x995a7cb4, 0x46b64cb6, 0xaae5f093, 0x4dc93494, 0xa19a88b1, 0xf1d83413, 0x1d8b8836, 0xfaa74c31, 0x16f4f014, +0xc918c016, 0x254b7c33, 0xc267b834, 0x2e340411, 0xb878535e, 0x542bef7b, 0xb3072b7c, 0x5f549759, 0x80b8a75b, 0x6ceb1b7e, 0x8bc7df79, 0x6794635c, 0x95f9164d, 0x79aaaa68, 0x9e866e6f, 0x72d5d24a, 0xad39e248, 0x416a5e6d, 0xa6469a6a, 0x4a15264f, +0xdc597100, 0x300acd25, 0xd7260922, 0x3b75b507, 0xe4998505, 0x08ca3920, 0xefe6fd27, 0x03b54102, 0x00000000, 0xe8e53756, 0x5b69de6d, 0xb38ce93b, 0x309faa7b, 0xd87a9d2d, 0x6bf67416, 0x83134340, 0xd27efcc8, 0x3a9bcb9e, 0x891722a5, 0x61f215f3, +0xe2e156b3, 0x0a0461e5, 0xb98888de, 0x516dbf88, 0xfad160dc, 0x1234578a, 0xa1b8beb1, 0x495d89e7, 0xca4ecaa7, 0x22abfdf1, 0x912714ca, 0x79c2239c, 0x28af9c14, 0xc04aab42, 0x73c64279, 0x9b23752f, 0x1830366f, 0xf0d50139, 0x4359e802, 0xabbcdf54, +0x91f454cb, 0x7911639d, 0xca9d8aa6, 0x2278bdf0, 0xa16bfeb0, 0x498ec9e6, 0xfa0220dd, 0x12e7178b, 0x438aa803, 0xab6f9f55, 0x18e3766e, 0xf0064138, 0x73150278, 0x9bf0352e, 0x287cdc15, 0xc099eb43, 0x6b253417, 0x83c00341, 0x304cea7a, 0xd8a9dd2c, +0x5bba9e6c, 0xb35fa93a, 0x00d34001, 0xe8367757, 0xb95bc8df, 0x51beff89, 0xe23216b2, 0x0ad721e4, 0x89c462a4, 0x612155f2, 0xd2adbcc9, 0x3a488b9f, 0x630922de, 0x8bec1588, 0x3860fcb3, 0xd085cbe5, 0x539688a5, 0xbb73bff3, 0x08ff56c8, 0xe01a619e, +0xb177de16, 0x5992e940, 0xea1e007b, 0x02fb372d, 0x81e8746d, 0x690d433b, 0xda81aa00, 0x32649d56, 0x99d84202, 0x713d7554, 0xc2b19c6f, 0x2a54ab39, 0xa947e879, 0x41a2df2f, 0xf22e3614, 0x1acb0142, 0x4ba6beca, 0xa343899c, 0x10cf60a7, 0xf82a57f1, +0x7b3914b1, 0x93dc23e7, 0x2050cadc, 0xc8b5fd8a, 0xf2fd7615, 0x1a184143, 0xa994a878, 0x41719f2e, 0xc262dc6e, 0x2a87eb38, 0x990b0203, 0x71ee3555, 0x20838add, 0xc866bd8b, 0x7bea54b0, 0x930f63e6, 0x101c20a6, 0xf8f917f0, 0x4b75fecb, 0xa390c99d, +0x082c16c9, 0xe0c9219f, 0x5345c8a4, 0xbba0fff2, 0x38b3bcb2, 0xd0568be4, 0x63da62df, 0x8b3f5589, 0xda52ea01, 0x32b7dd57, 0x813b346c, 0x69de033a, 0xeacd407a, 0x0228772c, 0xb1a49e17, 0x5941a941, 0xcd59eb65, 0x25bcdc33, 0x96303508, 0x7ed5025e, +0xfdc6411e, 0x15237648, 0xa6af9f73, 0x4e4aa825, 0x1f2717ad, 0xf7c220fb, 0x444ec9c0, 0xacabfe96, 0x2fb8bdd6, 0xc75d8a80, 0x74d163bb, 0x9c3454ed, 0x37888bb9, 0xdf6dbcef, 0x6ce155d4, 0x84046282, 0x071721c2, 0xeff21694, 0x5c7effaf, 0xb49bc8f9, +0xe5f67771, 0x0d134027, 0xbe9fa91c, 0x567a9e4a, 0xd569dd0a, 0x3d8cea5c, 0x8e000367, 0x66e53431, 0x5cadbfae, 0xb44888f8, 0x07c461c3, 0xef215695, 0x6c3215d5, 0x84d72283, 0x375bcbb8, 0xdfbefcee, 0x8ed34366, 0x66367430, 0xd5ba9d0b, 0x3d5faa5d, +0xbe4ce91d, 0x56a9de4b, 0xe5253770, 0x0dc00026, 0xa67cdf72, 0x4e99e824, 0xfd15011f, 0x15f03649, 0x96e37509, 0x7e06425f, 0xcd8aab64, 0x256f9c32, 0x740223ba, 0x9ce714ec, 0x2f6bfdd7, 0xc78eca81, 0x449d89c1, 0xac78be97, 0x1ff457ac, 0xf71160fa, +0xae50c9bb, 0x46b5feed, 0xf53917d6, 0x1ddc2080, 0x9ecf63c0, 0x762a5496, 0xc5a6bdad, 0x2d438afb, 0x7c2e3573, 0x94cb0225, 0x2747eb1e, 0xcfa2dc48, 0x4cb19f08, 0xa454a85e, 0x17d84165, 0xff3d7633, 0x5481a967, 0xbc649e31, 0x0fe8770a, 0xe70d405c, +0x641e031c, 0x8cfb344a, 0x3f77dd71, 0xd792ea27, 0x86ff55af, 0x6e1a62f9, 0xdd968bc2, 0x3573bc94, 0xb660ffd4, 0x5e85c882, 0xed0921b9, 0x05ec16ef, 0x3fa49d70, 0xd741aa26, 0x64cd431d, 0x8c28744b, 0x0f3b370b, 0xe7de005d, 0x5452e966, 0xbcb7de30, +0xedda61b8, 0x053f56ee, 0xb6b3bfd5, 0x5e568883, 0xdd45cbc3, 0x35a0fc95, 0x862c15ae, 0x6ec922f8, 0xc575fdac, 0x2d90cafa, 0x9e1c23c1, 0x76f91497, 0xf5ea57d7, 0x1d0f6081, 0xae8389ba, 0x4666beec, 0x170b0164, 0xffee3632, 0x4c62df09, 0xa487e85f, +0x2794ab1f, 0xcf719c49, 0x7cfd7572, 0x94184224, 0x00000000, 0x7ce0f4f6, 0x6e047f8c, 0x12e48b7a, 0x71ee72ca, 0x0d0e863c, 0x1fea0d46, 0x630af9b0, 0xdc16415e, 0xa0f6b5a8, 0xb2123ed2, 0xcef2ca24, 0xadf83394, 0xd118c762, 0xc3fc4c18, 0xbf1cb8ee, +0x37839a07, 0x4b636ef1, 0x5987e58b, 0x2567117d, 0x466de8cd, 0x3a8d1c3b, 0x28699741, 0x548963b7, 0xeb95db59, 0x97752faf, 0x8591a4d5, 0xf9715023, 0x9a7ba993, 0xe69b5d65, 0xf47fd61f, 0x889f22e9, 0x7e390b61, 0x02d9ff97, 0x103d74ed, 0x6cdd801b, +0x0fd779ab, 0x73378d5d, 0x61d30627, 0x1d33f2d1, 0xa22f4a3f, 0xdecfbec9, 0xcc2b35b3, 0xb0cbc145, 0xd3c138f5, 0xaf21cc03, 0xbdc54779, 0xc125b38f, 0x49ba9166, 0x355a6590, 0x27beeeea, 0x5b5e1a1c, 0x3854e3ac, 0x44b4175a, 0x56509c20, 0x2ab068d6, +0x95acd038, 0xe94c24ce, 0xfba8afb4, 0x87485b42, 0xe442a2f2, 0x98a25604, 0x8a46dd7e, 0xf6a62988, 0x55e10c02, 0x2901f8f4, 0x3be5738e, 0x47058778, 0x240f7ec8, 0x58ef8a3e, 0x4a0b0144, 0x36ebf5b2, 0x89f74d5c, 0xf517b9aa, 0xe7f332d0, 0x9b13c626, +0xf8193f96, 0x84f9cb60, 0x961d401a, 0xeafdb4ec, 0x62629605, 0x1e8262f3, 0x0c66e989, 0x70861d7f, 0x138ce4cf, 0x6f6c1039, 0x7d889b43, 0x01686fb5, 0xbe74d75b, 0xc29423ad, 0xd070a8d7, 0xac905c21, 0xcf9aa591, 0xb37a5167, 0xa19eda1d, 0xdd7e2eeb, +0x2bd80763, 0x5738f395, 0x45dc78ef, 0x393c8c19, 0x5a3675a9, 0x26d6815f, 0x34320a25, 0x48d2fed3, 0xf7ce463d, 0x8b2eb2cb, 0x99ca39b1, 0xe52acd47, 0x862034f7, 0xfac0c001, 0xe8244b7b, 0x94c4bf8d, 0x1c5b9d64, 0x60bb6992, 0x725fe2e8, 0x0ebf161e, +0x6db5efae, 0x11551b58, 0x03b19022, 0x7f5164d4, 0xc04ddc3a, 0xbcad28cc, 0xae49a3b6, 0xd2a95740, 0xb1a3aef0, 0xcd435a06, 0xdfa7d17c, 0xa347258a, 0x6054f6ad, 0x1cb4025b, 0x0e508921, 0x72b07dd7, 0x11ba8467, 0x6d5a7091, 0x7fbefbeb, 0x035e0f1d, +0xbc42b7f3, 0xc0a24305, 0xd246c87f, 0xaea63c89, 0xcdacc539, 0xb14c31cf, 0xa3a8bab5, 0xdf484e43, 0x57d76caa, 0x2b37985c, 0x39d31326, 0x4533e7d0, 0x26391e60, 0x5ad9ea96, 0x483d61ec, 0x34dd951a, 0x8bc12df4, 0xf721d902, 0xe5c55278, 0x9925a68e, +0xfa2f5f3e, 0x86cfabc8, 0x942b20b2, 0xe8cbd444, 0x1e6dfdcc, 0x628d093a, 0x70698240, 0x0c8976b6, 0x6f838f06, 0x13637bf0, 0x0187f08a, 0x7d67047c, 0xc27bbc92, 0xbe9b4864, 0xac7fc31e, 0xd09f37e8, 0xb395ce58, 0xcf753aae, 0xdd91b1d4, 0xa1714522, +0x29ee67cb, 0x550e933d, 0x47ea1847, 0x3b0aecb1, 0x58001501, 0x24e0e1f7, 0x36046a8d, 0x4ae49e7b, 0xf5f82695, 0x8918d263, 0x9bfc5919, 0xe71cadef, 0x8416545f, 0xf8f6a0a9, 0xea122bd3, 0x96f2df25, 0x35b5faaf, 0x49550e59, 0x5bb18523, 0x275171d5, +0x445b8865, 0x38bb7c93, 0x2a5ff7e9, 0x56bf031f, 0xe9a3bbf1, 0x95434f07, 0x87a7c47d, 0xfb47308b, 0x984dc93b, 0xe4ad3dcd, 0xf649b6b7, 0x8aa94241, 0x023660a8, 0x7ed6945e, 0x6c321f24, 0x10d2ebd2, 0x73d81262, 0x0f38e694, 0x1ddc6dee, 0x613c9918, +0xde2021f6, 0xa2c0d500, 0xb0245e7a, 0xccc4aa8c, 0xafce533c, 0xd32ea7ca, 0xc1ca2cb0, 0xbd2ad846, 0x4b8cf1ce, 0x376c0538, 0x25888e42, 0x59687ab4, 0x3a628304, 0x468277f2, 0x5466fc88, 0x2886087e, 0x979ab090, 0xeb7a4466, 0xf99ecf1c, 0x857e3bea, +0xe674c25a, 0x9a9436ac, 0x8870bdd6, 0xf4904920, 0x7c0f6bc9, 0x00ef9f3f, 0x120b1445, 0x6eebe0b3, 0x0de11903, 0x7101edf5, 0x63e5668f, 0x1f059279, 0xa0192a97, 0xdcf9de61, 0xce1d551b, 0xb2fda1ed, 0xd1f7585d, 0xad17acab, 0xbff327d1, 0xc313d327, +0x00000000, 0x3c7065a5, 0xcc010c65, 0xf07169c0, 0xa3f02ae1, 0x9f804f44, 0x6ff12684, 0x53814321, 0x0a8b9035, 0x36fbf590, 0xc68a9c50, 0xfafaf9f5, 0xa97bbad4, 0x950bdf71, 0x657ab6b1, 0x590ad314, 0x6fe1c220, 0x5391a785, 0xa3e0ce45, 0x9f90abe0, +0xcc11e8c1, 0xf0618d64, 0x0010e4a4, 0x3c608101, 0x656a5215, 0x591a37b0, 0xa96b5e70, 0x951b3bd5, 0xc69a78f4, 0xfaea1d51, 0x0a9b7491, 0x36eb1134, 0x07a2bf50, 0x3bd2daf5, 0xcba3b335, 0xf7d3d690, 0xa45295b1, 0x9822f014, 0x685399d4, 0x5423fc71, +0x0d292f65, 0x31594ac0, 0xc1282300, 0xfd5846a5, 0xaed90584, 0x92a96021, 0x62d809e1, 0x5ea86c44, 0x68437d70, 0x543318d5, 0xa4427115, 0x983214b0, 0xcbb35791, 0xf7c33234, 0x07b25bf4, 0x3bc23e51, 0x62c8ed45, 0x5eb888e0, 0xaec9e120, 0x92b98485, +0xc138c7a4, 0xfd48a201, 0x0d39cbc1, 0x3149ae64, 0xc0aeee95, 0xfcde8b30, 0x0cafe2f0, 0x30df8755, 0x635ec474, 0x5f2ea1d1, 0xaf5fc811, 0x932fadb4, 0xca257ea0, 0xf6551b05, 0x062472c5, 0x3a541760, 0x69d55441, 0x55a531e4, 0xa5d45824, 0x99a43d81, +0xaf4f2cb5, 0x933f4910, 0x634e20d0, 0x5f3e4575, 0x0cbf0654, 0x30cf63f1, 0xc0be0a31, 0xfcce6f94, 0xa5c4bc80, 0x99b4d925, 0x69c5b0e5, 0x55b5d540, 0x06349661, 0x3a44f3c4, 0xca359a04, 0xf645ffa1, 0xc70c51c5, 0xfb7c3460, 0x0b0d5da0, 0x377d3805, +0x64fc7b24, 0x588c1e81, 0xa8fd7741, 0x948d12e4, 0xcd87c1f0, 0xf1f7a455, 0x0186cd95, 0x3df6a830, 0x6e77eb11, 0x52078eb4, 0xa276e774, 0x9e0682d1, 0xa8ed93e5, 0x949df640, 0x64ec9f80, 0x589cfa25, 0x0b1db904, 0x376ddca1, 0xc71cb561, 0xfb6cd0c4, +0xa26603d0, 0x9e166675, 0x6e670fb5, 0x52176a10, 0x01962931, 0x3de64c94, 0xcd972554, 0xf1e740f1, 0xa84bba4e, 0x943bdfeb, 0x644ab62b, 0x583ad38e, 0x0bbb90af, 0x37cbf50a, 0xc7ba9cca, 0xfbcaf96f, 0xa2c02a7b, 0x9eb04fde, 0x6ec1261e, 0x52b143bb, +0x0130009a, 0x3d40653f, 0xcd310cff, 0xf141695a, 0xc7aa786e, 0xfbda1dcb, 0x0bab740b, 0x37db11ae, 0x645a528f, 0x582a372a, 0xa85b5eea, 0x942b3b4f, 0xcd21e85b, 0xf1518dfe, 0x0120e43e, 0x3d50819b, 0x6ed1c2ba, 0x52a1a71f, 0xa2d0cedf, 0x9ea0ab7a, +0xafe9051e, 0x939960bb, 0x63e8097b, 0x5f986cde, 0x0c192fff, 0x30694a5a, 0xc018239a, 0xfc68463f, 0xa562952b, 0x9912f08e, 0x6963994e, 0x5513fceb, 0x0692bfca, 0x3ae2da6f, 0xca93b3af, 0xf6e3d60a, 0xc008c73e, 0xfc78a29b, 0x0c09cb5b, 0x3079aefe, +0x63f8eddf, 0x5f88887a, 0xaff9e1ba, 0x9389841f, 0xca83570b, 0xf6f332ae, 0x06825b6e, 0x3af23ecb, 0x69737dea, 0x5503184f, 0xa572718f, 0x9902142a, 0x68e554db, 0x5495317e, 0xa4e458be, 0x98943d1b, 0xcb157e3a, 0xf7651b9f, 0x0714725f, 0x3b6417fa, +0x626ec4ee, 0x5e1ea14b, 0xae6fc88b, 0x921fad2e, 0xc19eee0f, 0xfdee8baa, 0x0d9fe26a, 0x31ef87cf, 0x070496fb, 0x3b74f35e, 0xcb059a9e, 0xf775ff3b, 0xa4f4bc1a, 0x9884d9bf, 0x68f5b07f, 0x5485d5da, 0x0d8f06ce, 0x31ff636b, 0xc18e0aab, 0xfdfe6f0e, +0xae7f2c2f, 0x920f498a, 0x627e204a, 0x5e0e45ef, 0x6f47eb8b, 0x53378e2e, 0xa346e7ee, 0x9f36824b, 0xccb7c16a, 0xf0c7a4cf, 0x00b6cd0f, 0x3cc6a8aa, 0x65cc7bbe, 0x59bc1e1b, 0xa9cd77db, 0x95bd127e, 0xc63c515f, 0xfa4c34fa, 0x0a3d5d3a, 0x364d389f, +0x00a629ab, 0x3cd64c0e, 0xcca725ce, 0xf0d7406b, 0xa356034a, 0x9f2666ef, 0x6f570f2f, 0x53276a8a, 0x0a2db99e, 0x365ddc3b, 0xc62cb5fb, 0xfa5cd05e, 0xa9dd937f, 0x95adf6da, 0x65dc9f1a, 0x59acfabf, ] + +d0x6a0a8b20=[ 0x16, 0x67, 0xb6, 0xda, 0xdb, 0xcb, 0x4a, 0xca, 0x90, 0x94, 0xf4, 0x7f, 0x9a, 0x9c, 0x8f, 0x1f, 0x05, 0xb1, 0x8b, 0x62, 0xa2, 0x2b, 0x82, 0x57, 0xf8, 0x29, 0xf1, 0x22, 0x2e, 0x89, 0xe5, 0x50, 0xe6, 0xcd, 0x53, 0x77, 0xc0, 0x09, 0x5c, 0xdf, +0x9d, 0x6a, 0x7d, 0x21, 0xdd, 0x6f, 0x86, 0x39, 0xdc, 0x5e, 0x5a, 0xaa, 0xe7, 0x35, 0x20, 0x61, 0xc7, 0xc2, 0x59, 0xb8, 0x56, 0x78, 0x72, 0x4d, 0x58, 0xd5, 0xc3, 0x99, 0xaf, 0xd9, 0x3a, 0x0c, 0xd8, 0x17, 0x3c, 0x1a, 0xc1, 0x3e, 0x63, 0x1d, +0xef, 0x19, 0x80, 0x4b, 0xb2, 0x7e, 0x9f, 0xc9, 0xe0, 0x88, 0xfd, 0xd4, 0xbe, 0xe9, 0xa7, 0x43, 0xe3, 0x12, 0xc6, 0xeb, 0x47, 0x01, 0x5d, 0xb9, 0x6d, 0xae, 0xd2, 0x26, 0x71, 0xb3, 0x5b, 0xfb, 0x06, 0x6c, 0x24, 0x54, 0xa0, 0x81, 0x49, 0x32, +0x41, 0xad, 0x2f, 0x84, 0x6e, 0xab, 0x11, 0xb7, 0x0d, 0x4e, 0x95, 0x66, 0xfc, 0x07, 0xbf, 0x6b, 0xe2, 0x04, 0xc4, 0xa1, 0xb0, 0xed, 0x1c, 0x02, 0x7c, 0xcf, 0x64, 0x3d, 0x33, 0xa6, 0x48, 0xd1, 0x74, 0xfa, 0x27, 0xc5, 0xba, 0x00, 0xac, 0x03, +0x7a, 0x4f, 0xbb, 0xf9, 0x23, 0x36, 0x98, 0x46, 0x31, 0x2c, 0xd0, 0xe1, 0x13, 0x9b, 0x87, 0x5f, 0xa9, 0x97, 0x10, 0xf7, 0xe8, 0x69, 0x68, 0x92, 0x65, 0xa8, 0xa5, 0xd6, 0x8d, 0xde, 0xb4, 0xa3, 0x38, 0xe4, 0x93, 0xf5, 0x83, 0xcc, 0xa4, 0x0a, +0xd3, 0x76, 0x44, 0x4c, 0x45, 0x85, 0x7b, 0x75, 0xd7, 0x0e, 0x8a, 0x9e, 0x1b, 0x40, 0xf6, 0x18, 0x1e, 0x70, 0x2a, 0x8e, 0xfe, 0xf3, 0xc8, 0xbc, 0x79, 0xce, 0xf2, 0x28, 0x15, 0x0f, 0x60, 0x3f, 0xbd, 0x3b, 0xf0, 0x08, 0xec, 0x51, 0x30, 0x0b, +0x8c, 0x37, 0x2d, 0x91, 0x52, 0x25, 0xea, 0x42, 0xff, 0xee, 0x96, 0x73, 0x14, 0xb5, 0x55, 0x34, 0x92, 0x51, 0xb6, 0x0a, 0x8f, 0x6d, 0x03, 0x72, 0x48, 0xe7, 0xb8, 0xa8, 0x36, 0xf4, 0xa9, 0x01, 0xd8, 0x98, 0x71, 0xaa, 0xbb, 0xb1, 0x5d, 0x17, +0xea, 0x89, 0xbf, 0xf1, 0xe6, 0xda, 0x68, 0x7a, 0x87, 0x69, 0x58, 0xa7, 0x3b, 0xf2, 0x2e, 0x39, 0xc2, 0xe9, 0x88, 0xfb, 0x4b, 0x5f, 0xca, 0x05, 0x86, 0x9d, 0x16, 0x8c, 0x7f, 0xec, 0x1d, 0x76, 0x21, 0x70, 0x94, 0xf6, 0xb9, 0x2f, 0xfd, 0x00, +0x9c, 0x23, 0x41, 0xc0, 0x38, 0x35, 0x83, 0xb5, 0xbe, 0xd0, 0x42, 0x18, 0x90, 0xcc, 0x27, 0x19, 0xc7, 0x2a, 0xee, 0xa2, 0xba, 0xdd, 0x28, 0x0d, 0x49, 0x6e, 0x6f, 0x3d, 0x50, 0x60, 0xf3, 0xd1, 0x96, 0x25, 0xed, 0x66, 0xd5, 0xf8, 0xac, 0xbd, +0x97, 0xd9, 0xcb, 0x6a, 0x84, 0x11, 0x12, 0x82, 0x74, 0x4e, 0x34, 0x2d, 0x73, 0x3e, 0x7e, 0x62, 0x75, 0x8b, 0x79, 0xdb, 0x77, 0x1e, 0xb7, 0xff, 0xe3, 0x0b, 0xce, 0x9e, 0xaf, 0x61, 0xb4, 0x30, 0x85, 0x02, 0xf5, 0xf9, 0x44, 0x9b, 0xc1, 0xd2, +0xb3, 0x3a, 0x37, 0x29, 0x40, 0x1f, 0xe5, 0x20, 0x8e, 0x54, 0xb2, 0x5e, 0xc8, 0x7c, 0xa6, 0xc3, 0x4d, 0x09, 0x4f, 0x06, 0xdf, 0x55, 0xc5, 0xbc, 0xa5, 0x8a, 0x08, 0x8d, 0x14, 0x4a, 0x63, 0x26, 0x22, 0x13, 0x5c, 0xde, 0x4c, 0x24, 0xfc, 0x9a, +0x0c, 0x5b, 0xe8, 0x46, 0x33, 0xeb, 0x0e, 0xdc, 0xfe, 0x3f, 0xb0, 0xe4, 0x7b, 0x53, 0x45, 0x65, 0xc4, 0x7d, 0x2c, 0xfa, 0x95, 0x67, 0xa0, 0x31, 0xd7, 0x1c, 0x04, 0xa1, 0x6c, 0x59, 0x32, 0xd3, 0x1a, 0x0f, 0x91, 0xae, 0xcf, 0x99, 0xa4, 0x64, +0xe2, 0x9f, 0xa3, 0x43, 0xe1, 0xf7, 0x93, 0x78, 0xd4, 0x10, 0x57, 0xc9, 0xab, 0x07, 0xc6, 0xcd, 0x6b, 0xd6, 0x47, 0x3c, 0x5a, 0xef, 0xe0, 0x1b, 0x52, 0x81, 0x15, 0x56, 0xad, 0x2b, 0xf0, 0x80, 0x46, 0xd9, 0x73, 0x30, 0x07, 0x0c, 0xc8, 0xe9, +0x2c, 0x7c, 0x58, 0xbe, 0xbc, 0xc3, 0xfd, 0x38, 0x4c, 0x7d, 0x7b, 0x23, 0xc4, 0x20, 0x8f, 0x05, 0xf6, 0xb4, 0xbb, 0x02, 0x63, 0x35, 0x70, 0x72, 0x3e, 0xc2, 0x18, 0xd3, 0x3b, 0x13, 0x79, 0xa7, 0x7a, 0x55, 0xa8, 0x81, 0x0b, 0x7e, 0x06, 0xde, +0xf0, 0x1c, 0xe2, 0xc1, 0xb2, 0xef, 0xa4, 0xb7, 0xd5, 0xbf, 0x7f, 0x9f, 0x37, 0xcc, 0x28, 0x5a, 0x5e, 0x8e, 0x47, 0xf2, 0x1b, 0x66, 0x9c, 0x64, 0x3a, 0xe5, 0xb5, 0x60, 0x84, 0xb0, 0x87, 0x5d, 0xa5, 0x77, 0x5f, 0x67, 0xfb, 0x27, 0x1f, 0x9a, +0x98, 0xb6, 0x3d, 0x1d, 0x14, 0xb1, 0x3f, 0xe8, 0x99, 0xab, 0xaa, 0x6a, 0xb9, 0x6f, 0x08, 0x0d, 0x94, 0xed, 0xf7, 0xb8, 0xee, 0x75, 0x0e, 0x8c, 0x88, 0xd7, 0xdf, 0xec, 0xa0, 0x49, 0x21, 0xc9, 0x0a, 0x31, 0x2e, 0x82, 0x9e, 0x4d, 0x96, 0xa1, +0x29, 0x53, 0x85, 0x95, 0x4b, 0x59, 0x01, 0xba, 0x25, 0x3c, 0xa9, 0xaf, 0x57, 0xf4, 0x74, 0x65, 0xae, 0x11, 0x62, 0x4e, 0xff, 0x5b, 0xac, 0xcb, 0xc7, 0x44, 0x9b, 0xca, 0x17, 0x03, 0x71, 0x69, 0x90, 0x26, 0xea, 0x04, 0xdc, 0x4f, 0xe1, 0xc5, +0xd2, 0xf5, 0x56, 0x22, 0xf8, 0xad, 0x91, 0xcd, 0xf3, 0x52, 0xe4, 0x54, 0x1e, 0x1a, 0x48, 0x00, 0x8d, 0xfa, 0x51, 0x8a, 0x10, 0x61, 0xe7, 0x83, 0x6e, 0x6d, 0x34, 0xd6, 0xa3, 0xe3, 0x92, 0x32, 0xfe, 0x97, 0xd0, 0x89, 0xbd, 0xa2, 0xe6, 0x19, +0xcf, 0xf1, 0x6c, 0x6b, 0xeb, 0x9d, 0x76, 0x24, 0x15, 0xd8, 0x8b, 0xe0, 0xc6, 0x39, 0x86, 0x41, 0x2b, 0x2a, 0x36, 0xf9, 0xd1, 0xb3, 0x5c, 0x0f, 0x33, 0x16, 0xdd, 0x50, 0x2d, 0xce, 0x12, 0x93, 0x68, 0x45, 0x80, 0x4a, 0xda, 0x43, 0x78, 0x42, +0x2f, 0xdb, 0xc0, 0xfc, 0xa6, 0x09, 0xd4, 0x40, 0xda, 0x0c, 0xec, 0xf8, 0xfe, 0x47, 0x57, 0x98, 0x74, 0xcb, 0x2c, 0x55, 0x69, 0xe8, 0x87, 0x0d, 0xdf, 0x91, 0xab, 0x2d, 0x15, 0x76, 0xac, 0xdc, 0x5c, 0xd5, 0x19, 0x05, 0xce, 0xd0, 0xb0, 0xfd, +0xd4, 0xba, 0x27, 0x62, 0x4d, 0x17, 0x51, 0x0f, 0x1a, 0x4e, 0x5a, 0x93, 0xbd, 0x7c, 0x54, 0x43, 0x59, 0x83, 0x8a, 0xc2, 0xef, 0x03, 0xf0, 0x99, 0x3d, 0xe6, 0x34, 0x81, 0xfb, 0xbb, 0x9e, 0x65, 0x4f, 0x78, 0xc6, 0x7d, 0x8c, 0x13, 0xb5, 0x41, +0xa8, 0xae, 0x0b, 0x38, 0x72, 0xeb, 0x89, 0xf6, 0xe4, 0x84, 0xb9, 0xb1, 0x09, 0x95, 0x1b, 0xed, 0x2f, 0x6e, 0xd1, 0xa9, 0x96, 0x1e, 0x31, 0x9c, 0xbe, 0x5b, 0x67, 0xfa, 0xb3, 0x42, 0xf7, 0xdd, 0xd3, 0xee, 0xf3, 0x73, 0x85, 0x70, 0x08, 0xb2, +0xd2, 0x0e, 0x1d, 0x48, 0xd8, 0xf1, 0xe0, 0xe7, 0xd9, 0x6f, 0x11, 0x3f, 0x06, 0xc1, 0x68, 0xb6, 0x14, 0x21, 0xfc, 0x66, 0x18, 0xf9, 0xb8, 0xa3, 0x49, 0x6b, 0x28, 0x7f, 0x92, 0xa2, 0x79, 0xd7, 0x75, 0x97, 0x5f, 0xbf, 0x4a, 0x3b, 0xe2, 0x9f, +0xb7, 0xa4, 0x02, 0x82, 0x36, 0xe9, 0x01, 0xa0, 0x1c, 0x39, 0xaa, 0x9b, 0x8d, 0xea, 0xbc, 0x3e, 0x44, 0x12, 0xa5, 0xc7, 0x61, 0xa1, 0xcc, 0x9d, 0xc8, 0x4c, 0x35, 0x86, 0xad, 0x63, 0x5d, 0xd6, 0x52, 0x90, 0x10, 0x8e, 0x23, 0x8b, 0x04, 0xc0, +0x16, 0xe5, 0x33, 0x0a, 0x2e, 0xff, 0x00, 0x4b, 0x07, 0x6a, 0x8f, 0x29, 0x7b, 0xca, 0x60, 0x7a, 0x45, 0x88, 0xaf, 0x53, 0x64, 0x40, 0x71, 0xa6, 0x94, 0xe1, 0x46, 0x30, 0xf5, 0xcd, 0xf4, 0x80, 0x50, 0x9a, 0x22, 0xc4, 0xcf, 0x6c, 0xde, 0x37, +0x77, 0x56, 0xb4, 0x20, 0xc9, 0xf2, 0x5e, 0x24, 0x1f, 0xa7, 0xdb, 0x3c, 0xc3, 0x3a, 0x32, 0xc5, 0x58, 0x26, 0xe3, 0x2b, 0x7e, 0x25, 0x6d, 0x2a, 0x4a, 0x28, 0xcb, 0xba, 0x70, 0x84, 0xa7, 0x11, 0x33, 0x59, 0xfc, 0xce, 0x63, 0x4b, 0x5b, 0x88, +0x7a, 0x6f, 0x47, 0x51, 0xe1, 0x6e, 0x52, 0x5c, 0x30, 0x09, 0xad, 0xf6, 0x1c, 0x0b, 0xde, 0x90, 0x1a, 0xb6, 0x73, 0xb8, 0xe6, 0xe3, 0xdd, 0xaf, 0xda, 0xfe, 0x9a, 0x0e, 0x1d, 0xc6, 0xf4, 0x3b, 0xf8, 0x50, 0xf0, 0x6a, 0x23, 0x43, 0x01, 0xbb, +0x68, 0xc1, 0x29, 0xfd, 0x15, 0xa8, 0x8f, 0x7d, 0xc3, 0x62, 0x0f, 0x2a, 0xcd, 0x98, 0x20, 0xb9, 0x5f, 0xc4, 0x42, 0x1f, 0x86, 0xd9, 0x10, 0x3f, 0xd1, 0x56, 0xc8, 0xa0, 0x12, 0xe2, 0x78, 0xd2, 0xf2, 0x05, 0xe0, 0x8d, 0x89, 0x95, 0xd4, 0x8e, +0x18, 0xc0, 0x97, 0x7f, 0x93, 0xb0, 0x03, 0x4c, 0xff, 0x35, 0x55, 0x21, 0x76, 0xf7, 0xca, 0x82, 0x2e, 0x0c, 0x72, 0xf9, 0xa6, 0x57, 0xa4, 0xdc, 0x44, 0xef, 0xaa, 0xc5, 0xa3, 0xe7, 0xfb, 0x4f, 0x6c, 0x2c, 0x13, 0x07, 0x66, 0xab, 0x17, 0x6d, +0xd6, 0x94, 0x49, 0x99, 0x3d, 0x36, 0x9c, 0x39, 0x91, 0xea, 0x58, 0xc9, 0x38, 0x37, 0x80, 0x27, 0x75, 0xe9, 0x1b, 0x9b, 0xed, 0x2f, 0x25, 0x3e, 0x74, 0x54, 0x5d, 0x1e, 0xcc, 0x34, 0x9d, 0x9f, 0x19, 0xa2, 0xc7, 0x00, 0xb4, 0xe5, 0xd3, 0x31, +0x65, 0xac, 0x2b, 0x48, 0x79, 0x32, 0xdf, 0xa1, 0x67, 0xf5, 0x7b, 0xb7, 0xa9, 0x96, 0x5a, 0xb1, 0x02, 0xbd, 0x08, 0x61, 0x4d, 0xee, 0xfa, 0x8c, 0xd8, 0xec, 0x26, 0xc2, 0x7c, 0xae, 0xdb, 0x8b, 0x6b, 0x22, 0x24, 0x41, 0x46, 0xf1, 0x2d, 0xeb, +0x40, 0xa5, 0x45, 0xe8, 0x85, 0xb5, 0xd7, 0x64, 0x77, 0xb2, 0x04, 0x81, 0x06, 0x5e, 0x69, 0xbc, 0x0a, 0x0d, 0x3c, 0x3a, 0xbf, 0xd0, 0x16, 0x71, 0xbe, 0xf3, 0x8a, 0xe4, 0x60, 0x87, 0xcf, 0x7e, 0x53, 0x4e, 0x83, 0x14, 0x9e, 0x92, 0xb3, 0xd5, +0x58, 0xf3, 0xcc, 0x08, 0x51, 0xd8, 0x4d, 0xc2, 0x9e, 0xf4, 0x43, 0x9c, 0x2f, 0x9a, 0xbc, 0x9f, 0x7c, 0x18, 0x44, 0x67, 0xe4, 0xa4, 0x64, 0x60, 0xb3, 0x0d, 0xc0, 0x02, 0xcb, 0x86, 0x6f, 0x03, 0xb6, 0x3a, 0x28, 0x80, 0xcf, 0xd3, 0xfc, 0x72, +0xbb, 0xb8, 0x94, 0x35, 0x9b, 0x40, 0x32, 0x6b, 0x47, 0xbf, 0xe1, 0xf2, 0x98, 0x63, 0x2d, 0x19, 0x90, 0x27, 0xd2, 0x4c, 0x3c, 0x22, 0x5a, 0xc8, 0x2e, 0x04, 0xd7, 0x6a, 0x11, 0x96, 0xa8, 0x5b, 0xab, 0x34, 0x7b, 0x24, 0x05, 0xa9, 0x09, 0xef, +0x37, 0x8c, 0xd6, 0xec, 0x8a, 0x25, 0xa3, 0x00, 0x6c, 0x89, 0x33, 0x39, 0xe5, 0x70, 0x31, 0x7a, 0x30, 0xc1, 0x57, 0x1d, 0x36, 0xa6, 0xaa, 0x93, 0xbd, 0x49, 0xf7, 0xee, 0xca, 0xda, 0xd5, 0x1f, 0xcd, 0xfa, 0xe9, 0x2c, 0xb9, 0xb2, 0xe3, 0x0a, +0x0c, 0x91, 0x6d, 0x16, 0x8f, 0x83, 0x20, 0xf1, 0xc6, 0x68, 0x8e, 0x81, 0x78, 0x65, 0x41, 0x15, 0x74, 0xb4, 0xe2, 0xba, 0x3f, 0x7d, 0xdc, 0xa5, 0xa1, 0xc3, 0x1a, 0xbe, 0x4b, 0x53, 0xf8, 0x79, 0x77, 0x55, 0xc5, 0x1c, 0x17, 0xfd, 0xe8, 0xff, +0xeb, 0xdb, 0x76, 0x50, 0x3d, 0xe0, 0xdd, 0x14, 0xaf, 0xfe, 0x9d, 0x10, 0x2a, 0x2b, 0x6e, 0xd1, 0x88, 0xde, 0x0e, 0x95, 0xf5, 0xf0, 0x13, 0x99, 0x45, 0x12, 0x97, 0x3e, 0xad, 0x5d, 0x61, 0xa0, 0x38, 0x71, 0xf9, 0x0f, 0x5e, 0xe6, 0x66, 0x59, +0x06, 0x26, 0x56, 0x7f, 0xe7, 0x1b, 0x75, 0xa7, 0x4f, 0xb0, 0xc7, 0x92, 0xfb, 0xdf, 0x3b, 0x69, 0x87, 0xb1, 0xed, 0x8d, 0x01, 0xf6, 0xb5, 0x48, 0xd9, 0xd4, 0x1e, 0x82, 0x62, 0x85, 0x52, 0xc4, 0x42, 0xac, 0xce, 0xc9, 0x46, 0x8b, 0x54, 0x73, +0x23, 0x0b, 0xa2, 0x7e, 0x07, 0xd0, 0x5c, 0x84, 0xea, 0xae, 0x29, 0x21, 0x4e, 0xb7, 0x4a, 0x5f, 0xd8, 0xcf, 0x3d, 0xe5, 0xc9, 0x7b, 0x59, 0x77, 0x5d, 0x4e, 0x92, 0x98, 0x41, 0x91, 0x12, 0xa3, 0xbd, 0x29, 0xcd, 0x67, 0x3e, 0x27, 0xea, 0x2e, +0x5c, 0xd4, 0x80, 0xd3, 0x3c, 0x03, 0xee, 0x51, 0x2c, 0xe2, 0xe9, 0xfb, 0x7a, 0xf5, 0x9c, 0x56, 0x9b, 0x8f, 0x95, 0xf3, 0x69, 0xe4, 0x88, 0x7e, 0x8b, 0x57, 0xfc, 0x25, 0x6d, 0xa6, 0x1c, 0x46, 0xbc, 0xf7, 0x8a, 0xbe, 0x16, 0xe8, 0xf1, 0x11, +0x28, 0xb4, 0xa1, 0xf9, 0xb3, 0x5e, 0x04, 0xd2, 0x23, 0xc5, 0xfd, 0x73, 0x62, 0xb1, 0xa9, 0x22, 0xd0, 0x32, 0x6a, 0x0f, 0x7c, 0x78, 0xbf, 0x6e, 0xce, 0x90, 0x71, 0x1a, 0x48, 0xe1, 0xec, 0xb9, 0x42, 0x58, 0x1b, 0x6c, 0xd6, 0xad, 0xb7, 0x72, +0x8e, 0x38, 0xa5, 0xca, 0x00, 0x52, 0x5b, 0x9a, 0x87, 0xfe, 0x54, 0xc2, 0xa2, 0xa0, 0x99, 0x34, 0xf2, 0x5a, 0xef, 0xb0, 0xc4, 0x82, 0x93, 0xb2, 0xd9, 0xd1, 0x3a, 0x9e, 0x45, 0x2d, 0x60, 0xaf, 0x19, 0xba, 0x53, 0xc1, 0x4a, 0x76, 0x01, 0x85, +0x44, 0x39, 0x64, 0xc6, 0x09, 0x2a, 0xde, 0xe7, 0x0d, 0x63, 0xa7, 0x02, 0x20, 0x06, 0xa4, 0x8d, 0x08, 0x65, 0x4d, 0x3f, 0x9f, 0xd5, 0xf0, 0x2f, 0x35, 0xeb, 0xaa, 0x50, 0xdc, 0x0e, 0xd7, 0x1e, 0x96, 0x17, 0x0a, 0x1f, 0x07, 0x84, 0xfa, 0xbb, +0x43, 0xdd, 0x0b, 0x31, 0x83, 0x14, 0x33, 0x49, 0x18, 0x4c, 0x37, 0x10, 0x68, 0xae, 0x1d, 0xda, 0xf4, 0x55, 0x66, 0xdb, 0xff, 0x5f, 0x3b, 0x9d, 0xf8, 0xc3, 0xe0, 0x81, 0x70, 0xb5, 0x21, 0xe3, 0x13, 0x6b, 0xed, 0xdf, 0x4b, 0xb6, 0x26, 0xac, +0x74, 0xc7, 0x0c, 0x4f, 0x79, 0x15, 0x94, 0x7d, 0xcc, 0x75, 0x8c, 0xc0, 0xab, 0x30, 0xa8, 0xc8, 0x47, 0x40, 0x86, 0x89, 0x2b, 0xb8, 0x24, 0x61, 0x05, 0xf6, 0x36, 0x6f, 0x7f, 0xcb, 0x97, 0xe6, 0x7c, 0x4f, 0x69, 0x9b, 0xde, 0x0a, 0x40, 0xc2, +0x0d, 0x9d, 0xa8, 0x65, 0x1d, 0x5d, 0x60, 0x8a, 0xd8, 0xe3, 0x66, 0x0e, 0x2a, 0x80, 0xdd, 0x0b, 0x39, 0x73, 0x26, 0x21, 0xe1, 0x56, 0x97, 0x4e, 0xd1, 0x9c, 0xa0, 0xb8, 0x30, 0x20, 0xa3, 0x44, 0x25, 0x78, 0xe7, 0x06, 0x5c, 0x61, 0xa1, 0x8e, +0xfe, 0x3c, 0x8b, 0x2f, 0x4d, 0x54, 0x10, 0x8c, 0x08, 0x7a, 0xf1, 0xb4, 0x48, 0x52, 0xff, 0x34, 0xce, 0xef, 0xe5, 0x83, 0x3a, 0xad, 0x74, 0xcd, 0xfd, 0xf7, 0x02, 0x57, 0x90, 0x31, 0xd0, 0xf6, 0x17, 0x68, 0xbd, 0x2c, 0xcb, 0x6c, 0x43, 0x72, +0x6f, 0xfa, 0x5b, 0x7f, 0x28, 0xf3, 0xf4, 0x29, 0xcc, 0x64, 0x37, 0xba, 0x94, 0xae, 0xbc, 0xdc, 0xdf, 0x0f, 0x59, 0x07, 0x13, 0xb5, 0x82, 0x27, 0x3e, 0x22, 0x6b, 0x6a, 0x5a, 0xf5, 0x5e, 0xa9, 0x1c, 0xc9, 0xb1, 0x84, 0x7d, 0x88, 0x3b, 0xbe, +0xdb, 0xf8, 0x8d, 0xd9, 0x49, 0x98, 0x42, 0x9a, 0x86, 0x35, 0x67, 0xe4, 0x53, 0x41, 0x45, 0xe8, 0xaa, 0xc0, 0x09, 0xa7, 0x77, 0xea, 0xd3, 0xfb, 0x50, 0x33, 0x3d, 0x11, 0x03, 0x12, 0xf9, 0x87, 0xe9, 0x4b, 0x55, 0x92, 0x1e, 0xfc, 0x05, 0xb7, +0xb6, 0x5f, 0x19, 0x0c, 0x00, 0x8f, 0x62, 0x1b, 0x76, 0xca, 0xb0, 0xc6, 0x85, 0xec, 0x23, 0xbb, 0x7b, 0x4c, 0xe0, 0xa4, 0x04, 0xaf, 0xed, 0x2d, 0x6d, 0x95, 0x79, 0x2e, 0x81, 0xab, 0x93, 0xb3, 0x51, 0x1f, 0x46, 0xa5, 0xcf, 0xe2, 0xc5, 0x9e, +0xe6, 0xd2, 0x99, 0x58, 0xf2, 0x01, 0x16, 0xc4, 0x14, 0x9f, 0x89, 0xda, 0x24, 0x18, 0xd4, 0xac, 0x15, 0xd6, 0x6e, 0x1a, 0x7e, 0x36, 0xbf, 0xc3, 0x71, 0xee, 0xa2, 0xeb, 0x47, 0xf0, 0x91, 0xc7, 0x3f, 0xc1, 0xd5, 0x63, 0xd7, 0xa6, 0x32, 0xc8, +0x96, 0x70, 0x75, 0x4a, 0x2b, 0xb9, 0xb2, 0x38, 0x1a, 0xbf, 0x3a, 0xd2, 0x67, 0xf6, 0x6f, 0xdb, 0x68, 0xa8, 0xb4, 0x6b, 0x01, 0x55, 0x48, 0xc1, 0xe5, 0x2f, 0x5c, 0x91, 0x46, 0xb7, 0x8a, 0x16, 0x3e, 0x21, 0xda, 0x89, 0xa1, 0xe7, 0xff, 0x83, +0x23, 0x03, 0x11, 0x4e, 0x39, 0x06, 0xd8, 0x5f, 0x72, 0xa4, 0xf0, 0x2a, 0xc8, 0x29, 0xa7, 0x69, 0x47, 0xde, 0xbb, 0x7c, 0xef, 0x82, 0xfa, 0x84, 0x45, 0x1c, 0x9d, 0x9c, 0x5b, 0xd7, 0xe3, 0xc5, 0x54, 0x64, 0xdc, 0x74, 0xc7, 0x78, 0xe8, 0x33, +0x10, 0xfd, 0xe2, 0x5e, 0x3f, 0x63, 0xe1, 0xf3, 0xa9, 0x7d, 0x59, 0x9f, 0x32, 0x40, 0x4b, 0xaf, 0xd1, 0x22, 0x85, 0x3d, 0xd0, 0x4f, 0xd5, 0xfc, 0x99, 0xf7, 0xce, 0x80, 0x2b, 0x4c, 0x73, 0x02, 0x28, 0x25, 0x27, 0x6d, 0xe4, 0xc3, 0xb2, 0xa2, +0xf5, 0x7a, 0x93, 0x8e, 0xca, 0xa0, 0xf2, 0xaa, 0xf9, 0x0c, 0xbe, 0x36, 0xcf, 0xee, 0x6a, 0x1f, 0x94, 0xdf, 0xad, 0x5a, 0x51, 0xea, 0xfe, 0xab, 0x07, 0x0e, 0x92, 0x20, 0x17, 0x60, 0xdd, 0xf1, 0xe9, 0x81, 0xe0, 0x0b, 0x49, 0x66, 0x38, 0x7b, +0x15, 0x42, 0x9e, 0x00, 0xc0, 0x4a, 0x70, 0x8b, 0x56, 0xd6, 0x35, 0x4d, 0xd9, 0xa3, 0x79, 0x0d, 0xc9, 0xa5, 0x8f, 0x65, 0x77, 0x13, 0x1e, 0xba, 0x88, 0xcc, 0xc2, 0xb9, 0x76, 0xae, 0xcd, 0xc6, 0x9a, 0xc4, 0x7f, 0x0f, 0x8c, 0xbd, 0x95, 0x75, +0x52, 0x87, 0x43, 0x71, 0xd3, 0x44, 0x62, 0x6c, 0xec, 0x05, 0x96, 0x41, 0x2c, 0xb1, 0x90, 0x98, 0xd4, 0xb6, 0x2d, 0xb8, 0x0a, 0x1d, 0x86, 0xcb, 0x50, 0x3b, 0x53, 0x7e, 0x24, 0x57, 0xe6, 0x18, 0x30, 0x04, 0x34, 0x31, 0xac, 0x1b, 0xb0, 0x19, +0x6e, 0x5d, 0xb5, 0x9b, 0x97, 0x8d, 0xfb, 0xbc, 0xf8, 0x37, 0x61, 0x08, 0xa6, 0x3c, 0x58, 0xeb, 0x12, 0xed, 0x2e, 0x14, 0x09, 0xf4, 0xb3, 0x26, 0xb3, 0x6a, 0x79, 0x5b, 0x86, 0x63, 0xc1, 0xcb, 0xbb, 0xf0, 0x5f, 0xca, 0xff, 0x15, 0x93, 0x84, +0x4f, 0x71, 0xef, 0x59, 0x20, 0xc2, 0xd0, 0x60, 0x55, 0x3c, 0xa9, 0xde, 0x5d, 0x36, 0xec, 0x98, 0x87, 0x89, 0x18, 0x46, 0x54, 0x4e, 0x2c, 0xc7, 0x3b, 0x06, 0x68, 0x0d, 0xe4, 0x8b, 0x53, 0x66, 0xed, 0x35, 0xb0, 0x67, 0x92, 0x69, 0x4b, 0x7f, +0xe0, 0xf3, 0xe7, 0x1f, 0x8a, 0xa2, 0xb7, 0x6b, 0xbc, 0x77, 0x21, 0x19, 0x96, 0x7a, 0x51, 0x81, 0x65, 0x85, 0xd7, 0x02, 0xb1, 0x9e, 0xdb, 0xf5, 0x44, 0xb4, 0xe3, 0x22, 0xf9, 0x28, 0x74, 0x78, 0x25, 0xb8, 0x45, 0x3e, 0xeb, 0x42, 0x94, 0xc3, +0x8f, 0x70, 0xc4, 0x91, 0x14, 0x2f, 0x61, 0x05, 0x09, 0x49, 0x07, 0x03, 0x27, 0x75, 0x7e, 0x5a, 0x58, 0xea, 0x39, 0xa3, 0x0e, 0x8e, 0x4c, 0xb2, 0xf6, 0x47, 0x0f, 0xcc, 0xd9, 0x41, 0x4d, 0x17, 0x12, 0x62, 0x5e, 0xc9, 0xc0, 0xa8, 0x6c, 0x2b, +0xf8, 0x0a, 0xe6, 0xa7, 0x2e, 0xaa, 0x3a, 0x9d, 0xda, 0x33, 0xcd, 0xc6, 0x26, 0x23, 0xfc, 0x76, 0xd3, 0x48, 0x38, 0x6e, 0x37, 0x00, 0x10, 0xd5, 0x1a, 0xd8, 0xe8, 0x56, 0x04, 0x32, 0x1d, 0x7d, 0xd4, 0x29, 0x16, 0xe1, 0x3f, 0x72, 0xbd, 0xd1, +0xce, 0xc8, 0x99, 0xa5, 0x5c, 0xdf, 0x2d, 0x08, 0x9a, 0xb6, 0x64, 0xab, 0x80, 0xfa, 0xa0, 0x8d, 0x24, 0x9f, 0xa1, 0x9b, 0xf4, 0x50, 0xfe, 0x9c, 0xdd, 0xc5, 0x7c, 0xfd, 0x34, 0x97, 0x01, 0xae, 0x83, 0x30, 0x43, 0x4a, 0x6f, 0x1c, 0xdc, 0xa4, +0xbe, 0xf2, 0xac, 0xf7, 0xb5, 0xd6, 0xf1, 0x90, 0x2a, 0x11, 0xb9, 0xe9, 0xe2, 0xad, 0xee, 0x57, 0x88, 0xba, 0x3d, 0x0c, 0x95, 0xa6, 0xcf, 0x8c, 0x6d, 0x73, 0xd2, 0x40, 0x0b, 0x1e, 0x7b, 0x82, 0xfb, 0xbf, 0x13, 0x1b, 0xaf, 0x31, 0x52, 0xe5, +0xc1, 0xe1, 0xe0, 0xc7, 0xa3, 0x3f, 0x31, 0x89, 0x08, 0x64, 0xaa, 0x1d, 0xf1, 0x0a, 0xda, 0x62, 0xd7, 0xee, 0x38, 0x12, 0x7f, 0xd3, 0xc4, 0xdd, 0x0c, 0x5a, 0xd6, 0x57, 0xea, 0x33, 0xe6, 0x16, 0xa0, 0x3b, 0x07, 0x1f, 0x47, 0x65, 0xd8, 0x19, +0x6d, 0xfd, 0x04, 0xb9, 0xad, 0x4b, 0x3d, 0xc9, 0xde, 0x93, 0xa4, 0x3a, 0x7d, 0x49, 0xf3, 0x97, 0xe7, 0xce, 0x82, 0x4f, 0x79, 0x74, 0xa6, 0x99, 0xa8, 0xa9, 0x23, 0x7b, 0x56, 0x02, 0x6c, 0x5c, 0x2b, 0x50, 0x59, 0xcc, 0xfb, 0x40, 0x2a, 0xc3, +0x3c, 0xf8, 0xd4, 0xc8, 0x60, 0x63, 0x7e, 0x5d, 0x35, 0x11, 0x8f, 0x53, 0xf9, 0xec, 0x9d, 0xab, 0x28, 0x7a, 0x05, 0x2d, 0x88, 0x71, 0x94, 0xf4, 0x5b, 0xf0, 0x66, 0xe8, 0xef, 0x4e, 0x85, 0x30, 0x8d, 0x10, 0x09, 0x42, 0x15, 0x2f, 0x4a, 0x41, +0xb1, 0x0e, 0xc6, 0x06, 0x9e, 0x83, 0xa7, 0x81, 0x3e, 0x24, 0x0b, 0x8b, 0xfc, 0xd1, 0xdc, 0x9f, 0x46, 0x21, 0x6a, 0xbc, 0xaf, 0x69, 0x48, 0x34, 0x26, 0x18, 0x4d, 0x86, 0x77, 0x36, 0xbe, 0xe5, 0x20, 0x8a, 0x61, 0x8e, 0x98, 0xd0, 0xc0, 0xbd, +0xbf, 0x39, 0x1a, 0x91, 0x75, 0xd5, 0xb4, 0xe9, 0x9a, 0x2c, 0x37, 0x0f, 0x5e, 0xac, 0xfa, 0xb6, 0x44, 0x17, 0x5f, 0xbb, 0xb3, 0x52, 0x4c, 0x22, 0xf7, 0x1c, 0x13, 0xed, 0xa1, 0xdb, 0x58, 0x6b, 0x51, 0xe2, 0x25, 0x55, 0x6f, 0xba, 0xb2, 0xc5, +0x76, 0x03, 0x84, 0x43, 0x78, 0x95, 0xb8, 0x29, 0x90, 0xdf, 0xff, 0x7c, 0x32, 0x68, 0x1b, 0x2e, 0x00, 0xa2, 0xcf, 0xd9, 0x72, 0x0d, 0xe4, 0x70, 0xae, 0x14, 0x54, 0xf2, 0xd2, 0x01, 0x87, 0x96, 0x73, 0xca, 0xa5, 0x80, 0xf6, 0x6e, 0xe3, 0x8c, +0xc2, 0x67, 0xb7, 0xeb, 0xb5, 0xcb, 0x45, 0xcd, 0x9b, 0x92, 0xb0, 0x27, 0xfe, 0x1e, 0x9c, 0xf5, 0xe0, 0xfa, 0x06, 0x07, 0xad, 0xae, 0x77, 0x36, 0x6f, 0x95, 0x04, 0x33, 0x70, 0xa7, 0x68, 0x2e, 0x3b, 0xea, 0x4c, 0xaf, 0x9f, 0x80, 0x30, 0x38, +0xb1, 0x97, 0xc8, 0xfb, 0xdf, 0xe7, 0xaa, 0x24, 0x69, 0x43, 0xf6, 0x75, 0x93, 0xe4, 0xee, 0x56, 0x81, 0x6b, 0xbf, 0x9e, 0x00, 0xde, 0xa4, 0x1a, 0x0d, 0xf8, 0xbd, 0x19, 0x45, 0x41, 0x7f, 0xb7, 0x4a, 0xd2, 0x8a, 0x6c, 0xf4, 0xdd, 0x2a, 0x23, +0x78, 0x90, 0xc1, 0xd6, 0x3f, 0xfd, 0xe8, 0x6d, 0xc3, 0xe6, 0x9a, 0x27, 0xe3, 0xdc, 0xf2, 0x9b, 0x55, 0xf9, 0x72, 0x28, 0x16, 0xa5, 0xf5, 0xd5, 0x58, 0x3a, 0x63, 0xd7, 0xab, 0xcd, 0x50, 0x10, 0x76, 0xb3, 0x47, 0x5c, 0xcb, 0x85, 0x17, 0xcf, +0xc5, 0x7a, 0xc6, 0x2d, 0xfe, 0x0c, 0xec, 0x4d, 0xef, 0xac, 0x01, 0x31, 0x13, 0x0f, 0x40, 0x8b, 0xbc, 0xa8, 0x8f, 0x83, 0x4e, 0x0a, 0x5d, 0x2c, 0xd4, 0xfc, 0xf0, 0x7b, 0xd0, 0xbe, 0x1f, 0x14, 0x88, 0x53, 0x60, 0x08, 0x03, 0x66, 0x20, 0x71, +0x51, 0x7e, 0xb5, 0x1d, 0x73, 0xba, 0xa1, 0xf1, 0xd1, 0x99, 0x91, 0x84, 0x32, 0x49, 0x48, 0x2f, 0x7c, 0xd9, 0x29, 0x64, 0x1b, 0x39, 0x3e, 0xed, 0x5a, 0xb8, 0x89, 0xc0, 0xb0, 0x37, 0xda, 0x15, 0x44, 0x96, 0x46, 0x25, 0x02, 0x98, 0x22, 0x7d, +0xa3, 0x82, 0x1c, 0x8d, 0x54, 0x42, 0x52, 0xd3, 0x3c, 0xca, 0x74, 0xc4, 0xf7, 0xdb, 0x3d, 0xce, 0x62, 0x0e, 0x67, 0x12, 0x94, 0xeb, 0x5f, 0x86, 0x6a, 0xe2, 0x61, 0x05, 0x57, 0x4f, 0x87, 0x21, 0x18, 0x79, 0x6e, 0x92, 0xb4, 0x2b, 0x0b, 0xb9, +0x8e, 0xc9, 0xff, 0xa6, 0x11, 0x9c, 0xe5, 0xd8, 0x59, 0xb6, 0xc2, 0x1e, 0xb2, 0x5b, 0x9d, 0xe1, 0xcc, 0x35, 0x09, 0xa9, 0xf3, 0xa0, 0x26, 0xbb, 0x4b, 0xc7, 0x8c, 0xa2, 0x65, 0x5e, 0x34, 0xe9, 0x8c, 0xca, 0x41, 0xd0, 0x9f, 0xb7, 0xc0, 0xc4, +0x80, 0x69, 0xe5, 0x87, 0x86, 0x9d, 0xdd, 0x7b, 0xb6, 0xab, 0xef, 0xa5, 0x4d, 0x71, 0x8d, 0xc2, 0x0c, 0x78, 0x39, 0xd9, 0x76, 0xb2, 0x17, 0xf0, 0xc1, 0x77, 0x5c, 0xb0, 0x1e, 0x97, 0xe3, 0x7f, 0x5a, 0x55, 0xc9, 0x59, 0xc3, 0xee, 0xbc, 0x8e, +0x1c, 0x2b, 0xb5, 0x34, 0xa9, 0xc7, 0xe4, 0x11, 0x08, 0xe7, 0x40, 0x26, 0x9c, 0x44, 0x9e, 0xfa, 0xb4, 0xcc, 0xa7, 0xd7, 0x19, 0xac, 0x01, 0x06, 0x51, 0x09, 0x2d, 0x3d, 0xff, 0x3c, 0x31, 0x5e, 0x70, 0xed, 0x58, 0x4f, 0x0e, 0x1a, 0xad, 0xd2, +0x66, 0x79, 0x0b, 0xae, 0x32, 0x27, 0xa3, 0x1d, 0x81, 0x21, 0x48, 0xcd, 0xf9, 0xbd, 0x52, 0x3e, 0x00, 0xd1, 0xd5, 0xf7, 0x57, 0x30, 0x98, 0xb9, 0x56, 0x14, 0xc6, 0xdf, 0x0d, 0xf3, 0xfb, 0xf5, 0x54, 0x0f, 0x7a, 0xfe, 0x95, 0x4a, 0xb8, 0x75, +0x35, 0xe9, 0x1f, 0x5f, 0x60, 0x2e, 0xf6, 0x7e, 0xb3, 0x49, 0xd8, 0xce, 0x82, 0x89, 0xb1, 0x15, 0x68, 0x6e, 0x67, 0xde, 0x4c, 0x18, 0x50, 0xa1, 0xd6, 0x7d, 0xbf, 0x29, 0x6f, 0x04, 0x5d, 0x88, 0xc8, 0x47, 0xec, 0xe1, 0xcf, 0xf1, 0x0a, 0xda, +0x16, 0x6c, 0xa2, 0x93, 0x94, 0x3a, 0xea, 0xd3, 0xa0, 0xdc, 0xa4, 0x10, 0x6d, 0xa8, 0x3b, 0x23, 0xf2, 0x25, 0x13, 0x2a, 0x24, 0xaf, 0x62, 0xaa, 0x85, 0xa6, 0x92, 0x7c, 0x4b, 0x38, 0xfc, 0x6b, 0x6a, 0xdb, 0x37, 0x02, 0x9b, 0x5b, 0x8f, 0x45, +0x05, 0xe6, 0x90, 0x43, 0x83, 0xf8, 0x8b, 0x61, 0x1b, 0xe2, 0xc5, 0x07, 0x22, 0x53, 0x33, 0x46, 0xe0, 0xe8, 0x3f, 0x72, 0x64, 0x2c, 0x65, 0xbb, 0x73, 0x20, 0xeb, 0x03, 0x96, 0x9a, 0x12, 0xcb, 0xf4, 0x74, 0xd4, 0x8a, 0x84, 0xfd, 0x4e, 0xba, +0x28, 0x42, 0x99, 0xbe, 0x63, 0x2f, 0x91, 0x36, 0x70, 0xb1, 0xd4, 0xaa, 0x9f, 0x21, 0x61, 0xd5, 0xa4, 0x99, 0xe3, 0x4b, 0xd8, 0x94, 0x23, 0x3e, 0xfc, 0x1d, 0x31, 0x51, 0x85, 0xc3, 0xcb, 0xc7, 0x32, 0xc1, 0xf4, 0x97, 0xed, 0xe0, 0xb2, 0xdd, +0xc4, 0xe4, 0x37, 0xb4, 0xf6, 0x3c, 0x20, 0xcc, 0xa2, 0xd0, 0xbd, 0x12, 0x72, 0x15, 0x7f, 0xa3, 0x47, 0x8c, 0xf0, 0xf1, 0x0a, 0x0c, 0x25, 0xfa, 0x8f, 0x77, 0xf5, 0xe7, 0xad, 0x2c, 0xba, 0xcf, 0x53, 0xc8, 0x87, 0xdb, 0x64, 0x24, 0x44, 0x65, +0x8a, 0xda, 0x40, 0x19, 0x5d, 0xeb, 0x33, 0xf3, 0x57, 0xb3, 0x4d, 0x1f, 0x1b, 0x6a, 0x91, 0xa6, 0x75, 0x2a, 0x11, 0xa1, 0x8b, 0x46, 0xf8, 0x41, 0x07, 0xbf, 0x73, 0x29, 0x9b, 0xd1, 0xd6, 0x71, 0x92, 0x5c, 0x3b, 0xde, 0xab, 0xd7, 0xe8, 0xfd, +0x7b, 0x3a, 0x28, 0x18, 0x93, 0x50, 0xd9, 0x56, 0x30, 0x2e, 0x88, 0xe5, 0xb5, 0x6c, 0x6f, 0xfe, 0x45, 0x01, 0x9c, 0x66, 0x55, 0x1e, 0x69, 0xef, 0xea, 0x7d, 0xd2, 0x42, 0x04, 0x9e, 0x1a, 0xec, 0x06, 0x60, 0xe1, 0x0b, 0x8e, 0x34, 0xc6, 0x58, +0xa5, 0x0e, 0xa7, 0x59, 0x03, 0xca, 0xbe, 0xf9, 0x5f, 0x26, 0xb9, 0xcd, 0x4a, 0x49, 0x0f, 0x4c, 0xfb, 0x84, 0x14, 0x52, 0x80, 0x13, 0x6e, 0x6b, 0x16, 0x27, 0xee, 0xe9, 0x10, 0x67, 0xe2, 0x4e, 0x74, 0x9d, 0xc5, 0x8d, 0x00, 0xff, 0x81, 0x83, +0xdf, 0x08, 0x82, 0x96, 0xaf, 0x95, 0xe6, 0xbb, 0x7a, 0x9a, 0x43, 0xb7, 0x4f, 0x63, 0x5b, 0x89, 0xc9, 0x17, 0xf2, 0x90, 0x6d, 0x7c, 0xac, 0x98, 0xbc, 0x09, 0x02, 0x78, 0xb8, 0x35, 0x86, 0xa9, 0x76, 0x79, 0x2d, 0x5e, 0x62, 0x7e, 0x22, 0x38, +0x2b, 0x3d, 0xb0, 0xdc, 0x5a, 0xf7, 0x3f, 0x68, 0xae, 0xa0, 0x54, 0xc2, 0x05, 0xb6, 0x1c, 0x36, 0xd3, 0xa8, 0x2f, 0xc0, 0xce, 0x39, 0x48, 0x0d, 0xdc, 0xa4, 0x8f, 0x77, 0xd0, 0xe2, 0x62, 0x87, 0xf6, 0x60, 0x92, 0x48, 0x46, 0x3f, 0xca, 0x76, +0x06, 0xc3, 0xf7, 0x6d, 0x91, 0x53, 0x2a, 0x05, 0xe4, 0xc5, 0x9c, 0x41, 0xde, 0x98, 0x19, 0xe5, 0xd2, 0x39, 0xae, 0x2f, 0xf9, 0x90, 0xd5, 0xc0, 0xa1, 0x8b, 0xcd, 0x9e, 0xe3, 0xe0, 0xba, 0x32, 0x24, 0x00, 0xee, 0x79, 0x02, 0xf2, 0x49, 0x33, +0x7c, 0x20, 0x08, 0xcc, 0xd9, 0x38, 0xa7, 0xbe, 0x93, 0x5d, 0xf5, 0x1b, 0x7d, 0x6f, 0xb6, 0x18, 0x11, 0x83, 0x1d, 0x69, 0xdd, 0x7e, 0x71, 0x7f, 0x9b, 0x16, 0x2e, 0xdb, 0xc8, 0x3e, 0xd6, 0xc9, 0xfb, 0x34, 0x42, 0x4e, 0xc4, 0xac, 0x81, 0xc1, +0x97, 0xeb, 0x12, 0xf4, 0xc7, 0xb2, 0x35, 0xbb, 0xf3, 0xd1, 0x36, 0x75, 0x4d, 0x65, 0xf0, 0x43, 0x7b, 0xce, 0xbf, 0x52, 0x4f, 0xdf, 0x5c, 0x8a, 0xcf, 0x1a, 0xfa, 0x9a, 0x31, 0xb1, 0xb3, 0x28, 0x73, 0xcb, 0x14, 0xb4, 0x94, 0x95, 0x0e, 0xa8, +0x21, 0xd3, 0x5b, 0x0f, 0xa3, 0x86, 0x0b, 0x70, 0x55, 0x44, 0x1f, 0x4b, 0x3b, 0xbd, 0x01, 0x26, 0x99, 0x22, 0xea, 0x85, 0xb0, 0x07, 0xec, 0x5a, 0x0d, 0x47, 0x63, 0xe1, 0x30, 0xef, 0xff, 0xd4, 0x2c, 0x9d, 0x61, 0x64, 0x6c, 0xbc, 0xb7, 0x40, +0x1c, 0xc2, 0x0c, 0x80, 0x82, 0x78, 0x17, 0x88, 0x51, 0x89, 0x3a, 0x59, 0x2b, 0x3c, 0xc6, 0x96, 0x68, 0x25, 0xa0, 0x6b, 0x5f, 0x54, 0x67, 0x3d, 0x09, 0xe6, 0xd8, 0xf1, 0x6a, 0x15, 0x8c, 0xaa, 0x45, 0x0a, 0x66, 0x2d, 0xa5, 0xfe, 0x37, 0x03, +0xe9, 0x29, 0xa6, 0x04, 0xa2, 0xaf, 0x6e, 0x13, 0x8e, 0x27, 0x50, 0x56, 0xf8, 0xad, 0xb9, 0x1e, 0xda, 0x9f, 0xed, 0xfd, 0x74, 0xe7, 0x5e, 0xd7, 0x57, 0xb5, 0xfc, 0xb8, 0xe8, 0x8d, 0x10, 0x72, 0x23, 0x7a, 0x4c, 0x84, 0xab, 0x58, 0xa9, 0x4a, +0xd8, 0x2e, 0x53, 0xbe, 0x25, 0x83, 0x49, 0x03, 0x75, 0x50, 0x40, 0x45, 0xc1, 0x81, 0xdc, 0x09, 0x0a, 0x0c, 0xa1, 0xaa, 0xd0, 0xf4, 0xa0, 0x8f, 0xbc, 0x78, 0x65, 0x23, 0xde, 0x9b, 0xb0, 0x96, 0x74, 0x3d, 0x9c, 0xe2, 0x6b, 0x7d, 0x5c, 0xad, +0x73, 0xf0, 0x18, 0x92, 0x76, 0x72, 0x71, 0x91, 0x32, 0x0e, 0xf8, 0x11, 0x3a, 0x68, 0x06, 0x28, 0x52, 0xf9, 0x85, 0xcb, 0x3f, 0xf3, 0xba, 0x8a, 0x20, 0xee, 0x47, 0xc9, 0x54, 0x00, 0x4c, 0xb6, 0x4e, 0xf5, 0xae, 0xfe, 0xd1, 0xa5, 0xf2, 0xda, +0x26, 0x44, 0x7e, 0x31, 0xa9, 0xc0, 0x10, 0xe8, 0xe9, 0x61, 0x8d, 0x1b, 0x5b, 0xa8, 0x13, 0xb1, 0x37, 0xe3, 0x51, 0x4d, 0x9f, 0x82, 0x97, 0x8c, 0x88, 0xb2, 0x4b, 0x70, 0xd6, 0xbd, 0x27, 0xfb, 0x60, 0xc4, 0x87, 0x3e, 0x4f, 0x38, 0x3c, 0x2f, +0x77, 0xe6, 0xa6, 0x41, 0x67, 0xe0, 0xd3, 0x69, 0xa2, 0x14, 0x80, 0x58, 0xab, 0x08, 0xd7, 0x94, 0x01, 0xaf, 0xc5, 0xb9, 0x1c, 0x9a, 0x8b, 0x07, 0x46, 0x6c, 0x29, 0x95, 0x6f, 0xa7, 0x3b, 0x36, 0x7f, 0x9d, 0x90, 0xa4, 0x05, 0x84, 0x48, 0x7a, +0xeb, 0xd5, 0x33, 0xe4, 0xcc, 0x63, 0x12, 0x21, 0x5a, 0x55, 0x4a, 0x24, 0x19, 0xb3, 0x1f, 0xb7, 0x7b, 0xc6, 0x0f, 0x62, 0x0b, 0x6d, 0xe5, 0x79, 0xef, 0x5f, 0xce, 0x35, 0xdf, 0xc7, 0x1a, 0x2b, 0x5d, 0x99, 0x64, 0xb4, 0xf6, 0x39, 0x56, 0xcd, +0x2c, 0xd9, 0xec, 0x7c, 0xfa, 0x42, 0xb5, 0x9e, 0xff, 0x1e, 0x2a, 0xf7, 0x6e, 0xe7, 0xdb, 0x34, 0x57, 0x02, 0x04, 0xcf, 0xc2, 0xb8, 0x43, 0x86, 0xed, 0x89, 0xe1, 0x0d, 0x93, 0xbf, 0x66, 0x30, 0x5e, 0xea, 0xc8, 0xf1, 0xc3, 0xfc, 0xbb, 0x16, +0xac, 0x6a, 0x1d, 0xd4, 0x98, 0x17, 0xd2, 0x59, 0xdd, 0x22, 0x15, 0x2d, 0x8e, 0xa3, 0xca, 0xfd, ] + +d0x6a0af7f8=[ 0xff0ff758, 0x47dd358a, 0x0cfd80ac, 0x786f3234, 0x3377e349, 0x12c1b0e9, 0x486e6ee8, 0xa6d696cc, 0xf0bcac3a, 0xee809c7f, 0x88d39e0e, 0xc0630287, 0x4888f8d2, 0xaaf5e401, 0xa95da9f5, 0x21b653a0, 0xd1d40dfb, 0x3f549184, 0x00e6963a, 0xf3f277f4, +0x8ba5219b, 0xaa2b1660, 0xddf77f36, 0x7b21e9fa, 0xc315bd12, 0x6aae82dd, 0xb759fdeb, 0x95a17585, 0x74aad6c3, 0xa9bb3fcf, 0x56525ead, 0x3c222e11, 0xd29ad635, 0x6525bde4, 0x9af4b8dd, 0x11519946, 0x1d72eb8b, 0x1edaa67f, 0x96093871, 0x5a97ba5a, +0xc3f32b28, 0x0f8b3f39, 0x1dac19ea, 0xa63000f6, 0x33917573, 0xc32dd949, 0x2150c59a, 0x22267a0f, 0x66530271, 0x959911de, 0x96d7ca10, 0x693eab72, 0xe2a3eeb2, 0xf3ca13af, 0xf32c8595, 0xddcf1b6d, 0xa6eef297, 0xb7bf6bd1, 0x744c40f9, 0x47e551d1, +0x566a3af6, 0x65fb4f85, 0x4703c7eb, 0x99649172, 0xaa13723b, 0x2168a1c1, 0xcf0eab84, 0x03a84df4, 0x0c2372cd, 0xcca6e670, 0xb8eaa689, 0xd2a2b26e, 0x039029af, 0x4493ee44, 0xfc7948cd, 0x9a2a4abc, 0x118f6b27, 0x8b43b7a1, 0x84c88898, 0xf0625e5b, +0x668df010, 0x568caccc, 0x0cc5e4f7, 0xee660a45, 0x66b5944b, 0x99820748, 0x1d4a8fd0, 0x9accdc86, 0x334f8712, 0xb4f1b01f, 0xd10aff9a, 0x1e3c3045, 0xcc9e822b, 0x1169fd1d, 0x11b70f7c, 0x7b198da1, 0x7492b298, 0x88ebfa55, 0x957f87e4, 0x8758a137, +0x5aafde01, 0xf084c861, 0x65c32bde, 0x30015cdc, 0xedf623ea, 0x84f0ecc3, 0x30e7cae6, 0x2ee39ef8, 0x0376bf95, 0xffd10539, 0x69e05913, 0x12f9d4b2, 0xd27c400f, 0xde5f32c2, 0xbb7a8f26, 0x1ee2c224, 0x7bc77fc0, 0xb83454e8, 0xe2457888, 0x3cc4b82b, +0x3f6cf5df, 0x773aff6c, 0xcc40704a, 0x218e37fb, 0x55fa1359, 0x77e40d0d, 0xcfe83dbe, 0x842e1ea2, 0xcf36cfdf, 0x666b662a, 0xc3cb4f73, 0x7bff1b9b, 0xd2442454, 0x44ab8a1f, 0xc05b66dc, 0x995cf529, 0xde81c0a3, 0xee5e6e1e, 0xff379303, 0xa546bf63, +0x880d6c6f, 0x9547e3bf, 0x5a712c60, 0x034edbce, 0xd1329bc1, 0x4bc6231c, 0xdd11e90c, 0x551c8563, 0x30dfaebd, 0x1e04541e, 0x593ff7ae, 0x1d947db1, 0xfc412c96, 0x77029b37, 0xfca7baac, 0x2e0508c2, 0xb80c30b3, 0x2d4bd30c, 0xb7870f8a, 0xe133c71d, +0x0c1b1696, 0x69d83d48, 0x59e105cf, 0xdd298d57, 0x2dad4536, 0xa5984d02, 0xd1ec69a0, 0x00000000, 0xe29b8ae9, 0x84167af9, 0x590793f5, 0x8b7bd3fa, 0xdeb9a4f8, 0xedce47b1, 0x48560ab3, 0x747424a2, 0x6a7070bc, 0xc0bdf0e6, 0x00def261, 0x6a4814e7, +0xbb9c191c, 0xcfd059e5, 0xf314e1ce, 0x121f4288, 0x4b18d17d, 0xa60864ad, 0xeeb8f824, 0xc08594bd, 0xa965cdae, 0x96315c2a, 0x3c1a4a4a, 0x7889a40e, 0xe1d55127, 0x122726d3, 0x9a122ee7, 0xb4172625, 0xa57edb38, 0x87be370d, 0x22c0ec35, 0xbb42eb7d, +0x3cfcdc70, 0xb76199b0, 0xaacd805a, 0x0fb35b62, 0x0f6da903, 0x5524e138, 0x78b1c055, 0x6906cf29, 0x2edbfaa3, 0xe10ba346, 0x8b9d45c0, 0x22f8886e, 0x3fb207be, 0xbba47d47, 0x0f55cd58, 0x55c27702, 0xe27d1cd3, 0x2d73b757, 0x5a49483b, 0xb42f427e, +0xb4c9d444, 0x0038645b, 0x4475787e, 0x2d95216d, 0xb8d2c2d2, 0x6a96e686, 0x77dc6956, 0xcc781411, 0x88350834, 0xed10b5d0, 0x56b4c897, 0x3f8a63e5, 0x8760c56c, 0xfc9fdef7, 0xf05a3a00, 0xffe96162, 0x99ba6313, 0x48b09c89, 0xa9835b94, 0xe1ed357c, +0xde675699, 0x96efae4b, 0x444d1c25, 0x59d96194, 0x651dd9bf, 0x221e1e54, 0x30393887, 0x4bfe4747, 0x4b20b526, 0xed28d18b, 0x7857566f, 0x2e3d6c99, 0x33a91128, 0x87865356, 0x473ba3b0, 0xa5a02959, 0xc06c0634, 0xc4735f1f, 0x92910645, 0xd16b2673, +0xe68404db, 0x63120a18, 0x98017034, 0x0a907671, 0x987ebb82, 0x0c905eb0, 0x78855c2e, 0xf1fcc7eb, 0x56e2595a, 0x69fdb7df, 0xe29b5df0, 0x2697c959, 0x0e8f2f5a, 0xcafc7045, 0xa11eb670, 0x4d750f6c, 0x83e9edb4, 0x92eecdf3, 0x021f71ea, 0x1b975636, +0x85960ec3, 0xd5747f58, 0x43fa2036, 0x4f6a7e86, 0x83962602, 0x22f75bc4, 0x7c9a0505, 0xbcf60331, 0x2c07bf28, 0xf90c0bc6, 0xb8e95a1a, 0x89065073, 0x1de8b541, 0xf5e39ec0, 0x89799bc5, 0xdb849bb4, 0x4b0aec1b, 0x41e551dc, 0xc8e301af, 0x00000000, +0x358f98f4, 0x0cef9506, 0x088f079b, 0xb619bef6, 0xf59c5576, 0xdf9bc29f, 0xfb6cb19a, 0x3d7f54d9, 0x69827c69, 0xdbfb5002, 0xe2e49646, 0x33f07b83, 0x94912e84, 0xd714c504, 0x670d5333, 0xe0fbe7ac, 0x5c722f2b, 0xf973c070, 0x4b7527ad, 0x96f194d8, +0x2e670574, 0x7675b8c2, 0xf7fcef2a, 0x479ab2ab, 0x7a9a2dc4, 0x20e82a2e, 0xa501ef5b, 0x651222d9, 0xc013cd82, 0xa57e24ed, 0x656de96f, 0xdfe40929, 0xcc839332, 0x2a785c5f, 0x2097e198, 0x3b00b7ae, 0x70759003, 0xca83bbf3, 0x47e5791d, 0x818957e8, +0x9c1e291f, 0x007fcbb6, 0x5812bdb6, 0xf1830c5d, 0xabf10bb7, 0x5e129577, 0xe4e4be87, 0xf783249c, 0x50e2719b, 0x87f6b49f, 0x5a7207ea, 0xafee529c, 0x700a5bb5, 0x391fc644, 0x746ac928, 0x060028c1, 0xee0b0340, 0xc89cca19, 0xb6667540, 0xd3745799, +0x0aefbdc7, 0xb2792c6b, 0xec6bb91c, 0x6172b044, 0x45fa08f7, 0xdd84b375, 0xd99bea5e, 0x87897f29, 0x9e7e9343, 0x6ffd9f1e, 0x968e5f6e, 0x8b66ea2f, 0xa301c79a, 0x78fa9798, 0x760a7374, 0xd114edc5, 0x72152a5f, 0x2e18cec2, 0x0460929d, 0xe874e037, +0x67729885, 0x94eee532, 0x8d66c2ee, 0xc20cbc68, 0xf39c7db7, 0x6f8254a8, 0x3f1fee85, 0x7e8574ef, 0x3790e91e, 0x28672db5, 0x8b192199, 0xb206e7dd, 0xd50bb4ee, 0xab8ec001, 0x726ae1e9, 0x908e77af, 0x5282cbc7, 0x1778c330, 0xb47904aa, 0xbc89c887, +0xc27377de, 0xbee972db, 0x6d9d2542, 0x31ef0a69, 0xa9ee7a5d, 0x17070886, 0xea6b91dd, 0x4585c341, 0x90f1bc19, 0x24f77305, 0xfd6c995b, 0x6de2eef4, 0x0260ba5c, 0x2a0797e9, 0x81f69c5e, 0xe6fbcf6d, 0x54fd28b0, 0x636dc1ae, 0xff73e8b1, 0xe49b7531, +0x2818e603, 0xaf91992a, 0x85e9c575, 0x1178ebf1, 0xce9ce2d8, 0x9e0158f5, 0x1518796c, 0x13679a1b, 0xd30b9c2f, 0xb89691ac, 0xa1617dc6, 0x3190c1df, 0xa71e9eb1, 0xf3e3b601, 0x5c0de49d, 0x3b7f7c18, 0x5a0dcc5c, 0x6b9d0d83, 0x4385eb80, 0xddfb78c3, +0xd76b0eb2, 0x2c78749e, 0xad8ee8c0, 0x37ef22a8, 0xa37e0c2c, 0x8f0678b2, 0x5e6d5ec1, 0x8d190958, 0x7ae5e672, 0x11072047, 0xbe96b96d, 0x7ce5ceb3, 0x9a1e01de, 0xc613e543, 0x496a5647, 0xea145a6b, 0xff0c2307, 0xccfc5884, 0x8f79b304, 0x198827dc, +0xee74c8f6, 0x35f05342, 0x9c61e2a9, 0x509dba2d, 0x067fe377, 0xfb137a2c, 0xb0665d81, 0xa7615507, 0x1f880f1d, 0xbaf62bf0, 0x49159df1, 0x1ff7c4ab, 0x22889072, 0xba89e046, 0x041f592b, 0x6be2c635, 0xe80b2b81, 0x26e802ef, 0x7efabf59, 0xa991b1eb, +0x1be89d80, 0x19f7ec6a, 0xc66c2ef5, 0x610d7bf2, 0x338fb035, 0x7415029e, 0x4f15b530, 0x9a61ca68, 0xd9e421e8, 0xfd1352ed, 0x39600df2, 0xcee3296e, 0x08f0cc2d, 0x419a9a6a, 0x0ef0e4ec, 0x2488b8b3, 0x3d009f6f, 0x131851ad, 0x1d977ef7, 0x3f602533, +0xe0842c1a, 0x586d7600, 0x4d0ac4da, 0xb406cf1c, 0xec1472aa, 0xc40c94a9, 0x569d92ec, 0xb0199637, 0x52fd0071, 0xadf12376, 0x1567b2da, 0x5482e306, 0x65f835c1, 0xee1738d3, 0x1f82813d, 0x9400fc34, 0xbc2efd3d, 0xe91f8916, 0xbb264cf8, 0x33e332ef, +0x1cc58223, 0x7a7ab4fc, 0xaa896b41, 0x282e0109, 0x9d25eb75, 0x39ec56ab, 0x7e58763c, 0x9747ff2a, 0x0765c1de, 0x47b42097, 0x77101166, 0xed3d4bd6, 0x16a7967c, 0xed503bcd, 0x56767735, 0x9a2d5ab0, 0x2603a78d, 0xb64ce962, 0xe057ee4c, 0x74571278, +0xea588a08, 0xd3b4dca3, 0xfcff1c74, 0x2529d488, 0x3486f331, 0x1feff126, 0x5113b6eb, 0x85c2ab96, 0xcf1c2e9b, 0x561b072e, 0x585bd1b1, 0x47d9508c, 0xd4bc6d66, 0x28437112, 0x49998613, 0x68ffe040, 0xc879ef45, 0x3aab55b5, 0x224c1556, 0xad81da84, +0x7075d0b8, 0x18e740e3, 0x09251741, 0x21666653, 0x3ee4e76e, 0x6bb8e35e, 0x266ed796, 0x7e350627, 0xdeb30922, 0x5239c5ee, 0xf1f8c9f5, 0x777d617d, 0xa0860f05, 0xda91cbe2, 0x9e0f9870, 0x8685a888, 0x338e42f4, 0xc2768b01, 0xbf048e38, 0x81e06956, +0x5f3e106f, 0x0948675a, 0x3e899775, 0xdafcbbf9, 0x4dd634c8, 0x8fcdcfd2, 0x15e09562, 0xffd56f71, 0xb26e2ba2, 0x7950c7f9, 0x0a0f6444, 0xc21bfb1a, 0xf69d082b, 0x8b827d09, 0x4e9137d6, 0x88a80e0c, 0x0e40d69f, 0xe37d9d49, 0xf2d2baf0, 0x188a30f8, +0x2c0cc3c9, 0xb2035bb9, 0xe7322f92, 0x006d701b, 0x128554bc, 0xe4752c8c, 0xd7fb6e78, 0x4dbb44d3, 0xc15cf804, 0x7a17c4e7, 0x0d07d581, 0x6ff75185, 0x44f32389, 0xa78ebec0, 0x990729b5, 0xbc438d26, 0x517ec6f0, 0xe03a9e57, 0x66bf36df, 0x5531742b, +0x4efc47cd, 0xe75f5f89, 0x0a62145f, 0x2f4bc0d7, 0xe4185c97, 0xd9d6c8fc, 0x449e5392, 0xe972f90d, 0x6bd59345, 0x793db7e2, 0x996a59ae, 0xffb81f6a, 0x0d6aa59a, 0x9d489b6e, 0x6f9a219e, 0x659545da, 0xb80c3ffd, 0xcb539c40, 0xf5b77b2e, 0xa4a4cdc5, +0x9a402aab, 0x86e8d893, 0x735fa3bd, 0x82ca1a53, 0x1ca8f238, 0xa9ce685f, 0x7332d3a6, 0x61b7871a, 0x61daf701, 0xc57e3ac4, 0x7d1f7522, 0xc131881f, 0xdede7939, 0x5b71a2b4, 0x5f536074, 0xb12928bc, 0x2544a493, 0x5c14636a, 0x0347031e, 0xd9bbb8e7, +0x11af27b9, 0x210b1648, 0x946d8c2f, 0xf5da0b35, 0xcc5b2d85, 0xbf69fe23, 0xc65449c1, 0x12e824a7, 0xb5669a67, 0x044fb2db, 0xf195b9ee, 0xbb4b3ce3, 0x85afdb8d, 0xea35fa13, 0xaec6d99a, 0x49f4f608, 0xadecaa9f, 0x40bc9152, 0x4396e257, 0x3dce946b, +0xa3ac7c00, 0xfc926c6f, 0x3ac625ae, 0x743a6263, 0xd09eafa6, 0x00000000, 0xd3d9acb8, 0x90223ef4, 0xa4c9bdde, 0xc8149f5e, 0x0422c2c0, 0x2f26b0cc, 0xdd997a27, 0x5c791371, 0x8ce7bcd7, 0xf8b0aeaf, 0x16cae667, 0xcb3eec5b, 0xfbf7adb1, 0xf8dddeb4, +0x904f4eef, 0x818d194d, 0x2b690217, 0x5b1cd2af, 0x032a7305, 0xb50bea7c, 0xfb9addaa, 0x37ac8034, 0x6cb0529b, 0x62f08404, 0xa3c10c1b, 0x8fa0bfc9, 0xf2bfcaeb, 0xaeaba981, 0x0708b1c5, 0xb14458a7, 0x7018a0a3, 0x3da3e470, 0xb6219979, 0xc63939da, +0x2c61b3d2, 0x9e62e86b, 0x88c57e17, 0xc5134adf, 0xa7e3cedb, 0xe310ed52, 0xb8614fe6, 0x30c941ea, 0xcc365d9e, 0x40d1e149, 0x4ade850d, 0x11c257a2, 0x93084df1, 0xa9a31844, 0x5254b5f5, 0x1ba043fd, 0x398126b0, 0x8c8acccc, 0xd0f3dfbd, 0x158de579, +0xaae41b5a, 0x37c1f02f, 0x7d720539, 0x8bef0d12, 0xcf715e80, 0xd4d11d7d, 0x82a76a48, 0xddf40a3c, 0x30a431f1, 0x629df41f, 0x43fb924c, 0x2b04720c, 0x4ab3f516, 0x6cdd2280, 0x34eb832a, 0x1bcd33e6, 0x0e2da684, 0xa0eb7f1e, 0x6892905b, 0xf6f07830, +0x972a8f31, 0x93653dea, 0x555c0430, 0xee7a48c8, 0xd7961e63, 0x2221654d, 0x5836a1aa, 0x66d246c4, 0xbf356003, 0x192a2a68, 0xb3e651d3, 0xfcc769d3, 0x50def120, 0x5d4121e1, 0x9a6df23b, 0x7e406cfd, 0xd315151f, 0xaa4047d7, 0xd4002b2a, 0x89cd36a7, +0x8f18d5ef, 0x25589238, 0xcceadc3f, 0x008c3c6c, 0xcab3031b, 0x795552c8, 0x8ed80892, 0xcc66e053, 0xcd2a0142, 0x44e737e5, 0xd48c1746, 0xf098646f, 0xab809aaa, 0xfd8b88c2, 0x06d5e348, 0xd2d5c862, 0xd5c0f657, 0x613399b1, 0x73dfbc3c, 0x29079f84, +0x00000000, 0x67e67af9, 0x1866cb79, 0x4ee1e57d, 0x9bad2f46, 0xee2b4c5e, 0x6a79aa38, 0x6b354b29, 0x7f80b180, 0x90e71ccf, 0x8881d7b6, 0xdfc624cf, 0x85923b1b, 0xa61f4a6b, 0xe2f87d8e, 0x30a18980, 0xe5ed43bb, 0x9127c1b2, 0x36746ac8, 0x96bec3eb, +0x2e12a1b1, 0x977e1e96, 0x511e2c5d, 0xf158b912, 0x5c81fc9c, 0x302db5ec, 0xd85f2696, 0x3b678665, 0x8e5434fe, 0x84deda0a, 0x5c0dc0f0, 0x43f209d0, 0x01c0dd7d, 0x298ba3e8, 0x79d96ea4, 0x5052cd4c, 0xb9e0834b, 0x6c20751c, 0x3aa75b18, 0xe3b49c9f, +0xfd07b4ae, 0x83cbe43f, 0x126019e1, 0x676a4695, 0xf0145803, 0xa046954f, 0xb5bf8ef7, 0x7819b3d9, 0x5a541fd4, 0xb8205e36, 0x49f4db48, 0xab0ca6c6, 0xf6c1bb4b, 0xcda63d2e, 0x74ca8209, 0x42bee8c1, 0x91abfdde, 0x24984f45, 0xdf4a18a3, 0x2e9e9ddd, +0x66aa9be8, 0x750a5f74, 0xd99ffbeb, 0x78958fb5, 0x7446be65, 0x560b1268, 0x1fffc920, 0x56872e04, 0xad5579e2, 0xe4a1a2aa, 0xb96cbf27, 0x45abd6f4, 0x3cfe843c, 0x73538050, 0xd8d31afa, 0xf7016636, 0xb2268cae, 0x4232d4ad, 0xbe798112, 0xeea77032, +0x0bc60fe5, 0x8452e666, 0xbef5bd7e, 0x9632ff87, 0x316154fd, 0xfbd257e6, 0x4f213800, 0x48b83a59, 0xc72cd3da, 0xf78d5a5a, 0xa6937607, 0xc039edef, 0x0a8aeef4, 0xcbffe20a, 0xc0b5d183, 0x9cb81173, 0xcb73de66, 0x4fad046c, 0x72935d2d, 0x5747f379, +0x14b5faa9, 0x23014d1c, 0xbfb95c6f, 0xfa128a9b, 0x25d4ae54, 0xe42d9ec6, 0x7f0c8dec, 0x07990259, 0xc66032cb, 0x1eb32831, 0x5b94c2a9, 0x0a06d298, 0xc7a0efb6, 0x0cd331d0, 0xe872937a, 0x12ec258d, 0xd913c787, 0x48340635, 0xe338a0f3, 0xb8ac625a, +0xef67ad4f, 0x1e3f145d, 0xac1998f3, 0xe8feaf16, 0x9c342d1f, 0x6af59654, 0x6626a784, 0xca3f3f77, 0xe27441e2, 0x07153e35, 0x19a61604, 0x8287052e, 0x36f856a4, 0x24147329, 0x4978e724, 0x6bb97745, 0x61bfa5dd, 0x6de0a861, 0x157527d4, 0x1f73f54c, +0x8347d853, 0x15f91bb8, 0x2f5e40a0, 0x820b3942, 0xd3992973, 0x4e6dd911, 0x0659df24, 0xefeb9123, 0x224dac0d, 0x906b20a3, 0x437e35bc, 0x4527ea98, 0x607f78a0, 0x28c742f9, 0xde06f9b2, 0xc1750cfe, 0x60f344cc, 0xa0caa923, 0x22c19061, 0x1439c6c5, +0xb4f36fe6, 0x9ae1ce57, 0x3a2b6774, 0xb47f538a, 0x9b21132a, 0xa10a745e, 0xb2aab0c2, 0x37388bd9, 0x9d78cc0e, 0x75866318, 0x5ad823b8, 0xa1864832, 0xb36a6dbf, 0xf64d8727, 0x6cac4970, 0x446b0b89, 0xfb5e6b8a, 0x5dcd1d8d, 0x284b7e95, 0x0d13ecad, +0x13a0c49c, 0xfc4b55bf, 0x89410acb, 0xd259f40e, 0x18eaf715, 0x7ecc5091, 0xe9b24e07, 0xe5617fd7, 0x51921031, 0x2fd27ccc, 0xf1d4857e, 0x880debda, 0x5b18fec5, 0x014ce111, 0xd54cca3b, 0x3d3e5941, 0x31ed6891, 0x0b4a3389, 0xc1f93092, 0x37b4b7b5, +0xadd9458e, 0xb533b29b, 0x6d6c940d, 0x0c5f0dbc, 0x9df4f062, 0x132cf8f0, 0xaacc7bbb, 0x57cbcf15, 0xa753ab7a, 0xa7df9716, 0x0d9fd0c1, 0x8f94e983, 0xc6ec0ea7, 0xde8ac5de, 0x97f222fa, 0x238d7170, 0x3db2652d, 0xe93e726b, 0x3bebba09, 0x851e0777, +0xfa9eb6f7, 0x721f6141, 0xac95a49f, 0x3c72b850, 0xb36a3c9a, 0x716db2c9, 0xade5f95c, 0x913e0d45, 0x4302fc6f, 0x0acde094, 0xd2766378, 0xc24d1c01, 0x8536ba45, 0xc8ca6ec7, 0x611c5fe2, 0xa0464dd1, 0xa43f17fa, 0xbe831a45, 0xaac13f17, 0x9fc025a8, +0x5ed0a5c9, 0x004a9252, 0x98e4e3e3, 0xb759f4e3, 0xfaa52061, 0xa72819c8, 0x2fbd1700, 0x1ec55794, 0x814fe06e, 0x9c9db9c8, 0x3cdbf419, 0x8fb1c883, 0xe344b1be, 0x09daeea6, 0xa7628b9a, 0x38a2ae32, 0xedba9953, 0x7ba0525d, 0x035d9c60, 0xd60f3953, +0x0da3b48d, 0xe053bf8c, 0x21433fed, 0x17552b60, 0x326f4ea6, 0xd8bb83ec, 0x6fe2770f, 0x35011abf, 0x3616148d, 0x6cbfeb6f, 0x7c849416, 0x68c6b144, 0xadaf6b0e, 0x88950ec8, 0x66720bfb, 0x09907cf4, 0x7514e8e2, 0x78b75c6f, 0x7603e6d0, 0xc2078e53, +0x1af69fed, 0xb44efad1, 0xccf9a6be, 0x28d34319, 0x7cce0644, 0xbab0d23c, 0xe42ae5a7, 0x1408b700, 0xb9a7dc0e, 0x1071ed2b, 0x5aa9ffe2, 0x961acb0e, 0x0de926df, 0x2570f794, 0xb71366b1, 0xc1108061, 0x5d8d39a9, 0x857c2817, 0xa99ca377, 0x755e7ab0, +0xa35143e3, 0x5457d70f, 0xdc884b95, 0x1abc0dbf, 0x50641f76, 0xc569da4a, 0x688c2316, 0x19ab038d, 0xf45b088c, 0x9650595c, 0x5dc7abfb, 0xfd81e62a, 0xb4046883, 0x43486e3d, 0x8621b477, 0xe46077f5, 0xa31bd1b1, 0x53731144, 0x8ca6c6b1, 0xaa8bad45, +0x103b7f79, 0xdbe61f8c, 0x3c91664b, 0xf4119ade, 0x132c714b, 0x5740d93d, 0xcbdd60f5, 0x7127209b, 0x7beac00f, 0xccb334ec, 0x9bf3edd1, 0x92290377, 0x3f866879, 0x2b8edf79, 0x4a92809b, 0xb9ed4e5c, 0xe77779c7, 0xf9b22e53, 0xb037a0fa, 0xbdde8625, +0xf37fcec7, 0x405f600f, 0x6bd1bf76, 0x3fccfa2b, 0x5ae36db0, 0x03170e32, 0xa47585a8, 0x9547576e, 0xf70694ec, 0x3bff3252, 0x31784094, 0x49cf1cfb, 0x72302ea9, 0x59bef1d0, 0xd645ab01, 0xf3355c95, 0x00000000, 0x8b8200fa, 0x950dc53c, 0xc5234818, +0xc880fc95, 0xd12bff18, 0x2109adbf, 0x9cd72b9a, 0x1e8fc5c6, 0x6241c382, 0xf74c06be, 0xe0192dde, 0x446ca876, 0x0a8772c6, 0x38e83c60, 0xc67ed478, 0x2bc44d2b, 0x253a65c6, 0xd1616d4a, 0x4dfcd482, 0xbafa406e, 0xedf00b01, 0x0724c64b, 0xfaefb233, +0x652f979b, 0xfedc7a4a, 0x88df9c9a, 0xeead9761, 0x7f939a24, 0x225431df, 0x354b88ed, 0x59f46382, 0x6156cdb0, 0xb07d32a8, 0x19e191df, 0x9bb97f83, 0x9f8ab7fa, 0x541d455d, 0x656505c9, 0x620b51d0, 0x98ae71b1, 0xcb97f2a7, 0x92639125, 0xd23cf12a, +0x221ea38d, 0xf02252a7, 0xf068c0f5, 0x8105723c, 0x4ad812c9, 0x53398316, 0xd8f111be, 0x076e5419, 0xd5183761, 0xc634462a, 0x0433c879, 0x4ea148e2, 0x8cec54e3, 0xbec98817, 0x4db646d0, 0xdfd5d7f5, 0xc15a1233, 0x0eb4babf, 0x4eebdab0, 0xd552a533, +0x6cf5793d, 0x3225dcf4, 0xfdcb7478, 0x502e8d24, 0x5e9a379b, 0xbd941477, 0x44263a24, 0x3bb5a000, 0x866b2625, 0x663899a9, 0xead4cd4a, 0xe9c3c378, 0xdbac8dde, 0x91749f17, 0x8258ee5c, 0xea9e5f18, 0x727abcfb, 0x8ffb5ad1, 0x262d6bf4, 0x2ff78552, +0x570a4b6f, 0x6fa8e55d, 0x7fd90876, 0x78fdce3d, 0x171fb932, 0x8bc892a8, 0xb320aec8, 0x1dd259a6, 0x2ce08b60, 0xf9f8bc01, 0xa9d63125, 0x04795a2b, 0x477ba644, 0x2caa1932, 0x3132d2c6, 0x1d98cbf4, 0xe30e23ec, 0xfe96e818, 0x365c86df, 0x76497482, +0xdcc2d9c7, 0xe73deb95, 0xa00cdf83, 0xe989512a, 0xaeb8653c, 0x4015f25d, 0x0efe28ed, 0xdf9f45a7, 0x2899d14b, 0x6b9b2d24, 0xcfeea88c, 0xeee70533, 0xaef2f76e, 0x49858ea9, 0xcfa43ade, 0x14422552, 0x47313416, 0x1366e319, 0x82127c0e, 0x2667f9a6, +0xb4b8855e, 0x104216ec, 0xc790fa0a, 0xcf65d701, 0xa33f76d0, 0x4efdaa2f, 0x961f8ea0, 0x7bdbb16c, 0x8ea8b547, 0x41cb8175, 0x50ddecc9, 0x34726013, 0x6b99a780, 0xfcd4b143, 0x19e5a384, 0x7bdd525f, 0xaa98c3b8, 0x80cae54d, 0xa5aee8e2, 0x1e26a5d5, +0xe2f4f7a5, 0x0e62500a, 0x486ad72e, 0xf2b6e149, 0xfd862920, 0x16d56bed, 0x7d4a2f5e, 0xe4656997, 0xd68697b6, 0x0006e333, 0xeb55a1fe, 0xbc4da855, 0xedc43fcc, 0x09a7b568, 0x974bf5f0, 0x65fbf78a, 0x1f72de85, 0x6d0eda81, 0x2cc55bf4, 0x65fd14b9, +0x91dc88f1, 0x1787f38e, 0x6acddcd0, 0x3c81ae2b, 0x0f30c869, 0xa26b0d80, 0xeb5342cd, 0xfa43cc42, 0x2a5226f5, 0x2d9120a4, 0xce374f62, 0xd9b0bcec, 0xfa452f71, 0x987b3d99, 0x8709e31c, 0x8eae5674, 0xc1016438, 0x597cba92, 0xe53112c7, 0xce31ac51, +0x636a69b8, 0xbd19d305, 0xbadad554, 0x07c30651, 0xf4277f7b, 0x409ffa25, 0x08f52d0b, 0xe3a08cf5, 0xb4be666d, 0x51899799, 0xf4219c48, 0x865b7b7f, 0xd9b65fdf, 0xa4fc7081, 0xd8e2248f, 0xf573042b, 0xc9f44933, 0xa33995e3, 0x564c72fb, 0xc7961939, +0x9fbed8fb, 0x2a54c5c6, 0x11108e8f, 0xedc2dcff, 0xbd1f3036, 0xc053fc5b, 0x4fa9d17f, 0x908e1092, 0x178110bd, 0xa26deeb3, 0x5eb95ff0, 0x81987d2e, 0x00000000, 0x32e51d12, 0x8ffa2d24, 0x33b78571, 0x987ddeaa, 0x896bb316, 0xb2291b6c, 0x01529863, +0x46088724, 0x460e6417, 0xbb8eae04, 0x40991916, 0xabccb8e8, 0x3b444b49, 0x475cfc74, 0x96196d93, 0xcf633432, 0x06919e32, 0x486c341d, 0x74ed9a36, 0x2b065da5, 0x0e64b339, 0xc8a6d150, 0xbc4b4b66, 0x23f370ae, 0x2562ee9c, 0xfb17b712, 0x9088f3a1, +0xbb884d37, 0xd7d40fd5, 0x74eb7905, 0xde75598e, 0x7a8fca3c, 0x50db0ffa, 0xc9f2aa00, 0x992f46c9, 0x9eeaa3ab, 0xd14372d4, 0x9eec4098, 0x5ebfbcc3, 0x3dd5d57b, 0x7a89290f, 0x3a103019, 0x23f5939d, 0xc0551f68, 0x4faf324c, 0x18b73be7, 0xb5ea1d3d, +0xf575e718, 0x493eac7e, 0x6c5c42e2, 0x974d16c3, 0x1044f5df, 0x5828c1c2, 0x9929a5fa, 0x636c8a8b, 0x41cd6246, 0x727c0404, 0x865d984c, 0x0f362b5a, 0x32e3fe21, 0xd7d2ece6, 0x18b1d8d4, 0x35261b43, 0xd011eab7, 0xdf2122de, 0x243695cc, 0x819e9e1d, +0x64a96fe9, 0xbadc3667, 0x49384f4d, 0xf3e29a19, 0x33b16642, 0x623e12e8, 0xc6c26269, 0x75bf0255, 0xe4638aa4, 0x25640daf, 0x2cc3b8c7, 0xfcd25270, 0xfd80ca13, 0x6b9f44b3, 0xde73babd, 0xd0170984, 0x75b9e166, 0x2d97c397, 0xe537f1f4, 0x870f002f, +0xac0fbeb9, 0xb5ecfe0e, 0xb37b830f, 0x4efb491c, 0xabca5bdb, 0xf2b0027a, 0x16d388de, 0x896d5025, 0x11166dbc, 0xc8a03263, 0x597a59a1, 0xad5d26da, 0xea01daae, 0x91da6bc2, 0x6acb3fe3, 0x80cc067e, 0x564a91c8, 0x6238f1db, 0xf3e4792a, 0xa4fa93b2, +0xd6807485, 0x7c18b73d, 0x5febc793, 0x582e22f1, 0x9fb83bc8, 0x8ffcce17, 0x07c5e562, 0xc107870b, 0x243076ff, 0xe3a66fc6, 0x06977d01, 0xfb115421, 0x3520f870, 0x3a16d32a, 0x5fed24a0, 0x571eea98, 0xea07399d, 0xd14591e7, 0x571809ab, 0x3dd33648, +0xad5bc5e9, 0xd8e4c7bc, 0xec90449c, 0x475a1f47, 0x732e9c67, 0xe2f21496, 0x518f74aa, 0x73287f54, 0x7d4ccc6d, 0x883fc846, 0x22a70bfe, 0x19e340b7, 0x2b00be96, 0x88392b75, 0x727ae737, 0x1e2046e6, 0x1f743db6, 0xb37d603c, 0xa5a80bd1, 0x3b42a87a, +0x7c1e540e, 0x34748320, 0x6c5aa1d1, 0x08f3ce38, 0xb22ff85f, 0xaa9e208b, 0x01547b50, 0x64af8cda, 0x3c874d18, 0x09a1565b, 0xc6c4815a, 0x22a1e8cd, 0xac095d8a, 0xec96a7af, 0x6d0839b2, 0xdf27c1ed, 0xc6294b03, 0xc1dda35b, 0x52f4619d, 0x2a331abd, +0xb91ad87b, 0x9d927b29, 0x2e85f30a, 0x944f7ac1, 0xe0333eac, 0xc5f91ab3, 0x970d7b2e, 0xca002411, 0xc09f2416, 0xbeee3023, 0xe3713f43, 0x72ca2b78, 0xb1855ede, 0xce249df9, 0xeb7ce9b9, 0x7da14585, 0xc800a2b3, 0x034201ef, 0x28339c1f, 0x28a1cc40, +0x9d002b76, 0x09dd01e8, 0x93bb9299, 0x0292d6fd, 0x0f6b6efd, 0x0bdd874a, 0x2fc77447, 0xedca86ac, 0xe75586ab, 0xcff44aeb, 0xbceeb681, 0x29711b52, 0x2758f2e2, 0x979f2b71, 0x5e4f5ed0, 0x58f931c5, 0xe7c7d6f4, 0x217ccda8, 0xc94225fe, 0x5124302d, +0xec1a51be, 0x59bbb688, 0x22ac9c18, 0xc20df2eb, 0x0b4fd715, 0x711a7ac8, 0x586b619a, 0x747c446d, 0x07f4e858, 0x2c1725f7, 0xe68551b9, 0xbd3e6193, 0xb4713024, 0x9924929e, 0x7fa1c327, 0xe3e36f1c, 0xe2a1e851, 0xba58d994, 0xc9d075a1, 0xb8585f36, +0x9c42ac3b, 0x5066b760, 0x9f00add4, 0x54d05ed7, 0x959fadd3, 0xcc241b5b, 0x773e4582, 0x75ac937f, 0x77ac15dd, 0xee1ad71c, 0xca92744e, 0x964ffc63, 0x74ee1432, 0xe83ee856, 0x2d55a2ba, 0x2c8575a8, 0x7d3315da, 0x9329c2c6, 0x98f4458c, 0x99b6c2c1, +0x9e422a99, 0xea3e6ef4, 0xe4178744, 0x080dd6fa, 0x2488a352, 0x7388ac35, 0xe5550009, 0x0cbb3f4d, 0x9cd0fc64, 0x5f9f89c2, 0xb1170e81, 0xbe7c607c, 0xb2550f6e, 0x203e4ae5, 0xbb1a5ed9, 0x0c296f12, 0x0142874d, 0xcb42a35c, 0xb5a1e736, 0x020086a2, +0x9f92fd8b, 0xe0a16ef3, 0x550089c5, 0x906bc329, 0x71882a97, 0x7f339378, 0xb4e3607b, 0x2f552418, 0x70caadda, 0x5642882a, 0x7ce3c2c8, 0xcd669c16, 0x27caa2bd, 0x2dc7f2e5, 0xe5c75056, 0xb7a16194, 0xc34f75a6, 0x926b458b, 0x0e29e9b0, 0x90f99376, +0x5edd0e8f, 0xb05589cc, 0xc429cda1, 0x0a0d5058, 0x01d0d712, 0x5f0dd99d, 0xe233b80e, 0xc76bcc4e, 0x5324b68f, 0x7e711435, 0xe8acb809, 0x51b66072, 0x2aa14ae2, 0xe61701e6, 0x0d6be85f, 0x7985fc6d, 0x5cdd882d, 0x06b66f15, 0xed58d6f3, 0xb8ca0f69, +0x268825f0, 0x20ac1aba, 0x7ee3446a, 0x57000f67, 0xb533b769, 0x261a75af, 0x0ff93ea2, 0x5b296075, 0xbdac31cc, 0xc4bb9dfe, 0x78552b7f, 0xcbd0f303, 0x57925f38, 0x9ed07ac6, 0xbf3ee731, 0x5af9b767, 0xc29fa2b4, 0xe1e3e9be, 0xc14ff304, 0xc56b4aec, +0x9b24143c, 0x29e34b0d, 0x089f86a5, 0x0092505f, 0xee888743, 0xb6e3e6d9, 0x731afc6a, 0x5a6be738, 0xe171b9e1, 0xc00d7449, 0x223ecc47, 0x0df9b800, 0x9af4c32e, 0x96ddac3c, 0x23ee1b55, 0x9a669371, 0xc3dd25f9, 0xc6bb1b5c, 0x05663ea5, 0x92f915d4, +0x54420e88, 0x950dfd8c, 0x7058fd85, 0xb385d87c, 0xc892f2ec, 0xbb880e86, 0xb671b686, 0x94dd2a9e, 0x9bb64463, 0xebeeb9e6, 0x7b172a90, 0x5bbb302a, 0xe9ee3f44, 0x237c4b0a, 0xb73331cb, 0x56d0d875, 0xeaac3eab, 0xccb64b04, 0x526631c2, 0x2be3cdaf, +0x0424b9e8, 0x241af30d, 0xef585051, 0x767cc2cf, 0xc7f99c11, 0xefca000e, 0x0766b807, 0xceb6cda6, 0xcdf4cc49, 0x78c77b20, 0x72587b27, 0x00000000, 0x5592d99a, 0xb2c75f31, 0xbc7ce6de, 0x7a55addd, 0x7ac7fd82, 0x5d0d5f3f, 0x25ca241f, 0x0a9f0007, +0x094f51b7, 0x91bb143b, 0x0ebbb9ef, 0x7b857acf, 0x53b6e6d0, 0x91294464, 0x7c719297, 0x25587440, 0xbfacb76e, 0x05f46efa, 0x04b6e9b7, 0xb9888824, 0x5d9f0f60, 0x76ee9290, 0x2e17a355, 0x21ee9df7, 0x986615d3, 0x5c4fd872, 0xe485d71b, 0x7917ac32, +0x06243f4a, 0x5929e6d7, 0x50f4e73f, 0xec8801e1, 0xbaca89cb, 0xe97c6f1b, 0xb0c7d993, 0x03d051b0, 0x753ec320, 0x2b719df0, 0xb3178823, 0xcf661ab4, 0xf010cfcc, 0x894f185c, 0x3008e9f3, 0xee8063d5, 0xcbdb04bb, 0x022d7896, 0x97dfb445, 0x4a1ef9a1, +0x9e31ee57, 0xa98f7076, 0x20c0682a, 0x6e21219b, 0xbcdcfeeb, 0x6f459ecf, 0x7da06780, 0x49573e63, 0xa5fa2520, 0x6ade918b, 0x4ccc3127, 0x292e3238, 0x86738ac8, 0x4446d461, 0xa6b3e2e2, 0x9c1c96c1, 0xdca5f2b0, 0xcd09cc3d, 0x882ba708, 0x48338137, +0x58fb00ee, 0xe852ab53, 0x059b0f44, 0x470f13a3, 0x466bacf7, 0x15538e9d, 0x3c7dbca5, 0x783b68c4, 0xaba208e0, 0xe60a8693, 0x83e8858c, 0x5c04b0fe, 0x3593e6b7, 0xae3907a4, 0xfe48e20c, 0x0c755556, 0x525c9d3e, 0xb0a9abbd, 0xb947f1af, 0x752a82c6, +0x243fd83a, 0x22ed10bc, 0x853a4d0a, 0x316c56a7, 0x6d68e659, 0x177ef60b, 0xde888a26, 0x06d2c886, 0x65e2031f, 0x7ee9a042, 0x9d782995, 0x088ae546, 0xf7a6b81e, 0x04ffb010, 0xedc9a417, 0x0bc32284, 0x8717359c, 0x7f8d1f16, 0x1b0ba35d, 0x3d1903f1, +0xbef1867d, 0x73f84a40, 0x5338226a, 0x2612a0ac, 0x6bba2edf, 0x0d11ea02, 0x7cc4d8d4, 0xb67b633b, 0x95f2ccd3, 0xc4e7962f, 0xe0d84e15, 0x39e6b3e1, 0x599fbfba, 0xcabfbbef, 0xa8ebcf22, 0x1e90ac19, 0xa0612a64, 0x1926dbcb, 0x143731c9, 0x36da2175, +0x33412e31, 0x5bb2c72c, 0xddc14de4, 0xfc659a9a, 0x8ef96f8e, 0x8b6260ca, 0xd93efdf4, 0xfab7521c, 0x98e326d1, 0x99879985, 0x12e5f94f, 0x9f555103, 0xcc6d7369, 0x0f3c9294, 0x93200455, 0x3aaf7423, 0x2e9845ea, 0x828c3ad8, 0x45226b35, 0xe2f53683, +0x5f4d773c, 0x9ace5e47, 0xf359080e, 0xa7d75db6, 0xf9fe95de, 0xb532a4f9, 0x60790c5b, 0xb284d32b, 0xf1747098, 0xc351e1fd, 0x41dddb25, 0x57c7927a, 0x96bb0b11, 0x40b96471, 0x2389afe8, 0x8db0a84c, 0x3f347b67, 0x161a495f, 0x69975649, 0x1dd96bdb, +0x2ffcfabe, 0xa328eda6, 0x51155afc, 0x38820cb5, 0xfbd3ed48, 0x6c0c590d, 0xa1059530, 0x34f759e3, 0x0aa79dd0, 0xea7fd3c5, 0x4b7a46f5, 0xaf5db8f0, 0x2a67f5fa, 0xc6caeeb9, 0x66abc4dd, 0x4da88e73, 0xf6c2074a, 0x21a4d77e, 0xd2fddf70, 0x5d600faa, +0xc7ae51ed, 0xb8234efb, 0x0e582dc0, 0x10c881d9, 0xbb6a8939, 0xf89a2a8a, 0xd54ba8a2, 0xfd0125ce, 0x1842649f, 0xe9361407, 0xe39189d7, 0xd6026f60, 0x2cb53d7c, 0xac147f32, 0x729cf514, 0x71d532d6, 0xdb138562, 0xc2355ea9, 0x07b677d2, 0xd766d034, +0x3e50c433, 0x2b034aae, 0x744e3d92, 0x5071e5a8, 0x9069c397, 0xc892c379, 0xb3e06c7f, 0xbf953929, 0xc17c996b, 0x94967387, 0x56a32d2e, 0xcf24b4ab, 0x1381461b, 0x4f85f6e5, 0xe1bcf141, 0xf23db75a, 0xa24c52f2, 0x43f0a3b3, 0xbdb841bf, 0x910d7cc3, +0x9244bb01, 0xc018263f, 0x6486bc4b, 0x5ad67878, 0x27761ff8, 0x7a161052, 0xc583297b, 0x67cf7b89, 0x0164bf54, 0x70b18d82, 0x68f3e91d, 0x0349c7c2, 0x32259165, 0xd85a42a0, 0xf4ef7fdc, 0xe427fe05, 0x255b676e, 0x2dd18228, 0x80a1424e, 0x1ff4134d, +0x1cbdd48f, 0xeb1b6c91, 0x611db30f, 0xe76e39c7, 0xad70c066, 0x00000000, 0x7707fa50, 0x795fd790, 0x845ef25e, 0xb4561bad, 0xecad1b43, 0xd0d0a7e6, 0x4ee149b1, 0xd42f17f6, 0x76634504, 0x37be9e21, 0x548e55b8, 0xe5434151, 0x8a06df9e, 0xd3996024, +0x3bcbcb77, 0x8cd41718, 0x6330cb99, 0x11ac3e8d, 0x42941ce7, 0x55eaeaec, 0xda773a36, 0xd1b418b2, 0x09ee5a12, 0xce400bff, 0xf58bc088, 0xefe4dc81, 0x625474cd, 0x284a8d6c, 0x9baae113, 0xa49e9a74, 0xff2c5d58, 0x7b72af06, 0x8f9dd0da, 0xb71fdc6f, +0xdfec3572, 0x5e29c868, 0xc9f67c2d, 0xaac6b7b4, 0x81c5fd1a, 0xba0e366d, 0xb1cd14e9, 0x1a6f1c09, 0xb20bb8c9, 0xdedfe7ea, 0x551075c9, 0xa8a08f4b, 0x6cd45f23, 0x10f66f2d, 0x6cbce9e8, 0x9122ff43, 0x2307aba3, 0xd6db5420, 0x2170acef, 0x31a82feb, +0x39827008, 0xa0a43c81, 0x57677285, 0xdc860c8f, 0x4d8a1fe5, 0x6e8db446, 0xf5dcff83, 0x39c42aea, 0x83e5cdc0, 0x64b85a22, 0x45c8f6cd, 0xdca8e0a6, 0x76393243, 0x12af8448, 0xa2d33bcd, 0x10b035cf, 0x66a7eba5, 0x99264c89, 0x910c136a, 0x0259eb65, +0xf5b44948, 0x742683c4, 0xe52a90ae, 0xfdf6a060, 0xba4951e1, 0xcc18d569, 0xba67bdc8, 0xe5422665, 0x3bb32da6, 0xef592428, 0x3bf57744, 0xdef10bc3, 0xd4ea098e, 0xcc5e8f8b, 0x66e1b147, 0x295af30c, 0xa88e6362, 0x00465ae2, 0xa0cc8a4a, 0xe56cca4c, +0x9b7fa7ec, 0x64d0ece9, 0x5f259bad, 0x57499eac, 0x8192ca8c, 0xff81a72c, 0x7c0cdc27, 0x5f4d2d66, 0xce413e0c, 0xaabf3ecc, 0xffaf4b05, 0x291ca9ee, 0x021fb187, 0x937b1426, 0x0a1b024d, 0x4f95ae62, 0x553e99e0, 0x47911da8, 0x9b171127, 0xed00cf4d, +0xa2fdd7e4, 0x7c4a86c5, 0x76518488, 0xed687986, 0xd6f5b809, 0xce0764ee, 0xba21e72a, 0x0a35ee64, 0xd6b3e2eb, 0x45a04006, 0x29741f25, 0x4ffd18a9, 0x767f68a1, 0xcc363940, 0xf78514e6, 0xb07cbf85, 0xce2988c7, 0x12c73283, 0xfd9e16ab, 0x0a73b486, +0x744e350f, 0x9355f80f, 0x12816861, 0x21181a24, 0x5d529ce1, 0xaad78807, 0x7c646aec, 0x6c9205c1, 0xaa91d2e5, 0x2329478a, 0xb03ae567, 0xed4695af, 0x39ac9c21, 0xed2e2364, 0x7e136da0, 0x002eec29, 0x7c22300e, 0x9960166b, 0x33997245, 0x082a5fe3, +0x8ba724e8, 0x33b79e6c, 0xe75d97e2, 0xf7c34e04, 0x109ed9e6, 0x9164a5a1, 0xe7737bcb, 0x2136f60d, 0xb22554e0, 0x6ea3586f, 0x4dcc4507, 0x9313a2ed, 0x31ee7509, 0x81d4906e, 0x8b89c8c1, 0x47d7474a, 0x0804b3ca, 0x4fbb424b, 0xc6458dc6, 0x74086fed, +0x83cb21e9, 0xb2630e02, 0xef77c801, 0x18dc30ce, 0x2b2df440, 0xc41c66a3, 0x81fa7c47, 0x086c0501, 0x55562f2b, 0xa0e26663, 0x5d3a2a2a, 0xef1f7eca, 0xa8e6d5a9, 0x189a6a2c, 0x914a4988, 0xd69d0ec2, 0x458eac2f, 0xe7352129, 0x00000000, 0xfdd84c49, +0x33df28a7, 0x9908a0a0, 0xb810ba84, 0x2b6baea2, 0x9b39fd0e, 0xffe911e7, 0xb856e066, 0xdeb75121, 0xb014094e, 0x89d023a4, 0x33f1c48e, 0x18b48605, 0xf7eda22d, 0x838d7b0b, 0x994efa42, 0xa295612f, 0x2b031869, 0x1aed6d60, 0x0068b6cb, 0xe71bcd00, +0x1ac38149, 0xdcc0566d, 0x7e553742, 0xaaf9642e, 0x57212867, 0x7e3d8189, 0xce6fd225, 0x9b514bc5, 0x3bdb9b6d, 0x1a85dbab, 0xde99bd08, 0xf5f213aa, 0xf59aa561, 0x7617de6a, 0x3186c3c2, 0x89b8956f, 0xc603d724, 0x2b45428b, 0x1aab3782, 0xb83e56ad, +0x215e40c6, 0x8be17e0a, 0x5f63c14f, 0xc62d3b0d, 0x18f2dce7, 0xc474d068, 0x39eac6c3, 0x7e7bdb6b, 0x66cf5d6e, 0x4de2a92e, 0x89967946, 0x293245c7, 0x5d7c70c8, 0x10d88304, 0xcc7063a2, 0x5578c302, 0xb24de22b, 0xa8c83980, 0x6496b60b, 0x5f0b7784, +0xef3192e3, 0xa2bb8d06, 0x81bc26a5, 0xd4ac536c, 0x6ee5028d, 0xa08ad0a8, 0xfdb0fa82, 0x0277074c, 0x2341f141, 0x236f1d68, 0x0a5d58af, 0x5d14c603, 0xf7abf8cf, 0x7460d926, 0xe5047c87, 0x45e61ae4, 0x3b9dc18f, 0x0842e928, 0x47f9ab63, 0x02315dae, +0x933d4ec4, 0x64fe00c0, 0x4da4f3cc, 0x31c09920, 0x89fecf8d, 0xb05253ac, 0x6ecbeea4, 0x4fd3f480, 0x6689078c, 0x83a39722, 0xc45a3c41, 0xc4328a8a, 0xd482bf45, 0xb8780c4f, 0xc66b61ef, 0x6cfab30a, 0x570fc44e, 0x12e9deaa, 0xffc7fdce, 0x47bff181, +0xba0f0b03, 0x8bcf9223, 0xdceeba44, 0xd4c4e5a7, 0xe36963b4, 0x1c5368ae, 0xc60cab30, 0x4c1bac27, 0x6b263c5d, 0x96446fb9, 0x5eb36e88, 0x3d6fa8c8, 0xaf72cf93, 0x034e796e, 0x00000000, 0x697e64a3, 0x884f5fe9, 0x87a2d478, 0x16f1ca4d, 0x85fa8c86, +0xa865be1f, 0x90453fa5, 0xf93b5b06, 0xcaaf59cf, 0xa5d06d70, 0xbe947452, 0x58b23e94, 0x515ee519, 0x2d9f3299, 0xab2bc771, 0x83fbdc9a, 0x1f1d11c0, 0x180a604c, 0xc255a3d2, 0x82edfd0a, 0xf82d7a96, 0x1a5238b2, 0xec84e825, 0xf28fd875, 0x8f582e65, +0xe9cbc157, 0x5ceb3676, 0x575fb505, 0xd8079b60, 0x732c5c11, 0x23649898, 0x9df0ecca, 0xa09f4402, 0x45f777aa, 0x950a16d7, 0x4b0cddab, 0xaa3de6e1, 0xbbdb5d20, 0xa1896592, 0xdc5e9382, 0x2c891309, 0x743b2d9d, 0x6a301dcd, 0x49548555, 0xd2a53983, +0x045908e2, 0xb520f721, 0x0efbaa01, 0x7dd7f610, 0x46b90ec4, 0x91531e35, 0xbacd7cb0, 0x56499495, 0xf48e8869, 0x2565c884, 0x2473e914, 0x28d01beb, 0x921d675b, 0xd911baf0, 0x202ae1f6, 0xed92c9b5, 0x1b441922, 0xac3cb6fd, 0xc00dfb2c, 0xf0d7808b, +0x7ac0879c, 0x59a41f04, 0x6785cea2, 0x8c16570b, 0x61849ebe, 0x0717718c, 0xefca914b, 0x798efef2, 0x5bfc47fa, 0xfe2c2a8a, 0x09ecdb8d, 0x01162190, 0xcef6512d, 0xf7c0f107, 0x0601501c, 0x0db5d36f, 0x5048c489, 0xe47e1238, 0xc542d25e, 0xcbb9785f, +0xfa752268, 0x359552d5, 0x7062257f, 0xb98305de, 0x941c3747, 0x723a7d81, 0xcdb82843, 0xda5fc39e, 0x213cc066, 0x17e7ebdd, 0x5306bde7, 0x36db2bbb, 0xc3438242, 0x64cbb7cc, 0x262bb1ea, 0x6f7f34bf, 0x40b85ed8, 0xde06cb7c, 0x43f627b6, 0x8b012687, +0xfb6303f8, 0x2ed14bf7, 0x6693ef32, 0xcfe070bd, 0xeb9399a9, 0x80b5a5f4, 0x42e00626, 0x752d0c0d, 0x9ce6cd5a, 0xb179ffc3, 0x76637563, 0xe6264ac6, 0x12a8c2af, 0x47af2f54, 0x8e4e0ff5, 0x3c798958, 0x8d00769b, 0xea85b839, 0xe56833a8, 0x4e43f4d9, +0xfc747274, 0xb66e8e4f, 0x37cd0a2b, 0xe8dde0c7, 0xb778afdf, 0xdb49e20e, 0x717404ef, 0xd7ea10f1, 0x4f55d549, 0x08fafa1d, 0xdd48b212, 0x3936a02a, 0x6c314dd1, 0x1d45493e, 0x81a38464, 0x86b4f5e8, 0xe7306b56, 0xd6fc3161, 0xae64ee03, 0x5fa54f18, +0xe27f4224, 0x054f2972, 0x30da7ba7, 0x10f09a51, 0x9ae79d46, 0xb436d6b1, 0x84ecad16, 0xd0fd617d, 0x11e6bbc1, 0x5507edfb, 0xe0271ada, 0x14a992b3, 0x7bd6a60c, 0xff3a0b1a, 0x5dfd17e6, 0x0ca3f2ff, 0xc11bdabc, 0x98bfc5b8, 0x41ae7f48, 0x3f37f036, +0x68684533, 0x3e21d1a6, 0x8a170717, 0x4842a4c5, 0x3a78d944, 0x52109c77, 0xa2c71cfc, 0xd4a4699f, 0x62cae7d0, 0xa69e141e, 0xb321a73d, 0xeedcb0db, 0x382081ba, 0x29c63a7b, 0xa788358e, 0xb895244e, 0x6092bf2e, 0xb23786ad, 0x3b6ef8d4, 0xc8f70131, +0xd3b31813, 0xa3d13d6c, 0xf1c1a11b, 0xf598a9f9, 0x15bfb323, 0x777554f3, 0x4d0d8db7, 0x0fed8b91, 0x5411cc6b, 0x7e998f7e, 0x99a9e428, 0x5aea666a, 0xccae09d3, 0x025858fe, 0x2b9e6285, 0x6d276c41, 0x34837345, 0x7898df62, 0xc454f3ce, 0x273d907a, +0xe1313b4a, 0x0bb48373, 0x32822359, 0x6e69152f, 0xa4c64ce0, 0x63dcc640, 0xbccc2cac, 0x13bee33f, 0x1e0b3050, 0x89597e79, 0xad2a976d, 0x930b46cb, 0x339402c9, 0x0aa2a2e3, 0x2fc76a67, 0x2a884315, 0x9fa8b434, 0xc71a8aa0, 0x9bf1bcd6, 0x191c41dc, +0x7cc1d780, 0x2272b908, 0x4a1afc3b, 0xd5b2480f, 0x31cc5a37, 0xdf10eaec, 0xf399f9e5, 0xc9e120a1, 0x9ebe95a4, 0xbf8255c2, 0x44e1563a, 0xd1eb40ed, 0x65dd965c, 0xbdda0d3c, 0x97524e29, 0xf6d6d097, 0xb06fde53, 0xfd6253e4, 0xa9739f8f, 0x7f8faeee, +0x519badc1, 0x5d43b2f6, 0xa2669448, 0x9125e338, 0x1d35c082, 0xffef95a4, 0xccace2d4, 0x7b6ad140, 0x159b8615, 0xdd8b8e7b, 0x00cab31a, 0xbf5354ca, 0x3f51db5d, 0x6e3be44f, 0xfba2edcd, 0x1dc45251, 0x66ae8311, 0x37ff9dca, 0x8c1023ba, 0xfb685ed7, +0xddb0afb2, 0x0c12ac2d, 0xc4f33690, 0x3389c46a, 0xbbd49fb9, 0xc0856f30, 0x2295890c, 0x6664300b, 0x111c4d66, 0xa2ac2752, 0xeec8f90b, 0x91d471eb, 0x22aea8c5, 0xc8e19abd, 0xd5d45a3f, 0x8cda90a0, 0x19892a38, 0x9dc6ddc6, 0x844ff7fe, 0x8474d637, +0x19b20bf1, 0xee024a11, 0xa610cde8, 0xbf99e7d0, 0x37c4bc03, 0x19439922, 0x95a2284b, 0x88acc900, 0xd153914c, 0xaaf3f316, 0xf7b041e0, 0xbb250d6a, 0x44002bd4, 0x33437770, 0x08ae4697, 0xae743865, 0xc82b29a7, 0x3bd6102e, 0x2e872521, 0xb3b06a34, +0x0487cb73, 0x3f6afa94, 0xb37ad92e, 0x8ce1b169, 0x551c66b2, 0x00f192d3, 0xc402a443, 0x3b1ca334, 0xb38b4bfd, 0xaebe8b7f, 0xe65d9e55, 0x00000000, 0x7f1c88e0, 0x77435ca4, 0x73350504, 0x4087e0a7, 0xeef3d8c2, 0x77b2ce77, 0xd90c4508, 0x48e3152a, +0xea7413b1, 0x4c64de59, 0x885d5bd3, 0xd51ee925, 0x0c298de4, 0x7ba0625a, 0x5d78933f, 0xf78b6029, 0x84be652d, 0x7b51f089, 0x156a14c6, 0x730e24cd, 0x4c954c8a, 0xbfa2c619, 0xae85aab6, 0xaac8d2df, 0xcc97c31d, 0xbf687503, 0x2ebc04e8, 0xc810086e, +0x0cd81f37, 0x3b2782fd, 0xfb537f1e, 0x88667a1a, 0xd1992256, 0xa25db581, 0x370e0f19, 0x26e3d0ac, 0x225f3a16, 0xdd7a1ca8, 0x11eddfb5, 0x5db22025, 0x6e00c586, 0x0ce33efe, 0x047659a0, 0x262963b6, 0x73c497d7, 0xa297069b, 0x4c5fff90, 0x77787d6d, +0x55d6d5a8, 0x2a3bcf9b, 0xe2e174ef, 0x590eca9f, 0xd9c6f612, 0x04bceaba, 0x5935eb56, 0x95990982, 0xffd4b46d, 0x95689b51, 0xe210e63c, 0x2af17c81, 0x99b08466, 0x8897e8c9, 0x55edf461, 0xfb99cc04, 0x48d834e3, 0xc074fde3, 0x4cae6d43, 0xee396bd8, +0x62d8dab1, 0x8039ae5e, 0x3f9b6847, 0x40bcc16e, 0x33b2e5a3, 0x59c47985, 0xbb1e2ca3, 0x15a0a7dc, 0xf77af2fa, 0xe6ac0c86, 0xf741d333, 0x26d8f165, 0xcc5d7007, 0x1551350f, 0xae4f19ac, 0xd9fdd7db, 0x911ec2f1, 0x9d0c6edc, 0x44ca98ce, 0x4829a630, +0x2e4d963b, 0x6eca769c, 0xf3fd3989, 0xea858162, 0x6a769c26, 0x1978b8eb, 0x6ef15755, 0xbbefbe70, 0xd5ef7bf6, 0x044d7869, 0x6abc2f3c, 0xeabea0ab, 0x22641bdf, 0x7fed1a33, 0xff1e0777, 0x3fa0498e, 0x085fd444, 0xf3c61840, 0xdd413d61, 0x9d374f15, +0x37352ed0, 0x003b21c9, 0xff2526be, 0x5d8901ec, 0xa62bec21, 0x3bed31e7, 0x516a3f12, 0x9dfdfc0f, 0x2612427f, 0x9553ba98, 0x1d0ee14b, 0x7f27a929, 0x848544e4, 0xe2da5526, 0x62e3fb78, 0xaa39400c, 0xc04fdc2a, 0x2aca5d48, 0x80c83c8d, 0xa6da7ef2, +0x11d6fe7c, 0x80f31d44, 0x481287f9, 0x443b0a1d, 0x2e76b7f2, 0x998ba5af, 0x51a08c08, 0x337856b9, 0x80028f97, 0x5527477b, 0x0895675e, 0xb7c63394, 0x40767274, 0xd525c8ec, 0x621269ab, 0x8c2b0273, 0xcc6651ce, 0x665f11c2, 0x7789efbe, 0x6695a2d8, +0x44f1b907, 0x6a870ef5, 0xd1a2039f, 0xb70c808e, 0x0864f58d, 0x59ff584c, 0xe22bc7f5, 0x1dff7398, 0x994116b5, 0x7fd63bfa, 0xe666bf9c, 0xf30cab5a, 0xb7fd125d, 0x2a00ee52, 0xaa0261c5, 0xc439858a, 0x51511edb, 0x997a377c, 0x73ffb61e, 0xe6972d4f, +0xd93764c1, 0xf3378a93, 0xb737a147, 0xea4f3278, 0xc8dabb74, 0x11276caf, 0xb341f8e7, 0x404d53bd, 0xa6e15f3b, 0x62294862, 0xd168b085, 0x6a4dbdef, 0xc0be4ef9, 0xc4c81759, 0x7b9b4393, 0x91ef5022, 0x263e2113, 0x0d6e5395, 0x3ec9d127, 0xd2f5db78, +0xdd1c890b, 0x31f0dc25, 0x97278fdf, 0x6c0527c7, 0x80f15a5f, 0x3c9e8fb0, 0x474d7df7, 0xfbf2f769, 0xe31d2feb, 0xa6d753fa, 0xcad2743d, 0x00000000, 0x001828b6, 0x80392d98, 0x6e9a0e97, 0xab695f1e, 0x5fa2a575, 0xfbeadfdf, 0x3377ddc3, 0x9570d148, +0xd2258409, 0x633c2ac5, 0xb1d1d90b, 0x1a70f1d2, 0x18f7f034, 0xbca7a228, 0x3e01a6e0, 0x3ed1f991, 0x1549fcd0, 0x171ea247, 0x76a58964, 0x17068af1, 0x8d9f09ca, 0xa4800d6d, 0x61a30395, 0x973fa769, 0xc5230ef8, 0x52d4de56, 0x3c56f877, 0xca1a03fa, +0x24697f84, 0x6e527950, 0x1ab88615, 0x24715732, 0x29cf5bd6, 0x336ff575, 0x504bf706, 0x0da62452, 0x3e198e56, 0x9a99833b, 0x9806aa6b, 0xc8852aaa, 0x7b03ad36, 0xb1c9f1bd, 0x33a782b2, 0xbe388b78, 0x02575e97, 0xbe20a3ce, 0xf69ca4fc, 0x98ceddac, +0x52048127, 0x981e82dd, 0xa93e0189, 0xc774506f, 0x5df5fbe2, 0xeea3230f, 0x262609a5, 0x7954f3a1, 0x8fc8575d, 0xaba128d9, 0x82be2c7e, 0x521ca991, 0x45ca7c11, 0x8021052e, 0x508380c1, 0x1599a3a1, 0xc84d5d6d, 0x487470f5, 0x24a10843, 0xc5f35189, +0x5d3d8c25, 0x2b802df7, 0x48bc0732, 0x6e822621, 0x6ccd5000, 0x4a3b06d4, 0x17d6d580, 0x8f18082c, 0x0dbe0ce4, 0x8d577e0d, 0x7bd3f247, 0x799c8466, 0x4af37113, 0xe18206bb, 0xb119aecc, 0x6e4a51e6, 0xdf9b88ed, 0x766dfea3, 0x5d25a493, 0x8d4f56bb, +0xb101867a, 0xf6848c4a, 0xb34ef05b, 0xbee8d409, 0xdf53ff2a, 0xe3d5582c, 0x3c86a706, 0xa926293f, 0x5fba8dc3, 0x52ccf6e0, 0xa9f6764e, 0x76bda1d2, 0x0f390d02, 0xc85575db, 0xdf83a05b, 0x2b485a30, 0xbc77fd59, 0x00d05f71, 0xab7177a8, 0xf4d3d2dd, +0xddccd67a, 0xd0a285ef, 0x17cefd36, 0x0fe95273, 0xf4038dac, 0xa61f243d, 0x509ba877, 0x486c5843, 0x9568f9fe, 0x45d254a7, 0x1a68d964, 0x45020bd6, 0x95b8a68f, 0xc5eb793f, 0xcaca5c8b, 0xa9ee5ef8, 0xe14a717c, 0x0ff17ac5, 0x33bfaa04, 0x1827af45, +0xf9bd8148, 0x5053dfb0, 0xa450521c, 0xf96dde39, 0xe15259ca, 0x743aa034, 0x80e972e9, 0xec2422e9, 0x9a81ab8d, 0x1551d466, 0x826e730f, 0x451a2360, 0xee6b54c8, 0x8fd07feb, 0xf654d33b, 0x82765bb9, 0xd0baad59, 0xa6cf7b4c, 0x3c4ed0c1, 0xd2edf3ce, +0x26f656d4, 0x794cdb17, 0x97f7d0ae, 0x63ec75b4, 0xbef0fcbf, 0x3138abe2, 0xf975f68f, 0xecf47d98, 0xecec552e, 0x8f00209a, 0x5f72fa04, 0x31e8f493, 0x8d87217c, 0x63f45d02, 0x29d77360, 0xdd04a1bd, 0xddd4fecc, 0xee737c7e, 0x29072c11, 0xfb22a818, +0x028701e6, 0xa4487aaa, 0x7984acd0, 0x47850a30, 0x63240273, 0xc89d021c, 0x4a232e62, 0x7bcbdaf1, 0xf9a5a9fe, 0x74eaff45, 0xca022b4c, 0x74228882, 0x5f6ad2b2, 0x0f2125b4, 0xf4cbfa6b, 0x47555541, 0x15818b17, 0xf41ba51a, 0x6cd578b6, 0x9a51f4fc, +0xd072da9e, 0x18efd882, 0xbc6fd5ef, 0xb386879c, 0x6c1d0f71, 0xfb3a80ae, 0x9a49dc4a, 0xabb9006f, 0xc7bc27a8, 0x4aeb59a5, 0x74f2d7f3, 0xc53b264e, 0xec3c0a5f, 0xa49825db, 0x61735ce4, 0xc7a40f1e, 0x024f7621, 0xf64cfb8d, 0x97eff818, 0x82a604c8, +0x26ee7e62, 0xa6070c8b, 0xe19a2e0d, 0x7b1b8580, 0x183f87f3, 0x1aa0aea3, 0xbcbf8a9e, 0x616b7452, 0x00c877c7, 0xd23dacbf, 0x0d767b23, 0xeebb0bb9, 0x48a42f84, 0xe3cd709a, 0x479d2286, 0x5dedd354, 0x24b920f5, 0xc76c78d9, 0xb356d8ed, 0x7675d615, +0x2b980541, 0x61bb2b23, 0xd06af228, 0xb39eaf2a, 0x2b507286, 0x98d6f51a, 0x31208354, 0xdf4bd79c, 0xe305075d, 0x95a08e39, 0x291f04a7, 0x029f2950, 0x6a166912, 0x00f0e1c4, 0xa3b44102, 0xdef6d7a2, 0x9ceee00e, 0xaedf6b1c, 0x23f2289b, 0xb1ebae86, +0xbfec2951, 0x5eb0be3b, 0x3aa150fe, 0x4c1fb07b, 0xb4105f74, 0x698a251f, 0xe93cad42, 0xf06fd527, 0x9f824dc7, 0xf59424d5, 0xb77cf2bd, 0xd0f15075, 0x2df5af4c, 0xdd9a7a6b, 0x41749a65, 0xf3f3992a, 0x3f5aa10c, 0x17a41e76, 0x532b75e1, 0x86d135a2, +0x14c8b3bf, 0x036cadc9, 0xa6bf5134, 0xfe98b334, 0x19a399a1, 0xbae73967, 0x5bbbae0d, 0xe73b2a95, 0x6ae688d6, 0x70d95d7a, 0x6411eec5, 0xa5231d39, 0x2e990285, 0xc9a22810, 0x5d2cf236, 0xf564c511, 0x1ca88997, 0x2b62f377, 0xd39dfdbc, 0x0ef76613, +0x05fbf1f2, 0x1f34c59a, 0x4713279a, 0x1c586853, 0xd8618b99, 0xc7554e03, 0x991511fc, 0xdbfdc794, 0x19537865, 0x26f938ad, 0x5e405fff, 0xab249aee, 0x11c3a389, 0x611afef3, 0x448f6b97, 0xcf35742b, 0x7d4296a0, 0x80b6885d, 0x6286b2fe, 0x1133424d, +0x0d9bcbda, 0x2b9212b3, 0x1754ffb2, 0xd5fa4043, 0x948eda26, 0xb277e28b, 0x2d054e88, 0x53db9425, 0xdd6a9baf, 0xbc808498, 0x47e3c65e, 0xcace85d9, 0xa64fb0f0, 0xa0280d0f, 0x0bfc7625, 0xb78c1379, 0xb98b94ae, 0x3c360cc5, 0xeaa0e14f, 0x3faa40c8, +0xefabf179, 0x73451177, 0x7bd5ca9b, 0x58d703c4, 0xf09f34e3, 0xbf1cc895, 0xd696ed8a, 0x8621d466, 0x6c71d4ed, 0x5ddc13f2, 0xf30378ee, 0xf6f8891c, 0x39cdfd37, 0x8eb10f8a, 0x61ea1f37, 0x7522ac88, 0x4f83fc76, 0xae2f8ad8, 0xef5b10bd, 0x6c813529, +0xfe6852f0, 0x7b252b5f, 0x4f731db2, 0xe15c976a, 0x76bee085, 0x28febf7a, 0xb4e0beb0, 0x73b5f0b3, 0xf60868d8, 0x78498696, 0x8ddda243, 0x1a3fd5ac, 0x5047d828, 0x947e3be2, 0x677d430c, 0x31adc71f, 0x88d6b275, 0xdb0d2650, 0x0b0c97e1, 0x345636ed, +0xfb93a302, 0xd50aa187, 0x85bd986b, 0x99e5f038, 0xe7cbcb51, 0x6f1d7924, 0x75d24d4c, 0x854d79af, 0x7029bcbe, 0x50b739ec, 0xc952c9d4, 0x00000000, 0x9712962b, 0xba17d8a3, 0x315d26db, 0xc25e5e35, 0x832ac450, 0xe2303aa3, 0xc4c9020e, 0x4a780d84, +0x206e6496, 0x697ac4db, 0xa8483727, 0xe1ac76ae, 0x9219861d, 0xd36d1c78, 0x8bba1fbc, 0x55bc29da, 0x5b4b4fc9, 0x393d1cf3, 0x9c1e01ca, 0x83da2594, 0xf80fef0f, 0x9f72ac03, 0x0890dbec, 0xa5d3fcfd, 0x2302c95f, 0xecc75cb0, 0xc439e3ca, 0xcca93826, +0x280e5ebe, 0x562065d7, 0x7db27764, 0x08603a28, 0x97e277ef, 0xcc59d9e2, 0x447f8a53, 0x373a9b24, 0xabd47b2a, 0x34a6d729, 0x050b1036, 0x06975c3b, 0xb97b756a, 0xe4a76698, 0xfdf41efd, 0x91752bd4, 0xcfc595ef, 0xc2aebff1, 0xad432711, 0xfb6342c6, +0x554cc81e, 0xbc70655c, 0x1acf3468, 0xe2c0db67, 0x4cef51bf, 0xc132f3fc, 0xc7a5afc7, 0x9a895df1, 0x125fef84, 0x256574a0, 0x2e69e341, 0x5827e200, 0x209e8552, 0x4914a04d, 0x039c4c0d, 0xfd04ff39, 0x37ca7ae0, 0x1fc4245e, 0x78b96752, 0x32318b12, +0xb287034f, 0x56d08413, 0x6fed98e0, 0x882653b1, 0xf8ff0ecb, 0x9185ca10, 0xd6660c4e, 0x49e44189, 0xb11b4f42, 0x0667bdff, 0x8b4afe78, 0x64e10f01, 0x678da2c8, 0x7e2e3b69, 0x12af0e40, 0xe9cc4c86, 0xea50008b, 0x3a51b13a, 0x92e967d9, 0x2609d969, +0x80466999, 0x41847ba1, 0x6276533a, 0x764e0141, 0x1438527b, 0x8e41ee4e, 0x9a79bc35, 0x0e0787d7, 0x421837ac, 0x8d2d4387, 0xadb3c6d5, 0x3cc6ed01, 0xa0d8eccb, 0xd8916a5d, 0xca3e641d, 0xa8b8d6e3, 0xa344a0c6, 0xec37bd74, 0xd001b1b1, 0xe457875c, +0x25959564, 0x4a88ec40, 0x32c16ad6, 0x7ededaad, 0x0d6b2a1e, 0xde063666, 0xc1c21238, 0x42e8d668, 0x73865cc8, 0xe65fba42, 0xb72bc3d3, 0x5e58caa1, 0x12722ae8, 0x1b312a3c, 0x0ed7731c, 0xd5930f65, 0xc5565f37, 0xe03009a6, 0x6bfbcc62, 0xa559e93b, +0x33ccb527, 0x262aec07, 0x04d8c95e, 0x76a555ba, 0x56e00a59, 0x64d77f52, 0x404ae9ef, 0x8373053c, 0xe287731c, 0x9af555ba, 0x787226a6, 0x8da47620, 0x1751239a, 0xa07ae049, 0x7ac55c1c, 0x98422f00, 0x28fd9f1b, 0x43065379, 0x35a306c3, 0xe4e8c0f8, +0x449220b1, 0xdd2bcf9d, 0x22f22559, 0xde67750b, 0xef1cba96, 0xc8cd96bd, 0xac1ae9ef, 0xbab00a59, 0x0a0fba42, 0xcb812c2b, 0xa3365adf, 0xe51300d4, 0x19865086, 0xbcdfb9bd, 0x01fbc02c, 0x5238c307, 0x3838cf49, 0x51747991, 0x1d5e99d8, 0x066fb3e4, +0x249d96bd, 0xedabc02c, 0xf69aea10, 0x3458c6ef, 0x2a4ae5a1, 0x1acaea10, 0xa1812065, 0x39c30f65, 0xd3fcbc81, 0xbf93032b, 0x7fe6556e, 0x70cae65e, 0x4a4553ad, 0x9c9ae65e, 0x679bc5c4, 0x652cbf7e, 0x3a8fb5f3, 0x4909e93b, 0x48f22917, 0xfc955052, +0xaa755a0b, 0xade129c3, 0x3ce00617, 0xc339ecd3, 0x88877f52, 0xc61ae5a1, 0x36efbc55, 0xc0755645, 0x034cba96, 0xcc155fe3, 0x9e2d9ce4, 0x30800fb1, 0x694cb6d8, 0xb4677945, 0x2bb1258d, 0x4569e09d, 0xd2077cad, 0xe888c95e, 0x897cbf7e, 0xc4ad9f1b, +0x02b77aba, 0x4e9d9af3, 0x4dd12065, 0x05230972, 0xc7e1258d, 0xbd247991, 0xb0bfb01b, 0xe1cbc98a, 0x3d1bc63b, 0x95d9e68a, 0xa4a22917, 0x42fd9355, 0x2c255645, 0xc18e9669, 0x7e1d9542, 0x9b0e9596, 0xe9730972, 0x6d947f86, 0x81c47f86, 0x1389eac4, +0x0bf47a6e, 0x545770e3, 0xf84d990c, 0x41b129c3, 0x508fb9bd, 0x74122f00, 0xfafae3b6, 0x00000000, 0x53c3032b, 0x094300d4, 0x6ed8c510, 0x21be9fcf, 0xf42d90aa, 0x5d147037, 0x29065f37, 0x8ee8ccb6, 0x5a8003ff, 0xd0b00617, 0xbb4bca75, 0xcea22559, +0x7caaeff8, 0xf5d65086, 0x4c2ae049, 0xf0f559f4, 0x8f130c9a, 0x15e65920, 0x6c6fbfaa, 0x6f23053c, 0x90faeff8, 0x61f47620, 0xd14bc63b, 0xa61553ad, 0xca7aec07, 0xebc473c8, 0x25665691, 0x93b6556e, 0x2dde9669, 0xb6d003ff, 0x1e12234e, 0xffd9eac4, +0xb59cb969, 0x924d9542, 0x8c5fb60c, 0x666005e8, 0xf7612a3c, 0x079473c8, 0xb9fcb0cf, 0x87abcc62, 0x4f665adf, 0x62b8ccb6, 0xab8e9a27, 0xdf9cb527, 0x16aae3b6, 0xaead9355, 0xe37cb330, 0x317bcf9d, 0xa2cd9af3, 0x8bcbc5c4, 0x20455fe3, 0x7d512fd4, +0xf3b9e362, 0x3b7475df, 0xb3f30a8d, 0x2f69ecd3, 0x187d90aa, 0x942226a6, 0x68b776f4, 0x0c6009a6, 0xfd6e907e, 0x113e907e, 0x5fa30a8d, 0x8a3005e8, 0x7b3e9c30, 0x9fd65cc8, 0x1ca559f4, 0x55acb0cf, 0x2309e575, 0x1fe9e362, 0x727d9ce4, 0xd468cf49, +0xdcd00fb1, 0x84e776f4, 0x96955c1c, 0x3237750b, 0x91012fd4, 0xec500000, 0xf10e99d8, 0x803fbfaa, 0x2e922cff, 0x775e9596, 0x86500c4e, 0xd808c6ef, 0x3e577cad, 0x59ccb969, 0x600fb60c, 0xa7ee9381, 0xaf565379, 0x976e9c30, 0x9d612672, 0x851cb6d8, +0xa939e09d, 0xf242234e, 0x0f2cb330, 0x71312672, 0x37147c79, 0x58377945, 0xb208caa1, 0x0d9bc98a, 0x99b9ef2c, 0x5cefb01b, 0xcf59e575, 0x5b7bc3d3, 0xea3fb3e4, 0xfe222ae8, 0xfb01239a, 0xc2c22cff, 0x75e9ef2c, 0x141d990c, 0x8288c510, 0xd72475df, +0x571bca75, 0x10c55052, 0xa8c220b1, 0xb1447037, 0x46255a0b, 0x7989e68a, 0x27d12c2b, 0x63430c9a, 0xd9f306c3, 0xc9365691, 0xd6dfb5f3, 0x47de9a27, 0x6a000c4e, 0xf9b65920, 0x4bbe9381, 0xdb447c79, 0xb80770e3, 0xbe68c307, 0xdabfbc55, 0xe7a47a6e, +0x3facbc81, 0x08b8c0f8, 0xcdee9fcf, 0xeee77aba, 0x0bc32aab, 0xb2a3498c, 0x50194cce, 0x0afd108b, 0x59700661, 0x55e8a872, 0xb005e3e3, 0x2598b5f9, 0x5bda6665, 0x92ca18c9, 0xb66c9710, 0xe4dfbbda, 0xca88eee3, 0x273e1f96, 0x25947f92, 0xc14bc448, +0x7dd689b8, 0xb9606327, 0x9e5e7cb1, 0x95919c71, 0xb39d73ac, 0x54da5839, 0xe675dbde, 0x2832eba1, 0xbdafbdbb, 0x0bcfe0c0, 0x24a68fd9, 0x02a6aa6f, 0xe74be1fe, 0x92c6d2a2, 0xb391b9c7, 0x959d561a, 0x5db31296, 0x5ae8962e, 0x2e5b9f52, 0x04c314f7, +0x906cb2a6, 0x2f696f19, 0x72d6b7e4, 0x7615a313, 0x20695145, 0xc588d0bf, 0x0af1dae0, 0xcddfa030, 0xef1c9171, 0x79195724, 0xe84bdfa2, 0x93f8e882, 0x98370842, 0xb96ca94c, 0xc075fe68, 0x7f7ce9bc, 0x2baa7bee, 0x7bb33720, 0x567cf256, 0xc5841ad4, +0x52bfe6a1, 0xe5ed4b91, 0xc72e7ad0, 0x74bfc317, 0xc82e448c, 0xe0106546, 0x7ce479f3, 0x04cfde9c, 0x915e42ed, 0x7a81c76b, 0x2ba6b185, 0x9cf8d6de, 0xe2b6cf29, 0xcced507b, 0x7a8d0d00, 0x5381dc81, 0x22c33141, 0xe388f509, 0x215ba10e, 0x2a988ba5, +0xb85e5907, 0x260cefdd, 0xcf75c034, 0x7581f937, 0x9f6c8cfa, 0x07574ed3, 0xbbc6c948, 0x70701d8b, 0xcf790a5f, 0xbf0917d4, 0x5bd6ac0e, 0x03945a24, 0x0da69433, 0xbbca0323, 0x73e88dc4, 0x09694aaf, 0x512776ee, 0x23f1c10a, 0xee22ab51, 0xce4bfa14, +0x772b9933, 0xcbba1ea8, 0xebd34fed, 0x9737361e, 0x714e27ab, 0x2e575539, 0x0f0cf437, 0xb4ca3d7f, 0x96090c3e, 0x54d69252, 0xe4d371b1, 0x501586a5, 0x29001bea, 0x5ae45c45, 0x74b3097c, 0x584e3c41, 0x9cf41cb5, 0x290cd181, 0xe84715c9, 0xe2ba0542, +0x2f65a572, 0xe3843f62, 0xe7472b95, 0xb6605d7b, 0x2732d5fd, 0xc4ba20f4, 0xb752ad30, 0xee2e613a, 0x707cd7e0, 0x075b84b8, 0x22cffb2a, 0x5c8d28b6, 0x0665be98, 0x9905f809, 0x21576b65, 0x77275358, 0x52b32cca, 0xbda377d0, 0xe975e582, 0xc2df9e6c, +0xc2d35407, 0xc0793403, 0xc61c8a9b, 0xb852936c, 0x597ccc0a, 0x5e2b82d9, 0x000cca6b, 0x096580c4, 0xc3ed6e27, 0x94a36c3a, 0x5e2748b2, 0x9f604691, 0x2dcfc576, 0xbaf8f368, 0x9e52b6da, 0x23fd0b61, 0xe01caf2d, 0xe67911b5, 0xef105b1a, 0x7e4e19f7, +0xb75e675b, 0x5742c876, 0xbc91879b, 0x9dc6ecfe, 0x0c98ae13, 0x9dca2695, 0x283e21ca, 0xc722b0bb, 0x085bbae4, 0x983bc229, 0xc9107eac, 0x9a9d6846, 0xc3e1a44c, 0x0daa5e58, 0xec84013e, 0xc91cb4c7, 0xc4b6ea9f, 0xcbb6d4c3, 0xca842488, 0xb13bd9c3, +0xe12e5f66, 0x00000000, 0xe122950d, 0x5f197292, 0x0e3e047c, 0x0398904f, 0xeaed75cd, 0x76196978, 0x2cfd353d, 0xbe372df4, 0xedba3b1e, 0x73e447af, 0x574e021d, 0x5842f62a, 0x7f7023d7, 0x05fd2ed7, 0x0c946478, 0xb5f8cd34, 0x7ce8b398, 0x79159d4f, +0x0132f04b, 0xedb6f175, 0x5670383d, 0x91528886, 0x973bfc75, 0xb0092988, 0x24aa45b2, 0x512bbc85, 0xb13713a8, 0x7dda43d3, 0x260025b6, 0xe9792fe9, 0xbc9d4df0, 0x20659b2e, 0x066974f3, 0xbaf43903, 0x72da7d8f, 0x2cf1ff56, 0x99093262, 0xcce19a10, +0x5c81e2dd, 0x7e42d39c, 0x5dbfd8fd, 0xec88cb55, 0x538d16ea, 0x55e46219, 0x9a91a22d, 0x9ba35266, 0x78276d04, 0x93f422e9, 0x94afa651, 0xb4c6f714, 0xc61040f0, 0x5f15b8f9, 0xe5e181fa, 0xc1470e23, 0x7142edc0, 0x0e32ce17, 0x9605c655, 0xebdf8586, +0x05f1e4bc, 0x0f003e5c, 0x9baf980d, 0x2a9441ce, 0x02aa6004, 0x2dc30f1d, 0xbe3be79f, 0x7bbffd4b, 0x013e3a20, 0x782ba76f, 0xce47307f, 0x906078cd, 0xb5f4075f, 0xc8228ee7, 0xcdd36a5b, 0x758d335c, 0xeae1bfa6, 0xbf05ddbf, 0xb2af83e7, 0x0857708f, +0x3b61e18b, 0xcad88d8f, 0xbfd09c7a, 0x0fb655e2, 0x02c0e311, 0x4c32a9c6, 0x4becc9bc, 0x708d2837, 0xce3267ce, 0x058539c2, 0xf6fcb6d7, 0x4f0623fd, 0xb35243a3, 0xcb2ce4a5, 0x469a7f4f, 0xbce41641, 0x0d76b6f3, 0x7753484d, 0xcbb75e0c, 0x4270950e, +0x7dfb9ec4, 0xf7936554, 0x724dcb26, 0x47f5accc, 0x88a81881, 0xbba1cc92, 0xb80efc00, 0x854514db, 0x45aef574, 0x4ca9136f, 0x047150e8, 0xf43c55c6, 0x7bd19794, 0xb723134b, 0x8a68fb90, 0x31528dab, 0x85deae72, 0x393ab833, 0x842ac758, 0xca433726, +0xf708dffd, 0x4601c5e6, 0x4384fc24, 0xfb8a0024, 0xcfc60ee4, 0xb9612f83, 0x83f4a722, 0x0745dad3, 0x025b59b8, 0xb5e3f05a, 0xcd9d575c, 0xb89546a9, 0x78e51daf, 0xb23d9020, 0x099c5cb2, 0xc49ab147, 0x7f3b7dd5, 0x3bfa5b22, 0xc22b02be, 0xfda00974, +0x72d6718f, 0x86719ee0, 0x8fedc252, 0xb64cc0c8, 0xc344d13d, 0xcc693e76, 0x0bc7050a, 0x7467c276, 0x7593ab5c, 0xfae5d3a7, 0xfe0f39e6, 0xc73581d5, 0xc11f8885, 0xf94ae335, 0x0f2def4b, 0x8af34139, 0xff60ea65, 0xfb11ba8d, 0x7c944d47, 0x051e836b, +0xccf284df, 0x431f468d, 0x38ced119, 0x3309d413, 0x06b1b3f9, 0xf9d1599c, 0x3dd05272, 0x8d2d2143, 0x07de607a, 0xb9fa952a, 0x40b0761f, 0x7016929e, 0x3d4be8db, 0x3a9588a1, 0xc7ae3b7c, 0x0e423cc8, 0x895c71ab, 0xc2b0b817, 0x37e33e52, 0x8c42f2c0, +0xbc7face8, 0x3f10b163, 0x08683598, 0x4b777315, 0xba55a5b8, 0x41441f35, 0xc4010bee, 0x8200ce08, 0x81344433, 0xb7b8a9e2, 0x86ea2449, 0xcf5db44d, 0xbd107f6b, 0x35b867ea, 0xb3c9f90a, 0x303d5e28, 0x476e1665, 0xfa7e690e, 0xf6670c7e, 0x81affe9a, +0xb192a0b2, 0xf0d6bf87, 0x805b97b0, 0x787ea706, 0x836f1d8b, 0x8b072813, 0xf5538645, 0x34d7b469, 0x0907e61b, 0x402bccb6, 0x445a9c5e, 0x492c2aad, 0x4e69f07e, 0x73b9a20c, 0xc883d437, 0xc65a5256, 0x36175778, 0x0c196570, 0x76a72167, 0xf3e235bc, +0x8e8211d1, 0x4d5d7a45, 0x01f4692a, 0x41dfa59c, 0xc977bd1d, 0x8b9c92ba, 0xbb3a763b, 0x8cd94869, 0x7e54ae56, 0x03348a3b, 0xc9ec07b4, 0xc3df6b94, 0x80c02d19, 0xc56ed86d, 0xc5f562c4, 0x3e7f62e0, 0x48d84387, 0x38556bb0, 0x4843f92e, 0x3a0e3208, +0x344c0ec0, 0x8833a228, 0x0b5cbfa3, 0xfd3bb3dd, 0xbd8bc5c2, 0x8f7678fb, 0x368cedd1, 0xfffb50cc, 0x798ace2c, 0x8db69bea, 0xf3798f15, 0x871e4d63, 0x31c93702, 0x04eaea41, 0x77c8f2e4, 0x763c9bce, 0x44c126f7, 0x3cbf81f1, 0xbf4b26d3, 0x0aa8d689, +0x016fd383, 0xf82530b6, 0xf122d6ad, 0xbebf4ff9, 0x89c7cb02, 0xc184322c, 0x4dc6c0ec, 0xf8be8a1f, 0xb48c23d9, 0xb2a62a89, 0x8e19ab78, 0x7ecf14ff, 0x33926eba, 0x32fdbd39, 0x009bbaa9, 0xfc54605e, 0x7abe4417, 0xf04d052e, 0x3523dd43, 0x377884fb, +0x4a831a3f, 0x08f38f31, 0xc6c1e8ff, 0xbace1f11, 0xf28de63f, 0x750811f5, 0xc0ebe1af, 0x7a25febe, 0x84b17df1, 0x8785f7ca, 0x4f9d9954, 0x7c0ff7ee, 0x3f8b0bca, 0x74fc78df, 0xb6d77a61, 0xbe24f550, 0xc8186e9e, 0x829b74a1, 0xfe94834f, 0x03af3092, +0xf2165c96, 0x3c243b58, 0x0ed98661, 0xb1091a1b, 0xcd06edf5, 0x45354fdd, 0x00000000, 0x79117485, 0x7b4a2d3d, 0x4a18a096, 0x3ee4d849, 0x71e2fbb4, 0x39a1029a, 0xf5c83cec, 0xb4179970, 0xf4a7ef6f, 0x42eb2fa7, 0xb5784af3, 0x4ef24ad7, 0xfccfdaf7, +0x7d60246d, 0x49b79004, 0xcea9dd67, 0xb0fd7331, 0x7179411d, 0x30a6e481, 0xb066c998, 0x0ded0c5a, 0x0c82dfd9, 0x0a336c20, 0x732218a5, 0xc0705b06, 0x062a0950, 0x32660790, 0xf1b96c04, 0x7fa0c77c, ] + +d0x6a0b47f8=[ 0x00000000, 0x2a7e1f89, 0xa44a1399, 0x8e340c10, 0xb9ea03f5, 0x93941c7c, 0x1da0106c, 0x37de0fe5, 0x68c0d682, 0x42bec90b, 0xcc8ac51b, 0xe6f4da92, 0xd12ad577, 0xfb54cafe, 0x7560c6ee, 0x5f1ed967, 0x81ce3ffd, 0xabb02074, 0x25842c64, 0x0ffa33ed, +0x38243c08, 0x125a2381, 0x9c6e2f91, 0xb6103018, 0xe90ee97f, 0xc370f6f6, 0x4d44fae6, 0x673ae56f, 0x50e4ea8a, 0x7a9af503, 0xf4aef913, 0xded0e69a, 0xf550b92f, 0xdf2ea6a6, 0x511aaab6, 0x7b64b53f, 0x4cbabada, 0x66c4a553, 0xe8f0a943, 0xc28eb6ca, +0x9d906fad, 0xb7ee7024, 0x39da7c34, 0x13a463bd, 0x247a6c58, 0x0e0473d1, 0x80307fc1, 0xaa4e6048, 0x749e86d2, 0x5ee0995b, 0xd0d4954b, 0xfaaa8ac2, 0xcd748527, 0xe70a9aae, 0x693e96be, 0x43408937, 0x1c5e5050, 0x36204fd9, 0xb81443c9, 0x926a5c40, +0xa5b453a5, 0x8fca4c2c, 0x01fe403c, 0x2b805fb5, 0x3630cac1, 0x1c4ed548, 0x927ad958, 0xb804c6d1, 0x8fdac934, 0xa5a4d6bd, 0x2b90daad, 0x01eec524, 0x5ef01c43, 0x748e03ca, 0xfaba0fda, 0xd0c41053, 0xe71a1fb6, 0xcd64003f, 0x43500c2f, 0x692e13a6, +0xb7fef53c, 0x9d80eab5, 0x13b4e6a5, 0x39caf92c, 0x0e14f6c9, 0x246ae940, 0xaa5ee550, 0x8020fad9, 0xdf3e23be, 0xf5403c37, 0x7b743027, 0x510a2fae, 0x66d4204b, 0x4caa3fc2, 0xc29e33d2, 0xe8e02c5b, 0xc36073ee, 0xe91e6c67, 0x672a6077, 0x4d547ffe, +0x7a8a701b, 0x50f46f92, 0xdec06382, 0xf4be7c0b, 0xaba0a56c, 0x81debae5, 0x0feab6f5, 0x2594a97c, 0x124aa699, 0x3834b910, 0xb600b500, 0x9c7eaa89, 0x42ae4c13, 0x68d0539a, 0xe6e45f8a, 0xcc9a4003, 0xfb444fe6, 0xd13a506f, 0x5f0e5c7f, 0x757043f6, +0x2a6e9a91, 0x00108518, 0x8e248908, 0xa45a9681, 0x93849964, 0xb9fa86ed, 0x37ce8afd, 0x1db09574, 0x731dcc34, 0x5963d3bd, 0xd757dfad, 0xfd29c024, 0xcaf7cfc1, 0xe089d048, 0x6ebddc58, 0x44c3c3d1, 0x1bdd1ab6, 0x31a3053f, 0xbf97092f, 0x95e916a6, +0xa2371943, 0x884906ca, 0x067d0ada, 0x2c031553, 0xf2d3f3c9, 0xd8adec40, 0x5699e050, 0x7ce7ffd9, 0x4b39f03c, 0x6147efb5, 0xef73e3a5, 0xc50dfc2c, 0x9a13254b, 0xb06d3ac2, 0x3e5936d2, 0x1427295b, 0x23f926be, 0x09873937, 0x87b33527, 0xadcd2aae, +0x864d751b, 0xac336a92, 0x22076682, 0x0879790b, 0x3fa776ee, 0x15d96967, 0x9bed6577, 0xb1937afe, 0xee8da399, 0xc4f3bc10, 0x4ac7b000, 0x60b9af89, 0x5767a06c, 0x7d19bfe5, 0xf32db3f5, 0xd953ac7c, 0x07834ae6, 0x2dfd556f, 0xa3c9597f, 0x89b746f6, +0xbe694913, 0x9417569a, 0x1a235a8a, 0x305d4503, 0x6f439c64, 0x453d83ed, 0xcb098ffd, 0xe1779074, 0xd6a99f91, 0xfcd78018, 0x72e38c08, 0x589d9381, 0x452d06f5, 0x6f53197c, 0xe167156c, 0xcb190ae5, 0xfcc70500, 0xd6b91a89, 0x588d1699, 0x72f30910, +0x2dedd077, 0x0793cffe, 0x89a7c3ee, 0xa3d9dc67, 0x9407d382, 0xbe79cc0b, 0x304dc01b, 0x1a33df92, 0xc4e33908, 0xee9d2681, 0x60a92a91, 0x4ad73518, 0x7d093afd, 0x57772574, 0xd9432964, 0xf33d36ed, 0xac23ef8a, 0x865df003, 0x0869fc13, 0x2217e39a, +0x15c9ec7f, 0x3fb7f3f6, 0xb183ffe6, 0x9bfde06f, 0xb07dbfda, 0x9a03a053, 0x1437ac43, 0x3e49b3ca, 0x0997bc2f, 0x23e9a3a6, 0xadddafb6, 0x87a3b03f, 0xd8bd6958, 0xf2c376d1, 0x7cf77ac1, 0x56896548, 0x61576aad, 0x4b297524, 0xc51d7934, 0xef6366bd, +0x31b38027, 0x1bcd9fae, 0x95f993be, 0xbf878c37, 0x885983d2, 0xa2279c5b, 0x2c13904b, 0x066d8fc2, 0x597356a5, 0x730d492c, 0xfd39453c, 0xd7475ab5, 0xe0995550, 0xcae74ad9, 0x44d346c9, 0x6ead5940, 0x00000000, 0x8427bf2c, 0x9fe47d60, 0x1bc3c24c, +0x494571fb, 0xcd62ced7, 0xd6a10c9b, 0x5286b3b7, 0x6e0a8712, 0xea2d383e, 0xf1eefa72, 0x75c9455e, 0x274ff6e9, 0xa36849c5, 0xb8ab8b89, 0x3c8c34a5, 0x79abe9de, 0xfd8c56f2, 0xe64f94be, 0x62682b92, 0x30ee9825, 0xb4c92709, 0xaf0ae545, 0x2b2d5a69, +0x17a16ecc, 0x9386d1e0, 0x884513ac, 0x0c62ac80, 0x5ee41f37, 0xdac3a01b, 0xc1006257, 0x4527dd7b, 0x5490fa3b, 0xd0b74517, 0xcb74875b, 0x4f533877, 0x1dd58bc0, 0x99f234ec, 0x8231f6a0, 0x0616498c, 0x3a9a7d29, 0xbebdc205, 0xa57e0049, 0x2159bf65, +0x73df0cd2, 0xf7f8b3fe, 0xec3b71b2, 0x681cce9e, 0x2d3b13e5, 0xa91cacc9, 0xb2df6e85, 0x36f8d1a9, 0x647e621e, 0xe059dd32, 0xfb9a1f7e, 0x7fbda052, 0x433194f7, 0xc7162bdb, 0xdcd5e997, 0x58f256bb, 0x0a74e50c, 0x8e535a20, 0x9590986c, 0x11b72740, +0x7ac89c1e, 0xfeef2332, 0xe52ce17e, 0x610b5e52, 0x338dede5, 0xb7aa52c9, 0xac699085, 0x284e2fa9, 0x14c21b0c, 0x90e5a420, 0x8b26666c, 0x0f01d940, 0x5d876af7, 0xd9a0d5db, 0xc2631797, 0x4644a8bb, 0x036375c0, 0x8744caec, 0x9c8708a0, 0x18a0b78c, +0x4a26043b, 0xce01bb17, 0xd5c2795b, 0x51e5c677, 0x6d69f2d2, 0xe94e4dfe, 0xf28d8fb2, 0x76aa309e, 0x242c8329, 0xa00b3c05, 0xbbc8fe49, 0x3fef4165, 0x2e586625, 0xaa7fd909, 0xb1bc1b45, 0x359ba469, 0x671d17de, 0xe33aa8f2, 0xf8f96abe, 0x7cded592, +0x4052e137, 0xc4755e1b, 0xdfb69c57, 0x5b91237b, 0x091790cc, 0x8d302fe0, 0x96f3edac, 0x12d45280, 0x57f38ffb, 0xd3d430d7, 0xc817f29b, 0x4c304db7, 0x1eb6fe00, 0x9a91412c, 0x81528360, 0x05753c4c, 0x39f908e9, 0xbddeb7c5, 0xa61d7589, 0x223acaa5, +0x70bc7912, 0xf49bc63e, 0xef580472, 0x6b7fbb5e, 0x59bed65e, 0xdd996972, 0xc65aab3e, 0x427d1412, 0x10fba7a5, 0x94dc1889, 0x8f1fdac5, 0x0b3865e9, 0x37b4514c, 0xb393ee60, 0xa8502c2c, 0x2c779300, 0x7ef120b7, 0xfad69f9b, 0xe1155dd7, 0x6532e2fb, +0x20153f80, 0xa43280ac, 0xbff142e0, 0x3bd6fdcc, 0x69504e7b, 0xed77f157, 0xf6b4331b, 0x72938c37, 0x4e1fb892, 0xca3807be, 0xd1fbc5f2, 0x55dc7ade, 0x075ac969, 0x837d7645, 0x98beb409, 0x1c990b25, 0x0d2e2c65, 0x89099349, 0x92ca5105, 0x16edee29, +0x446b5d9e, 0xc04ce2b2, 0xdb8f20fe, 0x5fa89fd2, 0x6324ab77, 0xe703145b, 0xfcc0d617, 0x78e7693b, 0x2a61da8c, 0xae4665a0, 0xb585a7ec, 0x31a218c0, 0x7485c5bb, 0xf0a27a97, 0xeb61b8db, 0x6f4607f7, 0x3dc0b440, 0xb9e70b6c, 0xa224c920, 0x2603760c, +0x1a8f42a9, 0x9ea8fd85, 0x856b3fc9, 0x014c80e5, 0x53ca3352, 0xd7ed8c7e, 0xcc2e4e32, 0x4809f11e, 0x23764a40, 0xa751f56c, 0xbc923720, 0x38b5880c, 0x6a333bbb, 0xee148497, 0xf5d746db, 0x71f0f9f7, 0x4d7ccd52, 0xc95b727e, 0xd298b032, 0x56bf0f1e, +0x0439bca9, 0x801e0385, 0x9bddc1c9, 0x1ffa7ee5, 0x5adda39e, 0xdefa1cb2, 0xc539defe, 0x411e61d2, 0x1398d265, 0x97bf6d49, 0x8c7caf05, 0x085b1029, 0x34d7248c, 0xb0f09ba0, 0xab3359ec, 0x2f14e6c0, 0x7d925577, 0xf9b5ea5b, 0xe2762817, 0x6651973b, +0x77e6b07b, 0xf3c10f57, 0xe802cd1b, 0x6c257237, 0x3ea3c180, 0xba847eac, 0xa147bce0, 0x256003cc, 0x19ec3769, 0x9dcb8845, 0x86084a09, 0x022ff525, 0x50a94692, 0xd48ef9be, 0xcf4d3bf2, 0x4b6a84de, 0x0e4d59a5, 0x8a6ae689, 0x91a924c5, 0x158e9be9, +0x4708285e, 0xc32f9772, 0xd8ec553e, 0x5ccbea12, 0x6047deb7, 0xe460619b, 0xffa3a3d7, 0x7b841cfb, 0x2902af4c, 0xad251060, 0xb6e6d22c, 0x32c16d00, 0x00000000, 0xeca6289a, 0x02a20b30, 0xee0423aa, 0xca55e488, 0x26f3cc12, 0xc8f7efb8, 0x2451c722, +0x2cbd3ea1, 0xc01b163b, 0x2e1f3591, 0xc2b91d0b, 0xe6e8da29, 0x0a4ef2b3, 0xe44ad119, 0x08ecf983, 0xf53d564c, 0x199b7ed6, 0xf79f5d7c, 0x1b3975e6, 0x3f68b2c4, 0xd3ce9a5e, 0x3dcab9f4, 0xd16c916e, 0xd98068ed, 0x35264077, 0xdb2263dd, 0x37844b47, +0x13d58c65, 0xff73a4ff, 0x11778755, 0xfdd1afcf, 0x8c99632f, 0x603f4bb5, 0x8e3b681f, 0x629d4085, 0x46cc87a7, 0xaa6aaf3d, 0x446e8c97, 0xa8c8a40d, 0xa0245d8e, 0x4c827514, 0xa28656be, 0x4e207e24, 0x6a71b906, 0x86d7919c, 0x68d3b236, 0x84759aac, +0x79a43563, 0x95021df9, 0x7b063e53, 0x97a016c9, 0xb3f1d1eb, 0x5f57f971, 0xb153dadb, 0x5df5f241, 0x55190bc2, 0xb9bf2358, 0x57bb00f2, 0xbb1d2868, 0x9f4cef4a, 0x73eac7d0, 0x9deee47a, 0x7148cce0, 0xd2da2aaa, 0x3e7c0230, 0xd078219a, 0x3cde0900, +0x188fce22, 0xf429e6b8, 0x1a2dc512, 0xf68bed88, 0xfe67140b, 0x12c13c91, 0xfcc51f3b, 0x106337a1, 0x3432f083, 0xd894d819, 0x3690fbb3, 0xda36d329, 0x27e77ce6, 0xcb41547c, 0x254577d6, 0xc9e35f4c, 0xedb2986e, 0x0114b0f4, 0xef10935e, 0x03b6bbc4, +0x0b5a4247, 0xe7fc6add, 0x09f84977, 0xe55e61ed, 0xc10fa6cf, 0x2da98e55, 0xc3adadff, 0x2f0b8565, 0x5e434985, 0xb2e5611f, 0x5ce142b5, 0xb0476a2f, 0x9416ad0d, 0x78b08597, 0x96b4a63d, 0x7a128ea7, 0x72fe7724, 0x9e585fbe, 0x705c7c14, 0x9cfa548e, +0xb8ab93ac, 0x540dbb36, 0xba09989c, 0x56afb006, 0xab7e1fc9, 0x47d83753, 0xa9dc14f9, 0x457a3c63, 0x612bfb41, 0x8d8dd3db, 0x6389f071, 0x8f2fd8eb, 0x87c32168, 0x6b6509f2, 0x85612a58, 0x69c702c2, 0x4d96c5e0, 0xa130ed7a, 0x4f34ced0, 0xa392e64a, +0x4edb1ec7, 0xa27d365d, 0x4c7915f7, 0xa0df3d6d, 0x848efa4f, 0x6828d2d5, 0x862cf17f, 0x6a8ad9e5, 0x62662066, 0x8ec008fc, 0x60c42b56, 0x8c6203cc, 0xa833c4ee, 0x4495ec74, 0xaa91cfde, 0x4637e744, 0xbbe6488b, 0x57406011, 0xb94443bb, 0x55e26b21, +0x71b3ac03, 0x9d158499, 0x7311a733, 0x9fb78fa9, 0x975b762a, 0x7bfd5eb0, 0x95f97d1a, 0x795f5580, 0x5d0e92a2, 0xb1a8ba38, 0x5fac9992, 0xb30ab108, 0xc2427de8, 0x2ee45572, 0xc0e076d8, 0x2c465e42, 0x08179960, 0xe4b1b1fa, 0x0ab59250, 0xe613baca, +0xeeff4349, 0x02596bd3, 0xec5d4879, 0x00fb60e3, 0x24aaa7c1, 0xc80c8f5b, 0x2608acf1, 0xcaae846b, 0x377f2ba4, 0xdbd9033e, 0x35dd2094, 0xd97b080e, 0xfd2acf2c, 0x118ce7b6, 0xff88c41c, 0x132eec86, 0x1bc21505, 0xf7643d9f, 0x19601e35, 0xf5c636af, +0xd197f18d, 0x3d31d917, 0xd335fabd, 0x3f93d227, 0x9c01346d, 0x70a71cf7, 0x9ea33f5d, 0x720517c7, 0x5654d0e5, 0xbaf2f87f, 0x54f6dbd5, 0xb850f34f, 0xb0bc0acc, 0x5c1a2256, 0xb21e01fc, 0x5eb82966, 0x7ae9ee44, 0x964fc6de, 0x784be574, 0x94edcdee, +0x693c6221, 0x859a4abb, 0x6b9e6911, 0x8738418b, 0xa36986a9, 0x4fcfae33, 0xa1cb8d99, 0x4d6da503, 0x45815c80, 0xa927741a, 0x472357b0, 0xab857f2a, 0x8fd4b808, 0x63729092, 0x8d76b338, 0x61d09ba2, 0x10985742, 0xfc3e7fd8, 0x123a5c72, 0xfe9c74e8, +0xdacdb3ca, 0x366b9b50, 0xd86fb8fa, 0x34c99060, 0x3c2569e3, 0xd0834179, 0x3e8762d3, 0xd2214a49, 0xf6708d6b, 0x1ad6a5f1, 0xf4d2865b, 0x1874aec1, 0xe5a5010e, 0x09032994, 0xe7070a3e, 0x0ba122a4, 0x2ff0e586, 0xc356cd1c, 0x2d52eeb6, 0xc1f4c62c, +0xc9183faf, 0x25be1735, 0xcbba349f, 0x271c1c05, 0x034ddb27, 0xefebf3bd, 0x01efd017, 0xed49f88d, 0x00000000, 0xf96ad5bc, 0x6a84ddf7, 0x93ee084b, 0x63b81ce0, 0x9ad2c95c, 0x093cc117, 0xf05614ab, 0xb379a10c, 0x4a1374b0, 0xd9fd7cfb, 0x2097a947, +0xd0c1bdec, 0x29ab6850, 0xba45601b, 0x432fb5a7, 0x05e1fc7f, 0xfc8b29c3, 0x6f652188, 0x960ff434, 0x6659e09f, 0x9f333523, 0x0cdd3d68, 0xf5b7e8d4, 0xb6985d73, 0x4ff288cf, 0xdc1c8084, 0x25765538, 0xd5204193, 0x2c4a942f, 0xbfa49c64, 0x46ce49d8, +0x936dff7c, 0x6a072ac0, 0xf9e9228b, 0x0083f737, 0xf0d5e39c, 0x09bf3620, 0x9a513e6b, 0x633bebd7, 0x20145e70, 0xd97e8bcc, 0x4a908387, 0xb3fa563b, 0x43ac4290, 0xbac6972c, 0x29289f67, 0xd0424adb, 0x968c0303, 0x6fe6d6bf, 0xfc08def4, 0x05620b48, +0xf5341fe3, 0x0c5eca5f, 0x9fb0c214, 0x66da17a8, 0x25f5a20f, 0xdc9f77b3, 0x4f717ff8, 0xb61baa44, 0x464dbeef, 0xbf276b53, 0x2cc96318, 0xd5a3b6a4, 0x0006ecd4, 0xf96c3968, 0x6a823123, 0x93e8e49f, 0x63bef034, 0x9ad42588, 0x093a2dc3, 0xf050f87f, +0xb37f4dd8, 0x4a159864, 0xd9fb902f, 0x20914593, 0xd0c75138, 0x29ad8484, 0xba438ccf, 0x43295973, 0x05e710ab, 0xfc8dc517, 0x6f63cd5c, 0x960918e0, 0x665f0c4b, 0x9f35d9f7, 0x0cdbd1bc, 0xf5b10400, 0xb69eb1a7, 0x4ff4641b, 0xdc1a6c50, 0x2570b9ec, +0xd526ad47, 0x2c4c78fb, 0xbfa270b0, 0x46c8a50c, 0x936b13a8, 0x6a01c614, 0xf9efce5f, 0x00851be3, 0xf0d30f48, 0x09b9daf4, 0x9a57d2bf, 0x633d0703, 0x2012b2a4, 0xd9786718, 0x4a966f53, 0xb3fcbaef, 0x43aaae44, 0xbac07bf8, 0x292e73b3, 0xd044a60f, +0x968aefd7, 0x6fe03a6b, 0xfc0e3220, 0x0564e79c, 0xf532f337, 0x0c58268b, 0x9fb62ec0, 0x66dcfb7c, 0x25f34edb, 0xdc999b67, 0x4f77932c, 0xb61d4690, 0x464b523b, 0xbf218787, 0x2ccf8fcc, 0xd5a55a70, 0xc28f8604, 0x3be553b8, 0xa80b5bf3, 0x51618e4f, +0xa1379ae4, 0x585d4f58, 0xcbb34713, 0x32d992af, 0x71f62708, 0x889cf2b4, 0x1b72faff, 0xe2182f43, 0x124e3be8, 0xeb24ee54, 0x78cae61f, 0x81a033a3, 0xc76e7a7b, 0x3e04afc7, 0xadeaa78c, 0x54807230, 0xa4d6669b, 0x5dbcb327, 0xce52bb6c, 0x37386ed0, +0x7417db77, 0x8d7d0ecb, 0x1e930680, 0xe7f9d33c, 0x17afc797, 0xeec5122b, 0x7d2b1a60, 0x8441cfdc, 0x51e27978, 0xa888acc4, 0x3b66a48f, 0xc20c7133, 0x325a6598, 0xcb30b024, 0x58deb86f, 0xa1b46dd3, 0xe29bd874, 0x1bf10dc8, 0x881f0583, 0x7175d03f, +0x8123c494, 0x78491128, 0xeba71963, 0x12cdccdf, 0x54038507, 0xad6950bb, 0x3e8758f0, 0xc7ed8d4c, 0x37bb99e7, 0xced14c5b, 0x5d3f4410, 0xa45591ac, 0xe77a240b, 0x1e10f1b7, 0x8dfef9fc, 0x74942c40, 0x84c238eb, 0x7da8ed57, 0xee46e51c, 0x172c30a0, +0xc2896ad0, 0x3be3bf6c, 0xa80db727, 0x5167629b, 0xa1317630, 0x585ba38c, 0xcbb5abc7, 0x32df7e7b, 0x71f0cbdc, 0x889a1e60, 0x1b74162b, 0xe21ec397, 0x1248d73c, 0xeb220280, 0x78cc0acb, 0x81a6df77, 0xc76896af, 0x3e024313, 0xadec4b58, 0x54869ee4, +0xa4d08a4f, 0x5dba5ff3, 0xce5457b8, 0x373e8204, 0x741137a3, 0x8d7be21f, 0x1e95ea54, 0xe7ff3fe8, 0x17a92b43, 0xeec3feff, 0x7d2df6b4, 0x84472308, 0x51e495ac, 0xa88e4010, 0x3b60485b, 0xc20a9de7, 0x325c894c, 0xcb365cf0, 0x58d854bb, 0xa1b28107, +0xe29d34a0, 0x1bf7e11c, 0x8819e957, 0x71733ceb, 0x81252840, 0x784ffdfc, 0xeba1f5b7, 0x12cb200b, 0x540569d3, 0xad6fbc6f, 0x3e81b424, 0xc7eb6198, 0x37bd7533, 0xced7a08f, 0x5d39a8c4, 0xa4537d78, 0xe77cc8df, 0x1e161d63, 0x8df81528, 0x7492c094, +0x84c4d43f, 0x7dae0183, 0xee4009c8, 0x172adc74, 0x00000000, 0xdd6a73ce, 0x17b49333, 0xcadee0fd, 0x88a61e2e, 0x55cc6de0, 0x9f128d1d, 0x4278fed3, 0x7afde748, 0xa7979486, 0x6d49747b, 0xb02307b5, 0xf25bf966, 0x2f318aa8, 0xe5ef6a55, 0x3885199b, +0xd1f28c7d, 0x0c98ffb3, 0xc6461f4e, 0x1b2c6c80, 0x59549253, 0x843ee19d, 0x4ee00160, 0x938a72ae, 0xab0f6b35, 0x766518fb, 0xbcbbf806, 0x61d18bc8, 0x23a9751b, 0xfec306d5, 0x341de628, 0xe97795e6, 0x5ec70074, 0x83ad73ba, 0x49739347, 0x9419e089, +0xd6611e5a, 0x0b0b6d94, 0xc1d58d69, 0x1cbffea7, 0x243ae73c, 0xf95094f2, 0x338e740f, 0xeee407c1, 0xac9cf912, 0x71f68adc, 0xbb286a21, 0x664219ef, 0x8f358c09, 0x525fffc7, 0x98811f3a, 0x45eb6cf4, 0x07939227, 0xdaf9e1e9, 0x10270114, 0xcd4d72da, +0xf5c86b41, 0x28a2188f, 0xe27cf872, 0x3f168bbc, 0x7d6e756f, 0xa00406a1, 0x6adae65c, 0xb7b09592, 0x1151f4a0, 0xcc3b876e, 0x06e56793, 0xdb8f145d, 0x99f7ea8e, 0x449d9940, 0x8e4379bd, 0x53290a73, 0x6bac13e8, 0xb6c66026, 0x7c1880db, 0xa172f315, +0xe30a0dc6, 0x3e607e08, 0xf4be9ef5, 0x29d4ed3b, 0xc0a378dd, 0x1dc90b13, 0xd717ebee, 0x0a7d9820, 0x480566f3, 0x956f153d, 0x5fb1f5c0, 0x82db860e, 0xba5e9f95, 0x6734ec5b, 0xadea0ca6, 0x70807f68, 0x32f881bb, 0xef92f275, 0x254c1288, 0xf8266146, +0x4f96f4d4, 0x92fc871a, 0x582267e7, 0x85481429, 0xc730eafa, 0x1a5a9934, 0xd08479c9, 0x0dee0a07, 0x356b139c, 0xe8016052, 0x22df80af, 0xffb5f361, 0xbdcd0db2, 0x60a77e7c, 0xaa799e81, 0x7713ed4f, 0x9e6478a9, 0x430e0b67, 0x89d0eb9a, 0x54ba9854, +0x16c26687, 0xcba81549, 0x0176f5b4, 0xdc1c867a, 0xe4999fe1, 0x39f3ec2f, 0xf32d0cd2, 0x2e477f1c, 0x6c3f81cf, 0xb155f201, 0x7b8b12fc, 0xa6e16132, 0x1e92c44f, 0xc3f8b781, 0x0926577c, 0xd44c24b2, 0x9634da61, 0x4b5ea9af, 0x81804952, 0x5cea3a9c, +0x646f2307, 0xb90550c9, 0x73dbb034, 0xaeb1c3fa, 0xecc93d29, 0x31a34ee7, 0xfb7dae1a, 0x2617ddd4, 0xcf604832, 0x120a3bfc, 0xd8d4db01, 0x05bea8cf, 0x47c6561c, 0x9aac25d2, 0x5072c52f, 0x8d18b6e1, 0xb59daf7a, 0x68f7dcb4, 0xa2293c49, 0x7f434f87, +0x3d3bb154, 0xe051c29a, 0x2a8f2267, 0xf7e551a9, 0x4055c43b, 0x9d3fb7f5, 0x57e15708, 0x8a8b24c6, 0xc8f3da15, 0x1599a9db, 0xdf474926, 0x022d3ae8, 0x3aa82373, 0xe7c250bd, 0x2d1cb040, 0xf076c38e, 0xb20e3d5d, 0x6f644e93, 0xa5baae6e, 0x78d0dda0, +0x91a74846, 0x4ccd3b88, 0x8613db75, 0x5b79a8bb, 0x19015668, 0xc46b25a6, 0x0eb5c55b, 0xd3dfb695, 0xeb5aaf0e, 0x3630dcc0, 0xfcee3c3d, 0x21844ff3, 0x63fcb120, 0xbe96c2ee, 0x74482213, 0xa92251dd, 0x0fc330ef, 0xd2a94321, 0x1877a3dc, 0xc51dd012, +0x87652ec1, 0x5a0f5d0f, 0x90d1bdf2, 0x4dbbce3c, 0x753ed7a7, 0xa854a469, 0x628a4494, 0xbfe0375a, 0xfd98c989, 0x20f2ba47, 0xea2c5aba, 0x37462974, 0xde31bc92, 0x035bcf5c, 0xc9852fa1, 0x14ef5c6f, 0x5697a2bc, 0x8bfdd172, 0x4123318f, 0x9c494241, +0xa4cc5bda, 0x79a62814, 0xb378c8e9, 0x6e12bb27, 0x2c6a45f4, 0xf100363a, 0x3bded6c7, 0xe6b4a509, 0x5104309b, 0x8c6e4355, 0x46b0a3a8, 0x9bdad066, 0xd9a22eb5, 0x04c85d7b, 0xce16bd86, 0x137cce48, 0x2bf9d7d3, 0xf693a41d, 0x3c4d44e0, 0xe127372e, +0xa35fc9fd, 0x7e35ba33, 0xb4eb5ace, 0x69812900, 0x80f6bce6, 0x5d9ccf28, 0x97422fd5, 0x4a285c1b, 0x0850a2c8, 0xd53ad106, 0x1fe431fb, 0xc28e4235, 0xfa0b5bae, 0x27612860, 0xedbfc89d, 0x30d5bb53, 0x72ad4580, 0xafc7364e, 0x6519d6b3, 0xb873a57d, +0x00000000, 0x77587520, 0x1080739e, 0x67d806be, 0x5a5475f8, 0x2d0c00d8, 0x4ad40666, 0x3d8c7346, 0xec0dbc07, 0x9b55c927, 0xfc8dcf99, 0x8bd5bab9, 0xb659c9ff, 0xc101bcdf, 0xa6d9ba61, 0xd181cf41, 0xff24b42f, 0x887cc10f, 0xefa4c7b1, 0x98fcb291, +0xa570c1d7, 0xd228b4f7, 0xb5f0b249, 0xc2a8c769, 0x13290828, 0x64717d08, 0x03a97bb6, 0x74f10e96, 0x497d7dd0, 0x3e2508f0, 0x59fd0e4e, 0x2ea57b6e, 0x3f5238f8, 0x480a4dd8, 0x2fd24b66, 0x588a3e46, 0x65064d00, 0x125e3820, 0x75863e9e, 0x02de4bbe, +0xd35f84ff, 0xa407f1df, 0xc3dff761, 0xb4878241, 0x890bf107, 0xfe538427, 0x998b8299, 0xeed3f7b9, 0xc0768cd7, 0xb72ef9f7, 0xd0f6ff49, 0xa7ae8a69, 0x9a22f92f, 0xed7a8c0f, 0x8aa28ab1, 0xfdfaff91, 0x2c7b30d0, 0x5b2345f0, 0x3cfb434e, 0x4ba3366e, +0x762f4528, 0x01773008, 0x66af36b6, 0x11f74396, 0xb0e79d15, 0xc7bfe835, 0xa067ee8b, 0xd73f9bab, 0xeab3e8ed, 0x9deb9dcd, 0xfa339b73, 0x8d6bee53, 0x5cea2112, 0x2bb25432, 0x4c6a528c, 0x3b3227ac, 0x06be54ea, 0x71e621ca, 0x163e2774, 0x61665254, +0x4fc3293a, 0x389b5c1a, 0x5f435aa4, 0x281b2f84, 0x15975cc2, 0x62cf29e2, 0x05172f5c, 0x724f5a7c, 0xa3ce953d, 0xd496e01d, 0xb34ee6a3, 0xc4169383, 0xf99ae0c5, 0x8ec295e5, 0xe91a935b, 0x9e42e67b, 0x8fb5a5ed, 0xf8edd0cd, 0x9f35d673, 0xe86da353, +0xd5e1d015, 0xa2b9a535, 0xc561a38b, 0xb239d6ab, 0x63b819ea, 0x14e06cca, 0x73386a74, 0x04601f54, 0x39ec6c12, 0x4eb41932, 0x296c1f8c, 0x5e346aac, 0x709111c2, 0x07c964e2, 0x6011625c, 0x1749177c, 0x2ac5643a, 0x5d9d111a, 0x3a4517a4, 0x4d1d6284, +0x9c9cadc5, 0xebc4d8e5, 0x8c1cde5b, 0xfb44ab7b, 0xc6c8d83d, 0xb190ad1d, 0xd648aba3, 0xa110de83, 0x67ef698f, 0x10b71caf, 0x776f1a11, 0x00376f31, 0x3dbb1c77, 0x4ae36957, 0x2d3b6fe9, 0x5a631ac9, 0x8be2d588, 0xfcbaa0a8, 0x9b62a616, 0xec3ad336, +0xd1b6a070, 0xa6eed550, 0xc136d3ee, 0xb66ea6ce, 0x98cbdda0, 0xef93a880, 0x884bae3e, 0xff13db1e, 0xc29fa858, 0xb5c7dd78, 0xd21fdbc6, 0xa547aee6, 0x74c661a7, 0x039e1487, 0x64461239, 0x131e6719, 0x2e92145f, 0x59ca617f, 0x3e1267c1, 0x494a12e1, +0x58bd5177, 0x2fe52457, 0x483d22e9, 0x3f6557c9, 0x02e9248f, 0x75b151af, 0x12695711, 0x65312231, 0xb4b0ed70, 0xc3e89850, 0xa4309eee, 0xd368ebce, 0xeee49888, 0x99bceda8, 0xfe64eb16, 0x893c9e36, 0xa799e558, 0xd0c19078, 0xb71996c6, 0xc041e3e6, +0xfdcd90a0, 0x8a95e580, 0xed4de33e, 0x9a15961e, 0x4b94595f, 0x3ccc2c7f, 0x5b142ac1, 0x2c4c5fe1, 0x11c02ca7, 0x66985987, 0x01405f39, 0x76182a19, 0xd708f49a, 0xa05081ba, 0xc7888704, 0xb0d0f224, 0x8d5c8162, 0xfa04f442, 0x9ddcf2fc, 0xea8487dc, +0x3b05489d, 0x4c5d3dbd, 0x2b853b03, 0x5cdd4e23, 0x61513d65, 0x16094845, 0x71d14efb, 0x06893bdb, 0x282c40b5, 0x5f743595, 0x38ac332b, 0x4ff4460b, 0x7278354d, 0x0520406d, 0x62f846d3, 0x15a033f3, 0xc421fcb2, 0xb3798992, 0xd4a18f2c, 0xa3f9fa0c, +0x9e75894a, 0xe92dfc6a, 0x8ef5fad4, 0xf9ad8ff4, 0xe85acc62, 0x9f02b942, 0xf8dabffc, 0x8f82cadc, 0xb20eb99a, 0xc556ccba, 0xa28eca04, 0xd5d6bf24, 0x04577065, 0x730f0545, 0x14d703fb, 0x638f76db, 0x5e03059d, 0x295b70bd, 0x4e837603, 0x39db0323, +0x177e784d, 0x60260d6d, 0x07fe0bd3, 0x70a67ef3, 0x4d2a0db5, 0x3a727895, 0x5daa7e2b, 0x2af20b0b, 0xfb73c44a, 0x8c2bb16a, 0xebf3b7d4, 0x9cabc2f4, 0xa127b1b2, 0xd67fc492, 0xb1a7c22c, 0xc6ffb70c, 0x00000000, 0x85603ada, 0x28392cbe, 0xad591664, +0x1786e33b, 0x92e6d9e1, 0x3fbfcf85, 0xbadff55f, 0x0b3352dc, 0x8e536806, 0x230a7e62, 0xa66a44b8, 0x1cb5b1e7, 0x99d58b3d, 0x348c9d59, 0xb1eca783, 0xea68f9ce, 0x6f08c314, 0xc251d570, 0x4731efaa, 0xfdee1af5, 0x788e202f, 0xd5d7364b, 0x50b70c91, +0xe15bab12, 0x643b91c8, 0xc96287ac, 0x4c02bd76, 0xf6dd4829, 0x73bd72f3, 0xdee46497, 0x5b845e4d, 0x7911de79, 0xfc71e4a3, 0x5128f2c7, 0xd448c81d, 0x6e973d42, 0xebf70798, 0x46ae11fc, 0xc3ce2b26, 0x72228ca5, 0xf742b67f, 0x5a1ba01b, 0xdf7b9ac1, +0x65a46f9e, 0xe0c45544, 0x4d9d4320, 0xc8fd79fa, 0x937927b7, 0x16191d6d, 0xbb400b09, 0x3e2031d3, 0x84ffc48c, 0x019ffe56, 0xacc6e832, 0x29a6d2e8, 0x984a756b, 0x1d2a4fb1, 0xb07359d5, 0x3513630f, 0x8fcc9650, 0x0aacac8a, 0xa7f5baee, 0x22958034, +0xb46cca2c, 0x310cf0f6, 0x9c55e692, 0x1935dc48, 0xa3ea2917, 0x268a13cd, 0x8bd305a9, 0x0eb33f73, 0xbf5f98f0, 0x3a3fa22a, 0x9766b44e, 0x12068e94, 0xa8d97bcb, 0x2db94111, 0x80e05775, 0x05806daf, 0x5e0433e2, 0xdb640938, 0x763d1f5c, 0xf35d2586, +0x4982d0d9, 0xcce2ea03, 0x61bbfc67, 0xe4dbc6bd, 0x5537613e, 0xd0575be4, 0x7d0e4d80, 0xf86e775a, 0x42b18205, 0xc7d1b8df, 0x6a88aebb, 0xefe89461, 0xcd7d1455, 0x481d2e8f, 0xe54438eb, 0x60240231, 0xdafbf76e, 0x5f9bcdb4, 0xf2c2dbd0, 0x77a2e10a, +0xc64e4689, 0x432e7c53, 0xee776a37, 0x6b1750ed, 0xd1c8a5b2, 0x54a89f68, 0xf9f1890c, 0x7c91b3d6, 0x2715ed9b, 0xa275d741, 0x0f2cc125, 0x8a4cfbff, 0x30930ea0, 0xb5f3347a, 0x18aa221e, 0x9dca18c4, 0x2c26bf47, 0xa946859d, 0x041f93f9, 0x817fa923, +0x3ba05c7c, 0xbec066a6, 0x139970c2, 0x96f94a18, 0x764079ad, 0xf3204377, 0x5e795513, 0xdb196fc9, 0x61c69a96, 0xe4a6a04c, 0x49ffb628, 0xcc9f8cf2, 0x7d732b71, 0xf81311ab, 0x554a07cf, 0xd02a3d15, 0x6af5c84a, 0xef95f290, 0x42cce4f4, 0xc7acde2e, +0x9c288063, 0x1948bab9, 0xb411acdd, 0x31719607, 0x8bae6358, 0x0ece5982, 0xa3974fe6, 0x26f7753c, 0x971bd2bf, 0x127be865, 0xbf22fe01, 0x3a42c4db, 0x809d3184, 0x05fd0b5e, 0xa8a41d3a, 0x2dc427e0, 0x0f51a7d4, 0x8a319d0e, 0x27688b6a, 0xa208b1b0, +0x18d744ef, 0x9db77e35, 0x30ee6851, 0xb58e528b, 0x0462f508, 0x8102cfd2, 0x2c5bd9b6, 0xa93be36c, 0x13e41633, 0x96842ce9, 0x3bdd3a8d, 0xbebd0057, 0xe5395e1a, 0x605964c0, 0xcd0072a4, 0x4860487e, 0xf2bfbd21, 0x77df87fb, 0xda86919f, 0x5fe6ab45, +0xee0a0cc6, 0x6b6a361c, 0xc6332078, 0x43531aa2, 0xf98ceffd, 0x7cecd527, 0xd1b5c343, 0x54d5f999, 0xc22cb381, 0x474c895b, 0xea159f3f, 0x6f75a5e5, 0xd5aa50ba, 0x50ca6a60, 0xfd937c04, 0x78f346de, 0xc91fe15d, 0x4c7fdb87, 0xe126cde3, 0x6446f739, +0xde990266, 0x5bf938bc, 0xf6a02ed8, 0x73c01402, 0x28444a4f, 0xad247095, 0x007d66f1, 0x851d5c2b, 0x3fc2a974, 0xbaa293ae, 0x17fb85ca, 0x929bbf10, 0x23771893, 0xa6172249, 0x0b4e342d, 0x8e2e0ef7, 0x34f1fba8, 0xb191c172, 0x1cc8d716, 0x99a8edcc, +0xbb3d6df8, 0x3e5d5722, 0x93044146, 0x16647b9c, 0xacbb8ec3, 0x29dbb419, 0x8482a27d, 0x01e298a7, 0xb00e3f24, 0x356e05fe, 0x9837139a, 0x1d572940, 0xa788dc1f, 0x22e8e6c5, 0x8fb1f0a1, 0x0ad1ca7b, 0x51559436, 0xd435aeec, 0x796cb888, 0xfc0c8252, +0x46d3770d, 0xc3b34dd7, 0x6eea5bb3, 0xeb8a6169, 0x5a66c6ea, 0xdf06fc30, 0x725fea54, 0xf73fd08e, 0x4de025d1, 0xc8801f0b, 0x65d9096f, 0xe0b933b5, 0x00000000, 0xbc735145, 0x8b524c7f, 0x37211d3a, 0xb20f315a, 0x0e7c601f, 0x395d7d25, 0x852e2c60, +0x346f4eda, 0x881c1f9f, 0xbf3d02a5, 0x034e53e0, 0x86607f80, 0x3a132ec5, 0x0d3233ff, 0xb14162ba, 0xa8898217, 0x14fad352, 0x23dbce68, 0x9fa89f2d, 0x1a86b34d, 0xa6f5e208, 0x91d4ff32, 0x2da7ae77, 0x9ce6cccd, 0x20959d88, 0x17b480b2, 0xabc7d1f7, +0x2ee9fd97, 0x929aacd2, 0xa5bbb1e8, 0x19c8e0ad, 0x35c3bbff, 0x89b0eaba, 0xbe91f780, 0x02e2a6c5, 0x87cc8aa5, 0x3bbfdbe0, 0x0c9ec6da, 0xb0ed979f, 0x01acf525, 0xbddfa460, 0x8afeb95a, 0x368de81f, 0xb3a3c47f, 0x0fd0953a, 0x38f18800, 0x8482d945, +0x9d4a39e8, 0x213968ad, 0x16187597, 0xaa6b24d2, 0x2f4508b2, 0x933659f7, 0xa41744cd, 0x18641588, 0xa9257732, 0x15562677, 0x22773b4d, 0x9e046a08, 0x1b2a4668, 0xa759172d, 0x90780a17, 0x2c0b5b52, 0xca7a0535, 0x76095470, 0x4128494a, 0xfd5b180f, +0x7875346f, 0xc406652a, 0xf3277810, 0x4f542955, 0xfe154bef, 0x42661aaa, 0x75470790, 0xc93456d5, 0x4c1a7ab5, 0xf0692bf0, 0xc74836ca, 0x7b3b678f, 0x62f38722, 0xde80d667, 0xe9a1cb5d, 0x55d29a18, 0xd0fcb678, 0x6c8fe73d, 0x5baefa07, 0xe7ddab42, +0x569cc9f8, 0xeaef98bd, 0xddce8587, 0x61bdd4c2, 0xe493f8a2, 0x58e0a9e7, 0x6fc1b4dd, 0xd3b2e598, 0xffb9beca, 0x43caef8f, 0x74ebf2b5, 0xc898a3f0, 0x4db68f90, 0xf1c5ded5, 0xc6e4c3ef, 0x7a9792aa, 0xcbd6f010, 0x77a5a155, 0x4084bc6f, 0xfcf7ed2a, +0x79d9c14a, 0xc5aa900f, 0xf28b8d35, 0x4ef8dc70, 0x57303cdd, 0xeb436d98, 0xdc6270a2, 0x601121e7, 0xe53f0d87, 0x594c5cc2, 0x6e6d41f8, 0xd21e10bd, 0x635f7207, 0xdf2c2342, 0xe80d3e78, 0x547e6f3d, 0xd150435d, 0x6d231218, 0x5a020f22, 0xe6715e67, +0x27ee88b7, 0x9b9dd9f2, 0xacbcc4c8, 0x10cf958d, 0x95e1b9ed, 0x2992e8a8, 0x1eb3f592, 0xa2c0a4d7, 0x1381c66d, 0xaff29728, 0x98d38a12, 0x24a0db57, 0xa18ef737, 0x1dfda672, 0x2adcbb48, 0x96afea0d, 0x8f670aa0, 0x33145be5, 0x043546df, 0xb846179a, +0x3d683bfa, 0x811b6abf, 0xb63a7785, 0x0a4926c0, 0xbb08447a, 0x077b153f, 0x305a0805, 0x8c295940, 0x09077520, 0xb5742465, 0x8255395f, 0x3e26681a, 0x122d3348, 0xae5e620d, 0x997f7f37, 0x250c2e72, 0xa0220212, 0x1c515357, 0x2b704e6d, 0x97031f28, +0x26427d92, 0x9a312cd7, 0xad1031ed, 0x116360a8, 0x944d4cc8, 0x283e1d8d, 0x1f1f00b7, 0xa36c51f2, 0xbaa4b15f, 0x06d7e01a, 0x31f6fd20, 0x8d85ac65, 0x08ab8005, 0xb4d8d140, 0x83f9cc7a, 0x3f8a9d3f, 0x8ecbff85, 0x32b8aec0, 0x0599b3fa, 0xb9eae2bf, +0x3cc4cedf, 0x80b79f9a, 0xb79682a0, 0x0be5d3e5, 0xed948d82, 0x51e7dcc7, 0x66c6c1fd, 0xdab590b8, 0x5f9bbcd8, 0xe3e8ed9d, 0xd4c9f0a7, 0x68baa1e2, 0xd9fbc358, 0x6588921d, 0x52a98f27, 0xeedade62, 0x6bf4f202, 0xd787a347, 0xe0a6be7d, 0x5cd5ef38, +0x451d0f95, 0xf96e5ed0, 0xce4f43ea, 0x723c12af, 0xf7123ecf, 0x4b616f8a, 0x7c4072b0, 0xc03323f5, 0x7172414f, 0xcd01100a, 0xfa200d30, 0x46535c75, 0xc37d7015, 0x7f0e2150, 0x482f3c6a, 0xf45c6d2f, 0xd857367d, 0x64246738, 0x53057a02, 0xef762b47, +0x6a580727, 0xd62b5662, 0xe10a4b58, 0x5d791a1d, 0xec3878a7, 0x504b29e2, 0x676a34d8, 0xdb19659d, 0x5e3749fd, 0xe24418b8, 0xd5650582, 0x691654c7, 0x70deb46a, 0xccade52f, 0xfb8cf815, 0x47ffa950, 0xc2d18530, 0x7ea2d475, 0x4983c94f, 0xf5f0980a, +0x44b1fab0, 0xf8c2abf5, 0xcfe3b6cf, 0x7390e78a, 0xf6becbea, 0x4acd9aaf, 0x7dec8795, 0xc19fd6d0, 0x00000000, 0x8eef2411, 0xe76ce58c, 0x6983c19d, 0xd9341277, 0x57db3666, 0x3e58f7fb, 0xb0b7d3ea, 0xe34e411d, 0x6da1650c, 0x0422a491, 0x8acd8080, +0x3a7a536a, 0xb495777b, 0xdd16b6e6, 0x53f992f7, 0x6264a238, 0xec8b8629, 0x850847b4, 0x0be763a5, 0xbb50b04f, 0x35bf945e, 0x5c3c55c3, 0xd2d371d2, 0x812ae325, 0x0fc5c734, 0x664606a9, 0xe8a922b8, 0x581ef152, 0xd6f1d543, 0xbf7214de, 0x319d30cf, +0x4c2dc09c, 0xc2c2e48d, 0xab412510, 0x25ae0101, 0x9519d2eb, 0x1bf6f6fa, 0x72753767, 0xfc9a1376, 0xaf638181, 0x218ca590, 0x480f640d, 0xc6e0401c, 0x765793f6, 0xf8b8b7e7, 0x913b767a, 0x1fd4526b, 0x2e4962a4, 0xa0a646b5, 0xc9258728, 0x47caa339, +0xf77d70d3, 0x799254c2, 0x1011955f, 0x9efeb14e, 0xcd0723b9, 0x43e807a8, 0x2a6bc635, 0xa484e224, 0x143331ce, 0x9adc15df, 0xf35fd442, 0x7db0f053, 0xe3a1e37e, 0x6d4ec76f, 0x04cd06f2, 0x8a2222e3, 0x3a95f109, 0xb47ad518, 0xddf91485, 0x53163094, +0x00efa263, 0x8e008672, 0xe78347ef, 0x696c63fe, 0xd9dbb014, 0x57349405, 0x3eb75598, 0xb0587189, 0x81c54146, 0x0f2a6557, 0x66a9a4ca, 0xe84680db, 0x58f15331, 0xd61e7720, 0xbf9db6bd, 0x317292ac, 0x628b005b, 0xec64244a, 0x85e7e5d7, 0x0b08c1c6, +0xbbbf122c, 0x3550363d, 0x5cd3f7a0, 0xd23cd3b1, 0xaf8c23e2, 0x216307f3, 0x48e0c66e, 0xc60fe27f, 0x76b83195, 0xf8571584, 0x91d4d419, 0x1f3bf008, 0x4cc262ff, 0xc22d46ee, 0xabae8773, 0x2541a362, 0x95f67088, 0x1b195499, 0x729a9504, 0xfc75b115, +0xcde881da, 0x4307a5cb, 0x2a846456, 0xa46b4047, 0x14dc93ad, 0x9a33b7bc, 0xf3b07621, 0x7d5f5230, 0x2ea6c0c7, 0xa049e4d6, 0xc9ca254b, 0x4725015a, 0xf792d2b0, 0x797df6a1, 0x10fe373c, 0x9e11132d, 0x61984f96, 0xef776b87, 0x86f4aa1a, 0x081b8e0b, +0xb8ac5de1, 0x364379f0, 0x5fc0b86d, 0xd12f9c7c, 0x82d60e8b, 0x0c392a9a, 0x65baeb07, 0xeb55cf16, 0x5be21cfc, 0xd50d38ed, 0xbc8ef970, 0x3261dd61, 0x03fcedae, 0x8d13c9bf, 0xe4900822, 0x6a7f2c33, 0xdac8ffd9, 0x5427dbc8, 0x3da41a55, 0xb34b3e44, +0xe0b2acb3, 0x6e5d88a2, 0x07de493f, 0x89316d2e, 0x3986bec4, 0xb7699ad5, 0xdeea5b48, 0x50057f59, 0x2db58f0a, 0xa35aab1b, 0xcad96a86, 0x44364e97, 0xf4819d7d, 0x7a6eb96c, 0x13ed78f1, 0x9d025ce0, 0xcefbce17, 0x4014ea06, 0x29972b9b, 0xa7780f8a, +0x17cfdc60, 0x9920f871, 0xf0a339ec, 0x7e4c1dfd, 0x4fd12d32, 0xc13e0923, 0xa8bdc8be, 0x2652ecaf, 0x96e53f45, 0x180a1b54, 0x7189dac9, 0xff66fed8, 0xac9f6c2f, 0x2270483e, 0x4bf389a3, 0xc51cadb2, 0x75ab7e58, 0xfb445a49, 0x92c79bd4, 0x1c28bfc5, +0x8239ace8, 0x0cd688f9, 0x65554964, 0xebba6d75, 0x5b0dbe9f, 0xd5e29a8e, 0xbc615b13, 0x328e7f02, 0x6177edf5, 0xef98c9e4, 0x861b0879, 0x08f42c68, 0xb843ff82, 0x36acdb93, 0x5f2f1a0e, 0xd1c03e1f, 0xe05d0ed0, 0x6eb22ac1, 0x0731eb5c, 0x89decf4d, +0x39691ca7, 0xb78638b6, 0xde05f92b, 0x50eadd3a, 0x03134fcd, 0x8dfc6bdc, 0xe47faa41, 0x6a908e50, 0xda275dba, 0x54c879ab, 0x3d4bb836, 0xb3a49c27, 0xce146c74, 0x40fb4865, 0x297889f8, 0xa797ade9, 0x17207e03, 0x99cf5a12, 0xf04c9b8f, 0x7ea3bf9e, +0x2d5a2d69, 0xa3b50978, 0xca36c8e5, 0x44d9ecf4, 0xf46e3f1e, 0x7a811b0f, 0x1302da92, 0x9dedfe83, 0xac70ce4c, 0x229fea5d, 0x4b1c2bc0, 0xc5f30fd1, 0x7544dc3b, 0xfbabf82a, 0x922839b7, 0x1cc71da6, 0x4f3e8f51, 0xc1d1ab40, 0xa8526add, 0x26bd4ecc, +0x960a9d26, 0x18e5b937, 0x716678aa, 0xff895cbb, 0x00000000, 0x75b8e02c, 0xf7fd9c85, 0x82457ca9, 0x82bcff28, 0xf7041f04, 0x754163ad, 0x00f98381, 0xdc13fb92, 0xa9ab1bbe, 0x2bee6717, 0x5e56873b, 0x5eaf04ba, 0x2b17e496, 0xa952983f, 0xdcea7813, +0x7f2d28c7, 0x0a95c8eb, 0x88d0b442, 0xfd68546e, 0xfd91d7ef, 0x882937c3, 0x0a6c4b6a, 0x7fd4ab46, 0xa33ed355, 0xd6863379, 0x54c34fd0, 0x217baffc, 0x21822c7d, 0x543acc51, 0xd67fb0f8, 0xa3c750d4, 0xa2de8a7a, 0xd7666a56, 0x552316ff, 0x209bf6d3, +0x20627552, 0x55da957e, 0xd79fe9d7, 0xa22709fb, 0x7ecd71e8, 0x0b7591c4, 0x8930ed6d, 0xfc880d41, 0xfc718ec0, 0x89c96eec, 0x0b8c1245, 0x7e34f269, 0xddf3a2bd, 0xa84b4291, 0x2a0e3e38, 0x5fb6de14, 0x5f4f5d95, 0x2af7bdb9, 0xa8b2c110, 0xdd0a213c, +0x01e0592f, 0x7458b903, 0xf61dc5aa, 0x83a52586, 0x835ca607, 0xf6e4462b, 0x74a13a82, 0x0119daae, 0xa16b37bf, 0xd4d3d793, 0x5696ab3a, 0x232e4b16, 0x23d7c897, 0x566f28bb, 0xd42a5412, 0xa192b43e, 0x7d78cc2d, 0x08c02c01, 0x8a8550a8, 0xff3db084, +0xffc43305, 0x8a7cd329, 0x0839af80, 0x7d814fac, 0xde461f78, 0xabfeff54, 0x29bb83fd, 0x5c0363d1, 0x5cfae050, 0x2942007c, 0xab077cd5, 0xdebf9cf9, 0x0255e4ea, 0x77ed04c6, 0xf5a8786f, 0x80109843, 0x80e91bc2, 0xf551fbee, 0x77148747, 0x02ac676b, +0x03b5bdc5, 0x760d5de9, 0xf4482140, 0x81f0c16c, 0x810942ed, 0xf4b1a2c1, 0x76f4de68, 0x034c3e44, 0xdfa64657, 0xaa1ea67b, 0x285bdad2, 0x5de33afe, 0x5d1ab97f, 0x28a25953, 0xaae725fa, 0xdf5fc5d6, 0x7c989502, 0x0920752e, 0x8b650987, 0xfedde9ab, +0xfe246a2a, 0x8b9c8a06, 0x09d9f6af, 0x7c611683, 0xa08b6e90, 0xd5338ebc, 0x5776f215, 0x22ce1239, 0x223791b8, 0x578f7194, 0xd5ca0d3d, 0xa072ed11, 0x09dae22b, 0x7c620207, 0xfe277eae, 0x8b9f9e82, 0x8b661d03, 0xfedefd2f, 0x7c9b8186, 0x092361aa, +0xd5c919b9, 0xa071f995, 0x2234853c, 0x578c6510, 0x5775e691, 0x22cd06bd, 0xa0887a14, 0xd5309a38, 0x76f7caec, 0x034f2ac0, 0x810a5669, 0xf4b2b645, 0xf44b35c4, 0x81f3d5e8, 0x03b6a941, 0x760e496d, 0xaae4317e, 0xdf5cd152, 0x5d19adfb, 0x28a14dd7, +0x2858ce56, 0x5de02e7a, 0xdfa552d3, 0xaa1db2ff, 0xab046851, 0xdebc887d, 0x5cf9f4d4, 0x294114f8, 0x29b89779, 0x5c007755, 0xde450bfc, 0xabfdebd0, 0x771793c3, 0x02af73ef, 0x80ea0f46, 0xf552ef6a, 0xf5ab6ceb, 0x80138cc7, 0x0256f06e, 0x77ee1042, +0xd4294096, 0xa191a0ba, 0x23d4dc13, 0x566c3c3f, 0x5695bfbe, 0x232d5f92, 0xa168233b, 0xd4d0c317, 0x083abb04, 0x7d825b28, 0xffc72781, 0x8a7fc7ad, 0x8a86442c, 0xff3ea400, 0x7d7bd8a9, 0x08c33885, 0xa8b1d594, 0xdd0935b8, 0x5f4c4911, 0x2af4a93d, +0x2a0d2abc, 0x5fb5ca90, 0xddf0b639, 0xa8485615, 0x74a22e06, 0x011ace2a, 0x835fb283, 0xf6e752af, 0xf61ed12e, 0x83a63102, 0x01e34dab, 0x745bad87, 0xd79cfd53, 0xa2241d7f, 0x206161d6, 0x55d981fa, 0x5520027b, 0x2098e257, 0xa2dd9efe, 0xd7657ed2, +0x0b8f06c1, 0x7e37e6ed, 0xfc729a44, 0x89ca7a68, 0x8933f9e9, 0xfc8b19c5, 0x7ece656c, 0x0b768540, 0x0a6f5fee, 0x7fd7bfc2, 0xfd92c36b, 0x882a2347, 0x88d3a0c6, 0xfd6b40ea, 0x7f2e3c43, 0x0a96dc6f, 0xd67ca47c, 0xa3c44450, 0x218138f9, 0x5439d8d5, +0x54c05b54, 0x2178bb78, 0xa33dc7d1, 0xd68527fd, 0x75427729, 0x00fa9705, 0x82bfebac, 0xf7070b80, 0xf7fe8801, 0x8246682d, 0x00031484, 0x75bbf4a8, 0xa9518cbb, 0xdce96c97, 0x5eac103e, 0x2b14f012, 0x2bed7393, 0x5e5593bf, 0xdc10ef16, 0xa9a80f3a, +0x00000000, 0x9a7b6d96, 0xa3286ca5, 0x39530133, 0x19efd22a, 0x8394bfbc, 0xbac7be8f, 0x20bcd319, 0xc6d795a4, 0x5cacf832, 0x65fff901, 0xff849497, 0xdf38478e, 0x45432a18, 0x7c102b2b, 0xe66b46bd, 0x61fbeb64, 0xfb8086f2, 0xc2d387c1, 0x58a8ea57, +0x7814394e, 0xe26f54d8, 0xdb3c55eb, 0x4147387d, 0xa72c7ec0, 0x3d571356, 0x04041265, 0x9e7f7ff3, 0xbec3acea, 0x24b8c17c, 0x1debc04f, 0x8790add9, 0x27abb862, 0xbdd0d5f4, 0x8483d4c7, 0x1ef8b951, 0x3e446a48, 0xa43f07de, 0x9d6c06ed, 0x07176b7b, +0xe17c2dc6, 0x7b074050, 0x42544163, 0xd82f2cf5, 0xf893ffec, 0x62e8927a, 0x5bbb9349, 0xc1c0fedf, 0x46505306, 0xdc2b3e90, 0xe5783fa3, 0x7f035235, 0x5fbf812c, 0xc5c4ecba, 0xfc97ed89, 0x66ec801f, 0x8087c6a2, 0x1afcab34, 0x23afaa07, 0xb9d4c791, +0x99681488, 0x0313791e, 0x3a40782d, 0xa03b15bb, 0x1617bfbe, 0x8c6cd228, 0xb53fd31b, 0x2f44be8d, 0x0ff86d94, 0x95830002, 0xacd00131, 0x36ab6ca7, 0xd0c02a1a, 0x4abb478c, 0x73e846bf, 0xe9932b29, 0xc92ff830, 0x535495a6, 0x6a079495, 0xf07cf903, +0x77ec54da, 0xed97394c, 0xd4c4387f, 0x4ebf55e9, 0x6e0386f0, 0xf478eb66, 0xcd2bea55, 0x575087c3, 0xb13bc17e, 0x2b40ace8, 0x1213addb, 0x8868c04d, 0xa8d41354, 0x32af7ec2, 0x0bfc7ff1, 0x91871267, 0x31bc07dc, 0xabc76a4a, 0x92946b79, 0x08ef06ef, +0x2853d5f6, 0xb228b860, 0x8b7bb953, 0x1100d4c5, 0xf76b9278, 0x6d10ffee, 0x5443fedd, 0xce38934b, 0xee844052, 0x74ff2dc4, 0x4dac2cf7, 0xd7d74161, 0x5047ecb8, 0xca3c812e, 0xf36f801d, 0x6914ed8b, 0x49a83e92, 0xd3d35304, 0xea805237, 0x70fb3fa1, +0x9690791c, 0x0ceb148a, 0x35b815b9, 0xafc3782f, 0x8f7fab36, 0x1504c6a0, 0x2c57c793, 0xb62caa05, 0xbb98e502, 0x21e38894, 0x18b089a7, 0x82cbe431, 0xa2773728, 0x380c5abe, 0x015f5b8d, 0x9b24361b, 0x7d4f70a6, 0xe7341d30, 0xde671c03, 0x441c7195, +0x64a0a28c, 0xfedbcf1a, 0xc788ce29, 0x5df3a3bf, 0xda630e66, 0x401863f0, 0x794b62c3, 0xe3300f55, 0xc38cdc4c, 0x59f7b1da, 0x60a4b0e9, 0xfadfdd7f, 0x1cb49bc2, 0x86cff654, 0xbf9cf767, 0x25e79af1, 0x055b49e8, 0x9f20247e, 0xa673254d, 0x3c0848db, +0x9c335d60, 0x064830f6, 0x3f1b31c5, 0xa5605c53, 0x85dc8f4a, 0x1fa7e2dc, 0x26f4e3ef, 0xbc8f8e79, 0x5ae4c8c4, 0xc09fa552, 0xf9cca461, 0x63b7c9f7, 0x430b1aee, 0xd9707778, 0xe023764b, 0x7a581bdd, 0xfdc8b604, 0x67b3db92, 0x5ee0daa1, 0xc49bb737, +0xe427642e, 0x7e5c09b8, 0x470f088b, 0xdd74651d, 0x3b1f23a0, 0xa1644e36, 0x98374f05, 0x024c2293, 0x22f0f18a, 0xb88b9c1c, 0x81d89d2f, 0x1ba3f0b9, 0xad8f5abc, 0x37f4372a, 0x0ea73619, 0x94dc5b8f, 0xb4608896, 0x2e1be500, 0x1748e433, 0x8d3389a5, +0x6b58cf18, 0xf123a28e, 0xc870a3bd, 0x520bce2b, 0x72b71d32, 0xe8cc70a4, 0xd19f7197, 0x4be41c01, 0xcc74b1d8, 0x560fdc4e, 0x6f5cdd7d, 0xf527b0eb, 0xd59b63f2, 0x4fe00e64, 0x76b30f57, 0xecc862c1, 0x0aa3247c, 0x90d849ea, 0xa98b48d9, 0x33f0254f, +0x134cf656, 0x89379bc0, 0xb0649af3, 0x2a1ff765, 0x8a24e2de, 0x105f8f48, 0x290c8e7b, 0xb377e3ed, 0x93cb30f4, 0x09b05d62, 0x30e35c51, 0xaa9831c7, 0x4cf3777a, 0xd6881aec, 0xefdb1bdf, 0x75a07649, 0x551ca550, 0xcf67c8c6, 0xf634c9f5, 0x6c4fa463, +0xebdf09ba, 0x71a4642c, 0x48f7651f, 0xd28c0889, 0xf230db90, 0x684bb606, 0x5118b735, 0xcb63daa3, 0x2d089c1e, 0xb773f188, 0x8e20f0bb, 0x145b9d2d, 0x34e74e34, 0xae9c23a2, 0x97cf2291, 0x0db44f07, 0x00000000, 0xff1945f3, 0x8091df8c, 0x7f889a7f, +0xa51e9857, 0x5a07dda4, 0x258f47db, 0xda960228, 0xdcf8746e, 0x23e1319d, 0x5c69abe2, 0xa370ee11, 0x79e6ec39, 0x86ffa9ca, 0xf97733b5, 0x066e7646, 0x8fb18c40, 0x70a8c9b3, 0x0f2053cc, 0xf039163f, 0x2aaf1417, 0xd5b651e4, 0xaa3ecb9b, 0x55278e68, +0x5349f82e, 0xac50bddd, 0xd3d827a2, 0x2cc16251, 0xf6576079, 0x094e258a, 0x76c6bff5, 0x89dffa06, 0xd62d1024, 0x293455d7, 0x56bccfa8, 0xa9a58a5b, 0x73338873, 0x8c2acd80, 0xf3a257ff, 0x0cbb120c, 0x0ad5644a, 0xf5cc21b9, 0x8a44bbc6, 0x755dfe35, +0xafcbfc1d, 0x50d2b9ee, 0x2f5a2391, 0xd0436662, 0x599c9c64, 0xa685d997, 0xd90d43e8, 0x2614061b, 0xfc820433, 0x039b41c0, 0x7c13dbbf, 0x830a9e4c, 0x8564e80a, 0x7a7dadf9, 0x05f53786, 0xfaec7275, 0x207a705d, 0xdf6335ae, 0xa0ebafd1, 0x5ff2ea22, +0x4615af88, 0xb90cea7b, 0xc6847004, 0x399d35f7, 0xe30b37df, 0x1c12722c, 0x639ae853, 0x9c83ada0, 0x9aeddbe6, 0x65f49e15, 0x1a7c046a, 0xe5654199, 0x3ff343b1, 0xc0ea0642, 0xbf629c3d, 0x407bd9ce, 0xc9a423c8, 0x36bd663b, 0x4935fc44, 0xb62cb9b7, +0x6cbabb9f, 0x93a3fe6c, 0xec2b6413, 0x133221e0, 0x155c57a6, 0xea451255, 0x95cd882a, 0x6ad4cdd9, 0xb042cff1, 0x4f5b8a02, 0x30d3107d, 0xcfca558e, 0x9038bfac, 0x6f21fa5f, 0x10a96020, 0xefb025d3, 0x352627fb, 0xca3f6208, 0xb5b7f877, 0x4aaebd84, +0x4cc0cbc2, 0xb3d98e31, 0xcc51144e, 0x334851bd, 0xe9de5395, 0x16c71666, 0x694f8c19, 0x9656c9ea, 0x1f8933ec, 0xe090761f, 0x9f18ec60, 0x6001a993, 0xba97abbb, 0x458eee48, 0x3a067437, 0xc51f31c4, 0xc3714782, 0x3c680271, 0x43e0980e, 0xbcf9ddfd, +0x666fdfd5, 0x99769a26, 0xe6fe0059, 0x19e745aa, 0x196dcd3e, 0xe67488cd, 0x99fc12b2, 0x66e55741, 0xbc735569, 0x436a109a, 0x3ce28ae5, 0xc3fbcf16, 0xc595b950, 0x3a8cfca3, 0x450466dc, 0xba1d232f, 0x608b2107, 0x9f9264f4, 0xe01afe8b, 0x1f03bb78, +0x96dc417e, 0x69c5048d, 0x164d9ef2, 0xe954db01, 0x33c2d929, 0xccdb9cda, 0xb35306a5, 0x4c4a4356, 0x4a243510, 0xb53d70e3, 0xcab5ea9c, 0x35acaf6f, 0xef3aad47, 0x1023e8b4, 0x6fab72cb, 0x90b23738, 0xcf40dd1a, 0x305998e9, 0x4fd10296, 0xb0c84765, +0x6a5e454d, 0x954700be, 0xeacf9ac1, 0x15d6df32, 0x13b8a974, 0xeca1ec87, 0x932976f8, 0x6c30330b, 0xb6a63123, 0x49bf74d0, 0x3637eeaf, 0xc92eab5c, 0x40f1515a, 0xbfe814a9, 0xc0608ed6, 0x3f79cb25, 0xe5efc90d, 0x1af68cfe, 0x657e1681, 0x9a675372, +0x9c092534, 0x631060c7, 0x1c98fab8, 0xe381bf4b, 0x3917bd63, 0xc60ef890, 0xb98662ef, 0x469f271c, 0x5f7862b6, 0xa0612745, 0xdfe9bd3a, 0x20f0f8c9, 0xfa66fae1, 0x057fbf12, 0x7af7256d, 0x85ee609e, 0x838016d8, 0x7c99532b, 0x0311c954, 0xfc088ca7, +0x269e8e8f, 0xd987cb7c, 0xa60f5103, 0x591614f0, 0xd0c9eef6, 0x2fd0ab05, 0x5058317a, 0xaf417489, 0x75d776a1, 0x8ace3352, 0xf546a92d, 0x0a5fecde, 0x0c319a98, 0xf328df6b, 0x8ca04514, 0x73b900e7, 0xa92f02cf, 0x5636473c, 0x29bedd43, 0xd6a798b0, +0x89557292, 0x764c3761, 0x09c4ad1e, 0xf6dde8ed, 0x2c4beac5, 0xd352af36, 0xacda3549, 0x53c370ba, 0x55ad06fc, 0xaab4430f, 0xd53cd970, 0x2a259c83, 0xf0b39eab, 0x0faadb58, 0x70224127, 0x8f3b04d4, 0x06e4fed2, 0xf9fdbb21, 0x8675215e, 0x796c64ad, +0xa3fa6685, 0x5ce32376, 0x236bb909, 0xdc72fcfa, 0xda1c8abc, 0x2505cf4f, 0x5a8d5530, 0xa59410c3, 0x7f0212eb, 0x801b5718, 0xff93cd67, 0x008a8894, 0x00000000, 0xe0d1d861, 0x6ecf5b70, 0x8e1e8311, 0x3963eb91, 0xd9b233f0, 0x57acb0e1, 0xb77d6880, +0xcceeb83f, 0x2c3f605e, 0xa221e34f, 0x42f03b2e, 0xf58d53ae, 0x155c8bcf, 0x9b4208de, 0x7b93d0bf, 0x5bc5187b, 0xbb14c01a, 0x350a430b, 0xd5db9b6a, 0x62a6f3ea, 0x82772b8b, 0x0c69a89a, 0xecb870fb, 0x972ba044, 0x77fa7825, 0xf9e4fb34, 0x19352355, +0xae484bd5, 0x4e9993b4, 0xc08710a5, 0x2056c8c4, 0xcb9996a5, 0x2b484ec4, 0xa556cdd5, 0x458715b4, 0xf2fa7d34, 0x122ba555, 0x9c352644, 0x7ce4fe25, 0x07772e9a, 0xe7a6f6fb, 0x69b875ea, 0x8969ad8b, 0x3e14c50b, 0xdec51d6a, 0x50db9e7b, 0xb00a461a, +0x905c8ede, 0x708d56bf, 0xfe93d5ae, 0x1e420dcf, 0xa93f654f, 0x49eebd2e, 0xc7f03e3f, 0x2721e65e, 0x5cb236e1, 0xbc63ee80, 0x327d6d91, 0xd2acb5f0, 0x65d1dd70, 0x85000511, 0x0b1e8600, 0xebcf5e61, 0x2af6e48b, 0xca273cea, 0x4439bffb, 0xa4e8679a, +0x13950f1a, 0xf344d77b, 0x7d5a546a, 0x9d8b8c0b, 0xe6185cb4, 0x06c984d5, 0x88d707c4, 0x6806dfa5, 0xdf7bb725, 0x3faa6f44, 0xb1b4ec55, 0x51653434, 0x7133fcf0, 0x91e22491, 0x1ffca780, 0xff2d7fe1, 0x48501761, 0xa881cf00, 0x269f4c11, 0xc64e9470, +0xbddd44cf, 0x5d0c9cae, 0xd3121fbf, 0x33c3c7de, 0x84beaf5e, 0x646f773f, 0xea71f42e, 0x0aa02c4f, 0xe16f722e, 0x01beaa4f, 0x8fa0295e, 0x6f71f13f, 0xd80c99bf, 0x38dd41de, 0xb6c3c2cf, 0x56121aae, 0x2d81ca11, 0xcd501270, 0x434e9161, 0xa39f4900, +0x14e22180, 0xf433f9e1, 0x7a2d7af0, 0x9afca291, 0xbaaa6a55, 0x5a7bb234, 0xd4653125, 0x34b4e944, 0x83c981c4, 0x631859a5, 0xed06dab4, 0x0dd702d5, 0x7644d26a, 0x96950a0b, 0x188b891a, 0xf85a517b, 0x4f2739fb, 0xaff6e19a, 0x21e8628b, 0xc139baea, +0x149e6b22, 0xf44fb343, 0x7a513052, 0x9a80e833, 0x2dfd80b3, 0xcd2c58d2, 0x4332dbc3, 0xa3e303a2, 0xd870d31d, 0x38a10b7c, 0xb6bf886d, 0x566e500c, 0xe113388c, 0x01c2e0ed, 0x8fdc63fc, 0x6f0dbb9d, 0x4f5b7359, 0xaf8aab38, 0x21942829, 0xc145f048, +0x763898c8, 0x96e940a9, 0x18f7c3b8, 0xf8261bd9, 0x83b5cb66, 0x63641307, 0xed7a9016, 0x0dab4877, 0xbad620f7, 0x5a07f896, 0xd4197b87, 0x34c8a3e6, 0xdf07fd87, 0x3fd625e6, 0xb1c8a6f7, 0x51197e96, 0xe6641616, 0x06b5ce77, 0x88ab4d66, 0x687a9507, +0x13e945b8, 0xf3389dd9, 0x7d261ec8, 0x9df7c6a9, 0x2a8aae29, 0xca5b7648, 0x4445f559, 0xa4942d38, 0x84c2e5fc, 0x64133d9d, 0xea0dbe8c, 0x0adc66ed, 0xbda10e6d, 0x5d70d60c, 0xd36e551d, 0x33bf8d7c, 0x482c5dc3, 0xa8fd85a2, 0x26e306b3, 0xc632ded2, +0x714fb652, 0x919e6e33, 0x1f80ed22, 0xff513543, 0x3e688fa9, 0xdeb957c8, 0x50a7d4d9, 0xb0760cb8, 0x070b6438, 0xe7dabc59, 0x69c43f48, 0x8915e729, 0xf2863796, 0x1257eff7, 0x9c496ce6, 0x7c98b487, 0xcbe5dc07, 0x2b340466, 0xa52a8777, 0x45fb5f16, +0x65ad97d2, 0x857c4fb3, 0x0b62cca2, 0xebb314c3, 0x5cce7c43, 0xbc1fa422, 0x32012733, 0xd2d0ff52, 0xa9432fed, 0x4992f78c, 0xc78c749d, 0x275dacfc, 0x9020c47c, 0x70f11c1d, 0xfeef9f0c, 0x1e3e476d, 0xf5f1190c, 0x1520c16d, 0x9b3e427c, 0x7bef9a1d, +0xcc92f29d, 0x2c432afc, 0xa25da9ed, 0x428c718c, 0x391fa133, 0xd9ce7952, 0x57d0fa43, 0xb7012222, 0x007c4aa2, 0xe0ad92c3, 0x6eb311d2, 0x8e62c9b3, 0xae340177, 0x4ee5d916, 0xc0fb5a07, 0x202a8266, 0x9757eae6, 0x77863287, 0xf998b196, 0x194969f7, +0x62dab948, 0x820b6129, 0x0c15e238, 0xecc43a59, 0x5bb952d9, 0xbb688ab8, 0x357609a9, 0xd5a7d1c8, 0x00000000, 0xe0b69a13, 0x91522ca8, 0x71e4b6bb, 0x386c7b52, 0xd8dae141, 0xa93e57fa, 0x4988cde9, 0xcce103f3, 0x2c5799e0, 0x5db32f5b, 0xbd05b548, +0xf48d78a1, 0x143be2b2, 0x65df5409, 0x8569ce1a, 0x9bad3a86, 0x7b1ba095, 0x0aff162e, 0xea498c3d, 0xa3c141d4, 0x4377dbc7, 0x32936d7c, 0xd225f76f, 0x574c3975, 0xb7faa366, 0xc61e15dd, 0x26a88fce, 0x6f204227, 0x8f96d834, 0xfe726e8f, 0x1ec4f49c, +0xfadf0ece, 0x1a6994dd, 0x6b8d2266, 0x8b3bb875, 0xc2b3759c, 0x2205ef8f, 0x53e15934, 0xb357c327, 0x363e0d3d, 0xd688972e, 0xa76c2195, 0x47dabb86, 0x0e52766f, 0xeee4ec7c, 0x9f005ac7, 0x7fb6c0d4, 0x61723448, 0x81c4ae5b, 0xf02018e0, 0x109682f3, +0x591e4f1a, 0xb9a8d509, 0xc84c63b2, 0x28faf9a1, 0xad9337bb, 0x4d25ada8, 0x3cc11b13, 0xdc778100, 0x95ff4ce9, 0x7549d6fa, 0x04ad6041, 0xe41bfa52, 0x693163b8, 0x8987f9ab, 0xf8634f10, 0x18d5d503, 0x515d18ea, 0xb1eb82f9, 0xc00f3442, 0x20b9ae51, +0xa5d0604b, 0x4566fa58, 0x34824ce3, 0xd434d6f0, 0x9dbc1b19, 0x7d0a810a, 0x0cee37b1, 0xec58ada2, 0xf29c593e, 0x122ac32d, 0x63ce7596, 0x8378ef85, 0xcaf0226c, 0x2a46b87f, 0x5ba20ec4, 0xbb1494d7, 0x3e7d5acd, 0xdecbc0de, 0xaf2f7665, 0x4f99ec76, +0x0611219f, 0xe6a7bb8c, 0x97430d37, 0x77f59724, 0x93ee6d76, 0x7358f765, 0x02bc41de, 0xe20adbcd, 0xab821624, 0x4b348c37, 0x3ad03a8c, 0xda66a09f, 0x5f0f6e85, 0xbfb9f496, 0xce5d422d, 0x2eebd83e, 0x676315d7, 0x87d58fc4, 0xf631397f, 0x1687a36c, +0x084357f0, 0xe8f5cde3, 0x99117b58, 0x79a7e14b, 0x302f2ca2, 0xd099b6b1, 0xa17d000a, 0x41cb9a19, 0xc4a25403, 0x2414ce10, 0x55f078ab, 0xb546e2b8, 0xfcce2f51, 0x1c78b542, 0x6d9c03f9, 0x8d2a99ea, 0x59f10541, 0xb9479f52, 0xc8a329e9, 0x2815b3fa, +0x619d7e13, 0x812be400, 0xf0cf52bb, 0x1079c8a8, 0x951006b2, 0x75a69ca1, 0x04422a1a, 0xe4f4b009, 0xad7c7de0, 0x4dcae7f3, 0x3c2e5148, 0xdc98cb5b, 0xc25c3fc7, 0x22eaa5d4, 0x530e136f, 0xb3b8897c, 0xfa304495, 0x1a86de86, 0x6b62683d, 0x8bd4f22e, +0x0ebd3c34, 0xee0ba627, 0x9fef109c, 0x7f598a8f, 0x36d14766, 0xd667dd75, 0xa7836bce, 0x4735f1dd, 0xa32e0b8f, 0x4398919c, 0x327c2727, 0xd2cabd34, 0x9b4270dd, 0x7bf4eace, 0x0a105c75, 0xeaa6c666, 0x6fcf087c, 0x8f79926f, 0xfe9d24d4, 0x1e2bbec7, +0x57a3732e, 0xb715e93d, 0xc6f15f86, 0x2647c595, 0x38833109, 0xd835ab1a, 0xa9d11da1, 0x496787b2, 0x00ef4a5b, 0xe059d048, 0x91bd66f3, 0x710bfce0, 0xf46232fa, 0x14d4a8e9, 0x65301e52, 0x85868441, 0xcc0e49a8, 0x2cb8d3bb, 0x5d5c6500, 0xbdeaff13, +0x30c066f9, 0xd076fcea, 0xa1924a51, 0x4124d042, 0x08ac1dab, 0xe81a87b8, 0x99fe3103, 0x7948ab10, 0xfc21650a, 0x1c97ff19, 0x6d7349a2, 0x8dc5d3b1, 0xc44d1e58, 0x24fb844b, 0x551f32f0, 0xb5a9a8e3, 0xab6d5c7f, 0x4bdbc66c, 0x3a3f70d7, 0xda89eac4, +0x9301272d, 0x73b7bd3e, 0x02530b85, 0xe2e59196, 0x678c5f8c, 0x873ac59f, 0xf6de7324, 0x1668e937, 0x5fe024de, 0xbf56becd, 0xceb20876, 0x2e049265, 0xca1f6837, 0x2aa9f224, 0x5b4d449f, 0xbbfbde8c, 0xf2731365, 0x12c58976, 0x63213fcd, 0x8397a5de, +0x06fe6bc4, 0xe648f1d7, 0x97ac476c, 0x771add7f, 0x3e921096, 0xde248a85, 0xafc03c3e, 0x4f76a62d, 0x51b252b1, 0xb104c8a2, 0xc0e07e19, 0x2056e40a, 0x69de29e3, 0x8968b3f0, 0xf88c054b, 0x183a9f58, 0x9d535142, 0x7de5cb51, 0x0c017dea, 0xecb7e7f9, +0xa53f2a10, 0x4589b003, 0x346d06b8, 0xd4db9cab, 0x00000000, 0x69d44ccf, 0xdcc8c878, 0xb51c84b7, 0x4f1574b1, 0x26c1387e, 0x93ddbcc9, 0xfa09f006, 0x5e1f757a, 0x37cb39b5, 0x82d7bd02, 0xeb03f1cd, 0x110a01cb, 0x78de4d04, 0xcdc2c9b3, 0xa416857c, +0x891005b5, 0xe0c4497a, 0x55d8cdcd, 0x3c0c8102, 0xc6057104, 0xafd13dcb, 0x1acdb97c, 0x7319f5b3, 0xd70f70cf, 0xbedb3c00, 0x0bc7b8b7, 0x6213f478, 0x981a047e, 0xf1ce48b1, 0x44d2cc06, 0x2d0680c9, 0xb4c89740, 0xdd1cdb8f, 0x68005f38, 0x01d413f7, +0xfbdde3f1, 0x9209af3e, 0x27152b89, 0x4ec16746, 0xead7e23a, 0x8303aef5, 0x361f2a42, 0x5fcb668d, 0xa5c2968b, 0xcc16da44, 0x790a5ef3, 0x10de123c, 0x3dd892f5, 0x540cde3a, 0xe1105a8d, 0x88c41642, 0x72cde644, 0x1b19aa8b, 0xae052e3c, 0xc7d162f3, +0x63c7e78f, 0x0a13ab40, 0xbf0f2ff7, 0xd6db6338, 0x2cd2933e, 0x4506dff1, 0xf01a5b46, 0x99ce1789, 0x0a31a312, 0x63e5efdd, 0xd6f96b6a, 0xbf2d27a5, 0x4524d7a3, 0x2cf09b6c, 0x99ec1fdb, 0xf0385314, 0x542ed668, 0x3dfa9aa7, 0x88e61e10, 0xe13252df, +0x1b3ba2d9, 0x72efee16, 0xc7f36aa1, 0xae27266e, 0x8321a6a7, 0xeaf5ea68, 0x5fe96edf, 0x363d2210, 0xcc34d216, 0xa5e09ed9, 0x10fc1a6e, 0x792856a1, 0xdd3ed3dd, 0xb4ea9f12, 0x01f61ba5, 0x6822576a, 0x922ba76c, 0xfbffeba3, 0x4ee36f14, 0x273723db, +0xbef93452, 0xd72d789d, 0x6231fc2a, 0x0be5b0e5, 0xf1ec40e3, 0x98380c2c, 0x2d24889b, 0x44f0c454, 0xe0e64128, 0x89320de7, 0x3c2e8950, 0x55fac59f, 0xaff33599, 0xc6277956, 0x733bfde1, 0x1aefb12e, 0x37e931e7, 0x5e3d7d28, 0xeb21f99f, 0x82f5b550, +0x78fc4556, 0x11280999, 0xa4348d2e, 0xcde0c1e1, 0x69f6449d, 0x00220852, 0xb53e8ce5, 0xdceac02a, 0x26e3302c, 0x4f377ce3, 0xfa2bf854, 0x93ffb49b, 0x35674c49, 0x5cb30086, 0xe9af8431, 0x807bc8fe, 0x7a7238f8, 0x13a67437, 0xa6baf080, 0xcf6ebc4f, +0x6b783933, 0x02ac75fc, 0xb7b0f14b, 0xde64bd84, 0x246d4d82, 0x4db9014d, 0xf8a585fa, 0x9171c935, 0xbc7749fc, 0xd5a30533, 0x60bf8184, 0x096bcd4b, 0xf3623d4d, 0x9ab67182, 0x2faaf535, 0x467eb9fa, 0xe2683c86, 0x8bbc7049, 0x3ea0f4fe, 0x5774b831, +0xad7d4837, 0xc4a904f8, 0x71b5804f, 0x1861cc80, 0x81afdb09, 0xe87b97c6, 0x5d671371, 0x34b35fbe, 0xcebaafb8, 0xa76ee377, 0x127267c0, 0x7ba62b0f, 0xdfb0ae73, 0xb664e2bc, 0x0378660b, 0x6aac2ac4, 0x90a5dac2, 0xf971960d, 0x4c6d12ba, 0x25b95e75, +0x08bfdebc, 0x616b9273, 0xd47716c4, 0xbda35a0b, 0x47aaaa0d, 0x2e7ee6c2, 0x9b626275, 0xf2b62eba, 0x56a0abc6, 0x3f74e709, 0x8a6863be, 0xe3bc2f71, 0x19b5df77, 0x706193b8, 0xc57d170f, 0xaca95bc0, 0x3f56ef5b, 0x5682a394, 0xe39e2723, 0x8a4a6bec, +0x70439bea, 0x1997d725, 0xac8b5392, 0xc55f1f5d, 0x61499a21, 0x089dd6ee, 0xbd815259, 0xd4551e96, 0x2e5cee90, 0x4788a25f, 0xf29426e8, 0x9b406a27, 0xb646eaee, 0xdf92a621, 0x6a8e2296, 0x035a6e59, 0xf9539e5f, 0x9087d290, 0x259b5627, 0x4c4f1ae8, +0xe8599f94, 0x818dd35b, 0x349157ec, 0x5d451b23, 0xa74ceb25, 0xce98a7ea, 0x7b84235d, 0x12506f92, 0x8b9e781b, 0xe24a34d4, 0x5756b063, 0x3e82fcac, 0xc48b0caa, 0xad5f4065, 0x1843c4d2, 0x7197881d, 0xd5810d61, 0xbc5541ae, 0x0949c519, 0x609d89d6, +0x9a9479d0, 0xf340351f, 0x465cb1a8, 0x2f88fd67, 0x028e7dae, 0x6b5a3161, 0xde46b5d6, 0xb792f919, 0x4d9b091f, 0x244f45d0, 0x9153c167, 0xf8878da8, 0x5c9108d4, 0x3545441b, 0x8059c0ac, 0xe98d8c63, 0x13847c65, 0x7a5030aa, 0xcf4cb41d, 0xa698f8d2, +0x00000000, 0xdadceb98, 0xc78b19c5, 0x1d57f25d, 0xea8551e4, 0x3059ba7c, 0x2d0e4821, 0xf7d2a3b9, 0x2e5dea9c, 0xf4810104, 0xe9d6f359, 0x330a18c1, 0xc4d8bb78, 0x1e0450e0, 0x0353a2bd, 0xd98f4925, 0x16e05201, 0xcc3cb999, 0xd16b4bc4, 0x0bb7a05c, +0xfc6503e5, 0x26b9e87d, 0x3bee1a20, 0xe132f1b8, 0x38bdb89d, 0xe2615305, 0xff36a158, 0x25ea4ac0, 0xd238e979, 0x08e402e1, 0x15b3f0bc, 0xcf6f1b24, 0x3341ea8e, 0xe99d0116, 0xf4caf34b, 0x2e1618d3, 0xd9c4bb6a, 0x031850f2, 0x1e4fa2af, 0xc4934937, +0x1d1c0012, 0xc7c0eb8a, 0xda9719d7, 0x004bf24f, 0xf79951f6, 0x2d45ba6e, 0x30124833, 0xeacea3ab, 0x25a1b88f, 0xff7d5317, 0xe22aa14a, 0x38f64ad2, 0xcf24e96b, 0x15f802f3, 0x08aff0ae, 0xd2731b36, 0x0bfc5213, 0xd120b98b, 0xcc774bd6, 0x16aba04e, +0xe17903f7, 0x3ba5e86f, 0x26f21a32, 0xfc2ef1aa, 0xe34adcaa, 0x39963732, 0x24c1c56f, 0xfe1d2ef7, 0x09cf8d4e, 0xd31366d6, 0xce44948b, 0x14987f13, 0xcd173636, 0x17cbddae, 0x0a9c2ff3, 0xd040c46b, 0x279267d2, 0xfd4e8c4a, 0xe0197e17, 0x3ac5958f, +0xf5aa8eab, 0x2f766533, 0x3221976e, 0xe8fd7cf6, 0x1f2fdf4f, 0xc5f334d7, 0xd8a4c68a, 0x02782d12, 0xdbf76437, 0x012b8faf, 0x1c7c7df2, 0xc6a0966a, 0x317235d3, 0xebaede4b, 0xf6f92c16, 0x2c25c78e, 0xd00b3624, 0x0ad7ddbc, 0x17802fe1, 0xcd5cc479, +0x3a8e67c0, 0xe0528c58, 0xfd057e05, 0x27d9959d, 0xfe56dcb8, 0x248a3720, 0x39ddc57d, 0xe3012ee5, 0x14d38d5c, 0xce0f66c4, 0xd3589499, 0x09847f01, 0xc6eb6425, 0x1c378fbd, 0x01607de0, 0xdbbc9678, 0x2c6e35c1, 0xf6b2de59, 0xebe52c04, 0x3139c79c, +0xe8b68eb9, 0x326a6521, 0x2f3d977c, 0xf5e17ce4, 0x0233df5d, 0xd8ef34c5, 0xc5b8c698, 0x1f642d00, 0xf5e2a3a4, 0x2f3e483c, 0x3269ba61, 0xe8b551f9, 0x1f67f240, 0xc5bb19d8, 0xd8eceb85, 0x0230001d, 0xdbbf4938, 0x0163a2a0, 0x1c3450fd, 0xc6e8bb65, +0x313a18dc, 0xebe6f344, 0xf6b10119, 0x2c6dea81, 0xe302f1a5, 0x39de1a3d, 0x2489e860, 0xfe5503f8, 0x0987a041, 0xd35b4bd9, 0xce0cb984, 0x14d0521c, 0xcd5f1b39, 0x1783f0a1, 0x0ad402fc, 0xd008e964, 0x27da4add, 0xfd06a145, 0xe0515318, 0x3a8db880, +0xc6a3492a, 0x1c7fa2b2, 0x012850ef, 0xdbf4bb77, 0x2c2618ce, 0xf6faf356, 0xebad010b, 0x3171ea93, 0xe8fea3b6, 0x3222482e, 0x2f75ba73, 0xf5a951eb, 0x027bf252, 0xd8a719ca, 0xc5f0eb97, 0x1f2c000f, 0xd0431b2b, 0x0a9ff0b3, 0x17c802ee, 0xcd14e976, +0x3ac64acf, 0xe01aa157, 0xfd4d530a, 0x2791b892, 0xfe1ef1b7, 0x24c21a2f, 0x3995e872, 0xe34903ea, 0x149ba053, 0xce474bcb, 0xd310b996, 0x09cc520e, 0x16a87f0e, 0xcc749496, 0xd12366cb, 0x0bff8d53, 0xfc2d2eea, 0x26f1c572, 0x3ba6372f, 0xe17adcb7, +0x38f59592, 0xe2297e0a, 0xff7e8c57, 0x25a267cf, 0xd270c476, 0x08ac2fee, 0x15fbddb3, 0xcf27362b, 0x00482d0f, 0xda94c697, 0xc7c334ca, 0x1d1fdf52, 0xeacd7ceb, 0x30119773, 0x2d46652e, 0xf79a8eb6, 0x2e15c793, 0xf4c92c0b, 0xe99ede56, 0x334235ce, +0xc4909677, 0x1e4c7def, 0x031b8fb2, 0xd9c7642a, 0x25e99580, 0xff357e18, 0xe2628c45, 0x38be67dd, 0xcf6cc464, 0x15b02ffc, 0x08e7dda1, 0xd23b3639, 0x0bb47f1c, 0xd1689484, 0xcc3f66d9, 0x16e38d41, 0xe1312ef8, 0x3bedc560, 0x26ba373d, 0xfc66dca5, +0x3309c781, 0xe9d52c19, 0xf482de44, 0x2e5e35dc, 0xd98c9665, 0x03507dfd, 0x1e078fa0, 0xc4db6438, 0x1d542d1d, 0xc788c685, 0xdadf34d8, 0x0003df40, 0xf7d17cf9, 0x2d0d9761, 0x305a653c, 0xea868ea4, ] + +d0x6a0b37f8=[ 0xc9, 0x71, 0xb5, 0xcc, 0x02, 0xb6, 0x2e, 0x73, 0xd3, 0xc7, 0x10, 0x6e, 0x68, 0x6b, 0x79, 0x33, 0x81, 0x0a, 0x83, 0x1a, 0x1b, 0xc6, 0x74, 0x53, 0x16, 0x89, 0x55, 0x91, 0x84, 0x21, 0x30, 0xfc, 0x66, 0x2a, 0xce, 0xe2, 0x1c, 0xf9, 0xa1, 0xc1, +0x12, 0x17, 0x72, 0x67, 0x3a, 0xda, 0x3d, 0x00, 0x56, 0xe1, 0xe3, 0x26, 0xf1, 0xaf, 0xef, 0xd7, 0x7a, 0x46, 0xad, 0xa4, 0x6d, 0x49, 0xd5, 0xc2, 0xcf, 0x35, 0x6a, 0x36, 0x82, 0x9e, 0xea, 0x20, 0xdb, 0xfb, 0x0b, 0x04, 0xb4, 0x95, 0x1e, 0x98, +0xc3, 0x44, 0xe8, 0xcb, 0x06, 0x8e, 0x38, 0xba, 0x50, 0xf0, 0x59, 0xe5, 0x24, 0x75, 0x3b, 0xa7, 0x93, 0xc4, 0x0c, 0xd0, 0x63, 0xf4, 0xfe, 0xae, 0x15, 0xa3, 0x43, 0xd9, 0xa6, 0x09, 0x08, 0x64, 0xbc, 0x0d, 0x85, 0xec, 0xe9, 0xdf, 0x4a, 0xee, +0xaa, 0x51, 0xbd, 0x6c, 0xfa, 0xc8, 0x45, 0xb7, 0x31, 0xa0, 0x5a, 0x58, 0xd4, 0x27, 0x39, 0x8c, 0xb9, 0x34, 0x19, 0x14, 0xd1, 0x99, 0xb0, 0xdd, 0x9d, 0x13, 0x6f, 0x7f, 0xa9, 0xb2, 0x2c, 0xeb, 0x5b, 0xb3, 0x8f, 0x25, 0x7e, 0x57, 0xab, 0x05, +0x96, 0xf6, 0x2d, 0x4f, 0xd2, 0x11, 0x23, 0x54, 0x0f, 0x3e, 0x5e, 0x1f, 0xbe, 0x8a, 0x9c, 0x90, 0x07, 0x77, 0xd6, 0xed, 0x86, 0x2f, 0x60, 0x48, 0x18, 0xbb, 0x4c, 0x01, 0xcd, 0xf3, 0x47, 0xf5, 0xbf, 0x76, 0xb1, 0x7c, 0x8d, 0x62, 0x69, 0x7b, +0x5d, 0x28, 0x4b, 0x0e, 0x1d, 0x42, 0x4d, 0xe6, 0xdc, 0x29, 0x5f, 0x22, 0x87, 0xb8, 0x7d, 0x3f, 0xe0, 0x41, 0xf2, 0x03, 0x9b, 0x78, 0x65, 0x88, 0xa2, 0xac, 0x3c, 0xf7, 0x40, 0xde, 0x9f, 0xa8, 0x97, 0xc5, 0x61, 0x8b, 0x92, 0x94, 0x4e, 0xfd, +0xc0, 0xca, 0x80, 0xe4, 0x2b, 0x70, 0x37, 0xf8, 0x32, 0xe7, 0xff, 0x9a, 0x52, 0xd8, 0xa5, 0x5c, 0xe6, 0x91, 0x54, 0xcf, 0xff, 0x17, 0xc1, 0x2f, 0x2a, 0xd3, 0x23, 0xa3, 0x3f, 0xf6, 0x03, 0xcd, 0xef, 0xd7, 0x88, 0x33, 0x78, 0x6c, 0xd5, 0x0a, +0xa7, 0xcb, 0xd6, 0xb9, 0xf4, 0x73, 0x4e, 0x65, 0x6a, 0x8b, 0x58, 0x44, 0xd0, 0xa8, 0x22, 0xf3, 0xf0, 0xe9, 0x25, 0x80, 0xc8, 0x30, 0xad, 0x81, 0xbe, 0x1c, 0x5f, 0x60, 0x45, 0xe2, 0x9b, 0x71, 0x6b, 0xab, 0xa5, 0xed, 0x5b, 0x0e, 0x24, 0x1f, +0x3b, 0xdb, 0xd8, 0x59, 0x4d, 0xd4, 0xa0, 0x5c, 0x8d, 0xbb, 0x2d, 0xc6, 0xb0, 0xbf, 0x0c, 0x4a, 0x27, 0x19, 0x7d, 0x76, 0x70, 0x72, 0x04, 0x5d, 0x42, 0xdc, 0x21, 0x7b, 0x99, 0x68, 0xe3, 0x2b, 0x7a, 0x06, 0xb6, 0x1d, 0xec, 0x84, 0x49, 0x43, +0xdf, 0x39, 0x75, 0xb2, 0x1a, 0x5a, 0xf2, 0xc3, 0x64, 0xc2, 0xdd, 0x41, 0x56, 0x35, 0x11, 0x46, 0x09, 0x08, 0xe5, 0xb8, 0x4f, 0x97, 0x55, 0x69, 0x10, 0xf7, 0xfe, 0x0b, 0x6e, 0xaf, 0x48, 0xfb, 0x5e, 0x2c, 0x47, 0xca, 0x6d, 0x40, 0xe1, 0xc9, +0x67, 0xe8, 0x07, 0xfd, 0x31, 0xa4, 0x53, 0xa1, 0x83, 0xf5, 0x66, 0xf9, 0x9f, 0x26, 0x9a, 0x12, 0x8e, 0x4b, 0xc7, 0xac, 0xa9, 0xaa, 0xf1, 0x15, 0x29, 0xb3, 0x94, 0x8a, 0x52, 0xda, 0x38, 0x01, 0xfc, 0x9e, 0x20, 0xcc, 0x93, 0xba, 0xc4, 0x50, +0xd9, 0xbc, 0xee, 0x13, 0x79, 0x96, 0xe7, 0xfa, 0x3d, 0x74, 0xc0, 0x7c, 0x77, 0xae, 0x6f, 0xf8, 0x7e, 0x0f, 0xeb, 0x92, 0xa6, 0x95, 0xa2, 0x86, 0x9c, 0x34, 0x51, 0x14, 0x4c, 0xd1, 0x85, 0xde, 0xe4, 0x61, 0x2e, 0x3e, 0x1e, 0x9d, 0x02, 0x36, +0x16, 0xb5, 0xce, 0xe0, 0x8f, 0x3a, 0x7f, 0x18, 0x82, 0x8c, 0x89, 0x37, 0xc5, 0x28, 0x57, 0xea, 0x05, 0x00, 0xbd, 0x0d, 0x1b, 0x3c, 0x62, 0xb1, 0x63, 0xd2, 0x90, 0x98, 0x32, 0xb4, 0x87, 0xb7, 0xb6, 0x8b, 0x30, 0x70, 0x8a, 0xc5, 0xe8, 0xde, +0x02, 0x56, 0xe5, 0x22, 0xfa, 0xa5, 0xc9, 0x8f, 0x74, 0x1a, 0xd8, 0xf1, 0x20, 0x32, 0x53, 0xdc, 0x60, 0x85, 0x83, 0x6f, 0x1e, 0x06, 0xa9, 0x5b, 0x3c, 0x79, 0x38, 0x3f, 0x41, 0x92, 0x87, 0x09, 0xdd, 0x40, 0x16, 0x7f, 0x29, 0x2c, 0x63, 0x10, +0xb5, 0x35, 0x04, 0xff, 0x48, 0x64, 0x61, 0x25, 0xa4, 0x6d, 0x65, 0xbb, 0xaa, 0xb3, 0xdb, 0x71, 0x36, 0x44, 0x57, 0x1d, 0xfe, 0x76, 0xa6, 0x19, 0x91, 0xb9, 0x84, 0x1c, 0x58, 0x46, 0x4a, 0x4c, 0x90, 0xae, 0x33, 0xc3, 0xf4, 0x97, 0x7c, 0x4b, +0xe4, 0xbd, 0x5d, 0xe9, 0xa7, 0x3b, 0x0f, 0xd9, 0x75, 0x5a, 0xc0, 0x2a, 0xed, 0x9d, 0x77, 0xcc, 0x34, 0x17, 0x42, 0xe0, 0x21, 0xd7, 0xbc, 0xa8, 0xf5, 0x55, 0xe3, 0x5e, 0x6a, 0xc7, 0x95, 0xec, 0x82, 0x7d, 0x5f, 0x51, 0xf3, 0xbe, 0x26, 0x15, +0x54, 0x8c, 0x62, 0xd0, 0xaf, 0x31, 0x47, 0x3d, 0x13, 0x4e, 0xb4, 0x24, 0x69, 0xa1, 0x68, 0x39, 0x2b, 0x28, 0x0e, 0x18, 0x00, 0xe7, 0x89, 0x0b, 0x9b, 0xf0, 0xac, 0x05, 0x94, 0x27, 0xea, 0x03, 0xa0, 0xca, 0x7e, 0xc2, 0xb0, 0x08, 0xfb, 0x9c, +0x37, 0xfc, 0x96, 0x4f, 0x45, 0xc1, 0x1b, 0xb8, 0xda, 0x88, 0xd5, 0xba, 0xef, 0x2d, 0x98, 0xa3, 0x6c, 0x73, 0xce, 0x49, 0x0c, 0x72, 0xd4, 0x14, 0x8d, 0x23, 0x7b, 0x0d, 0xab, 0x07, 0xd1, 0x3e, 0xc8, 0xd2, 0x43, 0xee, 0x59, 0x6b, 0xd3, 0x2e, +0xcd, 0x86, 0xcf, 0x2f, 0xf6, 0x52, 0x9a, 0xf2, 0xdf, 0xc4, 0xc6, 0x3a, 0x9f, 0x8e, 0xf7, 0x5c, 0x6e, 0xbf, 0x50, 0xb2, 0x66, 0xfd, 0xe1, 0xad, 0x78, 0x99, 0x80, 0x4d, 0xe2, 0x0a, 0x9e, 0x12, 0xb1, 0x81, 0x93, 0xe6, 0x11, 0x01, 0xcb, 0x1f, +0xd6, 0x67, 0xeb, 0xf8, 0x7a, 0xf9, 0xb7, 0xa2, 0x96, 0x87, 0xcf, 0xaa, 0xe3, 0x82, 0x07, 0x5a, 0x19, 0x97, 0x7d, 0x85, 0x91, 0x3e, 0xa3, 0x1e, 0x80, 0x28, 0x1d, 0xe6, 0x7b, 0xc0, 0x03, 0xf0, 0xe1, 0x78, 0x12, 0x08, 0x7f, 0xcc, 0x01, 0xdb, +0xf3, 0xc7, 0xed, 0x61, 0x0f, 0x88, 0x55, 0x6f, 0xce, 0x25, 0x0a, 0x18, 0x38, 0x4a, 0x23, 0x2a, 0xb0, 0x8d, 0xa9, 0x3d, 0x5c, 0x21, 0xd9, 0xba, 0x41, 0x52, 0xee, 0xf2, 0xc5, 0xef, 0x0e, 0xad, 0x06, 0xa7, 0x0b, 0x15, 0xb6, 0x53, 0x02, 0xe4, +0x68, 0xd2, 0x95, 0xae, 0x09, 0xeb, 0xe2, 0x64, 0x17, 0xab, 0x9d, 0xde, 0xf9, 0x8e, 0x90, 0x44, 0xd6, 0x8f, 0x16, 0xa1, 0x40, 0xd5, 0x31, 0x6e, 0x56, 0x65, 0x8a, 0xe7, 0x32, 0xfc, 0x34, 0x5d, 0x60, 0xfe, 0x9c, 0x47, 0x0c, 0x93, 0x98, 0xd3, +0xa8, 0x3a, 0x75, 0x76, 0xf4, 0x58, 0x5e, 0x54, 0x39, 0x69, 0xe0, 0x42, 0xd4, 0x7e, 0x73, 0xc3, 0xc4, 0xc2, 0xc1, 0x67, 0x63, 0xe8, 0x14, 0xf8, 0x49, 0x8b, 0x11, 0xa4, 0x99, 0x6d, 0x86, 0x57, 0xe5, 0x89, 0x79, 0x13, 0xac, 0xbc, 0x59, 0x22, +0xd7, 0xfa, 0x20, 0x94, 0x05, 0x43, 0x1f, 0xca, 0x5b, 0x84, 0x92, 0xdf, 0xec, 0x71, 0x6a, 0xa0, 0x2f, 0xda, 0x0d, 0x77, 0x1b, 0xfb, 0x9f, 0xd1, 0x66, 0x70, 0x4e, 0x72, 0xf7, 0x27, 0xcb, 0x24, 0x9a, 0xb9, 0x48, 0xf6, 0x3f, 0x33, 0x2e, 0x37, +0x4b, 0x4f, 0x30, 0x9b, 0x35, 0xa5, 0x46, 0x83, 0x36, 0xf5, 0xb1, 0x62, 0xf1, 0x51, 0x1c, 0xbb, 0x26, 0xa6, 0xfd, 0xdc, 0x6b, 0x1a, 0xbd, 0xcd, 0x2d, 0x3b, 0x2b, 0xa2, 0xd8, 0x29, 0xe9, 0x00, 0xb8, 0x50, 0x4c, 0xb2, 0x5f, 0xc8, 0x81, 0x9e, +0xb3, 0x3c, 0x10, 0x74, 0xb4, 0xbf, 0x8c, 0xc6, 0xbe, 0x7a, 0x2c, 0x6c, 0xdd, 0xea, 0x45, 0x7c, 0xaf, 0xd0, 0x04, 0xb5, 0x4d, 0xc9, 0xb7, 0xff, 0xd8, 0x3c, 0xd7, 0xef, 0x0d, 0x33, 0x9f, 0xf8, 0xe2, 0x3e, 0xa9, 0xf1, 0x76, 0xc9, 0xea, 0xb8, +0xa2, 0x14, 0x7b, 0x28, 0xa3, 0x75, 0x2d, 0xe6, 0x5b, 0x5a, 0xa8, 0x8c, 0x87, 0xaf, 0x8f, 0x4f, 0x30, 0x2b, 0xe1, 0x92, 0x20, 0x67, 0xd6, 0x1a, 0x58, 0xa5, 0x7e, 0xb7, 0x4b, 0x44, 0x27, 0x2f, 0xb9, 0xd1, 0x80, 0xc5, 0x96, 0x6c, 0xf6, 0x8e, +0xbf, 0x11, 0x16, 0x52, 0xab, 0x5c, 0x24, 0xf9, 0x86, 0x6d, 0x91, 0x17, 0xac, 0x43, 0x04, 0x84, 0x38, 0xfc, 0x85, 0xfe, 0x54, 0x1f, 0x41, 0xcf, 0x46, 0xcd, 0x12, 0xec, 0x1d, 0x07, 0x83, 0x29, 0xcc, 0x59, 0xc6, 0xda, 0x0a, 0xa1, 0x9c, 0x01, +0x8b, 0x8d, 0xc1, 0xde, 0xe8, 0x32, 0x15, 0x45, 0xc4, 0x9d, 0x05, 0xa6, 0x70, 0xb5, 0xb4, 0x6b, 0xf3, 0x81, 0x88, 0xb3, 0x5d, 0x61, 0x62, 0x13, 0x40, 0x77, 0x89, 0xe3, 0xbd, 0x66, 0x7f, 0xd0, 0x0e, 0x79, 0xf4, 0x60, 0xdf, 0x0c, 0xbe, 0x5e, +0x06, 0xf2, 0x1c, 0x78, 0x8a, 0x71, 0x02, 0xae, 0x94, 0xeb, 0xfb, 0x2e, 0x39, 0x50, 0x93, 0x82, 0x3b, 0x0f, 0x56, 0xb0, 0x35, 0x2c, 0x4d, 0xe9, 0x4c, 0xc8, 0xfd, 0x49, 0xc7, 0xaa, 0x6a, 0x0b, 0x36, 0xb1, 0xf0, 0xee, 0xdd, 0x63, 0x4a, 0xbb, +0x65, 0xd9, 0xc3, 0xa0, 0xa4, 0x03, 0xe5, 0x10, 0x97, 0x55, 0x25, 0x6f, 0x9a, 0x69, 0xdc, 0x4e, 0xce, 0x23, 0x90, 0xca, 0xbc, 0xd3, 0x72, 0xfa, 0x98, 0xba, 0x3a, 0x37, 0x9e, 0x26, 0xd2, 0x22, 0x3d, 0x08, 0x53, 0xc2, 0x99, 0xe7, 0x2a, 0xb2, +0x51, 0x6e, 0x34, 0xf5, 0xad, 0x74, 0xcb, 0x57, 0x21, 0xff, 0x95, 0xa7, 0x1b, 0xd4, 0x73, 0xe0, 0x42, 0x47, 0x18, 0xe4, 0xf7, 0x19, 0x7c, 0x1e, 0x48, 0x64, 0xb6, 0xc0, 0xed, 0x68, 0x00, 0x31, 0x7a, 0x7d, 0x3f, 0x9b, 0x5f, 0xd5, 0xdb, 0x09, +0x94, 0x30, 0xfe, 0xf6, 0xf2, 0xd5, 0x66, 0x32, 0x37, 0xdc, 0x7a, 0x13, 0xfc, 0x28, 0x99, 0x00, 0x9b, 0x9f, 0xce, 0x1f, 0x0e, 0x17, 0x41, 0x85, 0x29, 0xdb, 0x16, 0x33, 0x39, 0xf5, 0x22, 0x54, 0xcd, 0x87, 0xe9, 0x36, 0x6e, 0x02, 0x5c, 0xb5, +0x2b, 0xcf, 0x62, 0x1c, 0x12, 0x3d, 0x7c, 0xe6, 0x44, 0xd2, 0x67, 0x1e, 0x31, 0xe8, 0xa8, 0x74, 0x82, 0xdf, 0x40, 0xfa, 0xc5, 0x95, 0x2e, 0x4d, 0xa6, 0x60, 0x59, 0x9e, 0x15, 0x7d, 0xac, 0x63, 0xc8, 0xd8, 0x70, 0xf9, 0xb9, 0xdd, 0x43, 0xde, +0x18, 0xb2, 0xc7, 0x53, 0xb6, 0xd3, 0xa7, 0x45, 0x01, 0xef, 0x6d, 0xc3, 0x57, 0x4f, 0x6a, 0x93, 0xfd, 0xbe, 0x48, 0xfb, 0xa5, 0xd7, 0xb7, 0xda, 0xa3, 0x49, 0x1d, 0xca, 0x0a, 0x07, 0x10, 0xd0, 0xea, 0x21, 0xb8, 0xe2, 0x5a, 0x58, 0x6b, 0xc6, +0x2f, 0x91, 0xd9, 0xee, 0xc0, 0x50, 0xbc, 0x09, 0xd1, 0xaa, 0x4b, 0x51, 0xba, 0x35, 0xaf, 0x65, 0x9c, 0xb0, 0x78, 0x3f, 0x71, 0x2d, 0x76, 0x97, 0x47, 0x52, 0xf3, 0x72, 0xeb, 0xe4, 0xf7, 0xf0, 0x79, 0xc9, 0x03, 0x3e, 0x75, 0x64, 0x8d, 0x0b, +0xd4, 0x8c, 0xc2, 0x5e, 0x27, 0xff, 0x8f, 0x98, 0x5d, 0xe1, 0x5b, 0x81, 0xb4, 0xbd, 0x80, 0xb3, 0x25, 0x06, 0x7f, 0x46, 0x7e, 0xbb, 0x3a, 0xf8, 0xa0, 0x8b, 0xa2, 0x20, 0xd6, 0x4e, 0x1b, 0x23, 0x9a, 0x88, 0x6f, 0xa1, 0xe7, 0x90, 0x69, 0x73, +0xec, 0xf1, 0xc1, 0x0c, 0x68, 0x2c, 0x7b, 0x19, 0x96, 0x05, 0x24, 0x61, 0xf4, 0x77, 0x0d, 0x4c, 0x1a, 0xb1, 0xcc, 0x38, 0x2a, 0x26, 0xc4, 0x84, 0x3c, 0x8e, 0xa4, 0x8a, 0xe5, 0x08, 0xed, 0x3b, 0x04, 0x0f, 0x86, 0xcb, 0x89, 0xe3, 0xae, 0x5f, +0x34, 0x55, 0x92, 0xa9, 0xe0, 0x42, 0x6c, 0x11, 0x83, 0xab, 0xbf, 0x9d, 0x56, 0x14, 0xad, 0x4a, 0x70, 0x15, 0x0d, 0xca, 0xb6, 0xd1, 0x71, 0xd6, 0x5a, 0x35, 0x3f, 0x4e, 0xdb, 0x42, 0x69, 0x9b, 0x4f, 0x9d, 0xa8, 0xe3, 0x0c, 0x41, 0x85, 0xc7, +0x26, 0x05, 0x3e, 0x29, 0x1f, 0xe8, 0x14, 0xb8, 0xf7, 0x0f, 0xb1, 0x81, 0xf4, 0x68, 0x92, 0x57, 0xf8, 0xd0, 0x82, 0x73, 0x88, 0x20, 0x31, 0xaa, 0xc6, 0x0a, 0xe6, 0x8f, 0xf0, 0x8a, 0xf3, 0x95, 0xad, 0xbb, 0xfa, 0x8e, 0xd8, 0x17, 0x3d, 0x97, +0x6d, 0x75, 0xea, 0x63, 0x43, 0xb0, 0x9e, 0xcc, 0xae, 0x01, 0x55, 0xed, 0x38, 0x6c, 0x1c, 0x18, 0x33, 0xdc, 0x60, 0x51, 0xfd, 0xd3, 0x2e, 0x8c, 0x59, 0x72, 0x21, 0x12, 0x5d, 0xbd, 0xd9, 0x23, 0x3b, 0x77, 0xcf, 0xee, 0xde, 0x04, 0x1e, 0x86, +0x61, 0x00, 0xdf, 0x09, 0x89, 0xfc, 0xcd, 0x0e, 0x1b, 0x02, 0x5e, 0x56, 0x4a, 0x1d, 0x27, 0x24, 0x32, 0xbf, 0xf9, 0x67, 0x3c, 0xa1, 0x4b, 0xa5, 0xa0, 0xaf, 0x58, 0x4d, 0x5b, 0xe0, 0x87, 0xce, 0x8b, 0x36, 0xc1, 0x94, 0x64, 0x06, 0x6b, 0xc0, +0x13, 0xc3, 0x54, 0x3a, 0xab, 0xd5, 0xc8, 0x98, 0x16, 0xdd, 0xf2, 0x9f, 0x28, 0x66, 0x39, 0x76, 0x40, 0xc5, 0xd2, 0x52, 0x1a, 0xa9, 0xe7, 0xe5, 0xcb, 0x96, 0x2d, 0xb7, 0x93, 0xeb, 0x2c, 0xff, 0x50, 0x5c, 0x6e, 0xa3, 0xc4, 0x7b, 0x11, 0x83, +0xb9, 0x49, 0xa2, 0x79, 0xc2, 0x08, 0x37, 0x22, 0x65, 0x74, 0xa6, 0xe1, 0xe2, 0xbc, 0xec, 0x4c, 0x9c, 0x7f, 0xd4, 0xa4, 0x9a, 0x80, 0xef, 0x7c, 0x2f, 0x19, 0xb4, 0x2b, 0x2a, 0xf5, 0x10, 0xc9, 0x48, 0xf6, 0xbe, 0x7e, 0x53, 0x7a, 0xfb, 0xf1, +0x03, 0x8d, 0x30, 0xba, 0x90, 0x47, 0xb5, 0x25, 0x91, 0x07, 0x45, 0xac, 0x99, 0x62, 0xb2, 0x6f, 0x6a, 0xe9, 0x7d, 0xb3, 0x0b, 0xfe, 0xda, 0xe4, 0x78, 0x44, 0x5f, 0xd7, 0xa7, 0x46, 0x84, 0x34, 0x96, 0x7f, 0x77, 0xe2, 0x02, 0x6e, 0x06, 0xfd, +0xe3, 0xc0, 0x0a, 0x16, 0x37, 0x0e, 0x1c, 0xb0, 0xa2, 0xae, 0x79, 0xda, 0xe6, 0xa6, 0x89, 0x1b, 0x20, 0xa9, 0x58, 0x01, 0xa1, 0xb1, 0x0d, 0xfe, 0xb6, 0x72, 0x73, 0x70, 0xba, 0xa3, 0xc4, 0xee, 0x8f, 0xf4, 0x43, 0xf8, 0xc2, 0x90, 0xe0, 0x57, +0x40, 0x2a, 0x0c, 0xa4, 0x87, 0x76, 0x18, 0x47, 0xe8, 0xdf, 0xeb, 0xe1, 0x24, 0x9a, 0x7a, 0x69, 0x7c, 0x35, 0x66, 0x61, 0xc6, 0x97, 0x28, 0x27, 0xfc, 0xab, 0x3c, 0x98, 0x8e, 0x71, 0xef, 0xe7, 0x45, 0x6c, 0x10, 0x1d, 0x9d, 0xbb, 0x8b, 0x4b, +0x26, 0xbd, 0x68, 0x4a, 0x04, 0x64, 0x9f, 0xb7, 0x11, 0x14, 0x53, 0x44, 0xd4, 0x23, 0x67, 0xbf, 0xcd, 0x31, 0xa8, 0x3e, 0x80, 0x5d, 0x4d, 0x34, 0xb5, 0x74, 0x5a, 0x42, 0xcb, 0x99, 0x41, 0xb8, 0x3f, 0x00, 0x6d, 0xa0, 0x3d, 0x82, 0xc8, 0xd5, +0x09, 0x22, 0x29, 0xf7, 0x30, 0xb2, 0x81, 0x7b, 0x50, 0xca, 0xc7, 0xf5, 0x3a, 0x15, 0x6b, 0x13, 0x91, 0x56, 0x2d, 0xbc, 0xbe, 0x78, 0x62, 0x05, 0x88, 0x0b, 0x2c, 0x19, 0xd2, 0x93, 0x54, 0x6a, 0x1f, 0x33, 0x9b, 0xc5, 0x4f, 0x08, 0x4e, 0x25, +0xd3, 0xa5, 0x2f, 0x49, 0x60, 0xac, 0x9e, 0x8a, 0x86, 0xdc, 0x07, 0x48, 0x1a, 0xd1, 0xce, 0x95, 0x17, 0xfa, 0xad, 0xd8, 0x55, 0x83, 0x8d, 0xf1, 0x5b, 0x21, 0x6f, 0x84, 0xaf, 0x38, 0xb4, 0xdd, 0xf2, 0x52, 0x63, 0xe5, 0x7d, 0xdb, 0xde, 0xcf, +0x2e, 0xed, 0x9c, 0xa7, 0x46, 0xaa, 0xf3, 0x92, 0x3b, 0x75, 0x2b, 0x59, 0x1e, 0xf6, 0x5f, 0x32, 0x5c, 0xd7, 0x94, 0xc9, 0x39, 0xea, 0x03, 0xb9, 0xec, 0x12, 0xff, 0xcc, 0x85, 0x65, 0xf9, 0xf0, 0xfb, 0xe4, 0x0f, 0xc1, 0x36, 0xc3, 0x5e, 0x4c, +0xd6, 0xd0, 0x8c, 0xe9, 0xd9, 0x7e, 0xb3, 0x51, 0x62, 0xaa, 0x8e, 0xce, 0x6f, 0x23, 0x10, 0x33, 0x69, 0xb1, 0xa2, 0xe4, 0x99, 0x54, 0x9b, 0xeb, 0x08, 0xa7, 0x4d, 0x81, 0x0e, 0xe8, 0x4f, 0x15, 0x4a, 0x27, 0x5c, 0xd6, 0x90, 0x7b, 0x37, 0x36, +0x86, 0x9a, 0xfb, 0xc3, 0x06, 0x94, 0x3d, 0xae, 0xe1, 0x96, 0x64, 0x5b, 0x67, 0xbd, 0x28, 0xdf, 0xe9, 0xa6, 0xdc, 0x4c, 0x07, 0x13, 0xcf, 0x1e, 0xef, 0xbb, 0x8a, 0xf0, 0xea, 0x00, 0x40, 0xa8, 0xf3, 0xd7, 0x56, 0xd0, 0xc6, 0x14, 0xf4, 0x95, +0x52, 0xbf, 0x88, 0xbc, 0x2c, 0x6b, 0x1f, 0xc4, 0x77, 0x61, 0x9c, 0x84, 0x1d, 0xac, 0xc9, 0xb0, 0x22, 0xcb, 0x7c, 0x12, 0x8d, 0x9d, 0x05, 0x0b, 0x7e, 0x92, 0x51, 0xb6, 0xd5, 0x75, 0x31, 0x24, 0xb5, 0x3a, 0x55, 0x3e, 0x20, 0x6d, 0x01, 0x74, +0xbe, 0x63, 0x0a, 0x5a, 0x8f, 0x4e, 0x18, 0x8c, 0xcc, 0x03, 0x2d, 0xde, 0xba, 0x5e, 0xfd, 0x68, 0xd4, 0xcd, 0x45, 0x2a, 0xf6, 0xc1, 0xf8, 0xe3, 0xe0, 0x60, 0x2e, 0xee, 0x58, 0xec, 0x42, 0xe6, 0x30, 0x71, 0x73, 0xd2, 0x2f, 0x04, 0x5d, 0xa5, +0xe2, 0xc2, 0xd3, 0xda, 0xb2, 0xe7, 0xc7, 0x09, 0xdb, 0xd9, 0xb3, 0xb9, 0x34, 0x11, 0xf2, 0xd8, 0x1c, 0x4b, 0x6c, 0xf5, 0xf7, 0xd1, 0x02, 0x41, 0x49, 0x8b, 0xa1, 0x7f, 0x2b, 0x80, 0xfe, 0xc0, 0xab, 0xb4, 0x7d, 0x39, 0x57, 0xb7, 0x79, 0xe5, +0x59, 0x3c, 0xdd, 0x50, 0xc8, 0x72, 0x6e, 0x38, 0xad, 0x32, 0x5f, 0xc5, 0x35, 0x0f, 0xf9, 0x3f, 0x98, 0x9f, 0x1a, 0x9e, 0xaf, 0x87, 0x97, 0x78, 0xfa, 0x89, 0x29, 0x43, 0x21, 0xa9, 0xf1, 0x65, 0x25, 0xfc, 0xa3, 0x70, 0xb8, 0x16, 0x85, 0x83, +0x6a, 0x0d, 0x0c, 0x91, 0x76, 0x44, 0x19, 0x53, 0xff, 0x82, 0x46, 0x26, 0x7a, 0xca, 0xa4, 0xed, 0x17, 0xa0, 0x47, 0x1b, 0x3b, 0x93, 0x66, 0x48, 0xa9, 0x56, 0xae, 0x41, 0x83, 0xd3, 0xdb, 0xc6, 0x6f, 0xee, 0xf5, 0x98, 0x22, 0xc2, 0xd0, 0x26, +0xe5, 0x0b, 0x3f, 0x36, 0x68, 0x80, 0x79, 0x89, 0xad, 0x12, 0x7c, 0xcd, 0x75, 0x08, 0x19, 0x11, 0x03, 0x01, 0xd4, 0xaf, 0xa2, 0xfb, 0xba, 0xf6, 0x51, 0x24, 0x14, 0x0a, 0xb8, 0x4c, 0x55, 0xcf, 0x85, 0xb7, 0x67, 0xda, 0xcc, 0xc8, 0x8f, 0x62, +0x18, 0x20, 0xe9, 0x60, 0xf2, 0x49, 0x59, 0x42, 0x8b, 0xcb, 0x50, 0x2e, 0x46, 0x77, 0xea, 0xc0, 0x04, 0x3e, 0xb5, 0x4f, 0x52, 0x99, 0xc5, 0x4a, 0xf1, 0x2a, 0x2f, 0x74, 0x7e, 0xfc, 0x2d, 0xb0, 0xa0, 0xb9, 0xf7, 0x45, 0xaa, 0x0f, 0x9c, 0x0e, +0x00, 0x21, 0x13, 0xd2, 0x54, 0x53, 0x6e, 0xdd, 0x3c, 0x61, 0xc9, 0x8d, 0x5c, 0x5d, 0xb3, 0x70, 0xe4, 0xdf, 0x90, 0xc4, 0xf4, 0xa1, 0xbb, 0x30, 0xa3, 0x76, 0x6a, 0x23, 0x5b, 0x43, 0x64, 0xd8, 0xe1, 0x2b, 0x02, 0x58, 0x35, 0xeb, 0x40, 0xde, +0x3a, 0x39, 0xc7, 0xb4, 0xf9, 0x1d, 0x38, 0x34, 0xce, 0x6d, 0x91, 0xff, 0x09, 0x27, 0xa8, 0x6c, 0xc1, 0xa5, 0x66, 0x4d, 0x78, 0x37, 0xf8, 0x7f, 0x96, 0x7a, 0xa4, 0x1c, 0x84, 0xe6, 0x32, 0x88, 0xab, 0xe8, 0xe2, 0xed, 0x7b, 0x29, 0x4b, 0x0d, +0xe7, 0x3d, 0x48, 0xb1, 0x06, 0x57, 0xfd, 0x7d, 0x8c, 0x5f, 0xca, 0x63, 0xd7, 0xf0, 0x71, 0x10, 0x0c, 0x81, 0x1e, 0xe0, 0xef, 0x9d, 0x92, 0x87, 0x6b, 0xa6, 0xd5, 0xb6, 0x44, 0x3b, 0xd9, 0x8e, 0x31, 0x95, 0x73, 0xd1, 0x97, 0x47, 0x5a, 0x65, +0x9b, 0xbf, 0xf3, 0xbd, 0x28, 0x1b, 0x72, 0xdc, 0xec, 0xc3, 0xbc, 0x17, 0x8a, 0x25, 0xe3, 0x9f, 0x15, 0xac, 0x9a, 0x69, 0xa7, 0x94, 0x9e, 0x33, 0x16, 0x93, 0xb2, 0x05, 0x5e, 0x4e, 0x82, 0x1a, 0x2c, 0xfa, 0x07, 0xd6, 0x1f, 0xbe, 0xfe, 0x86, +0x8e, 0x9f, 0x87, 0xd1, 0xb3, 0xcb, 0x64, 0xeb, 0x60, 0x07, 0xdd, 0xd6, 0xba, 0xdb, 0xae, 0x58, 0x26, 0x7d, 0xec, 0x47, 0xef, 0xfd, 0x29, 0xa3, 0xf3, 0xfa, 0x1f, 0xa7, 0xa6, 0xb2, 0x90, 0x55, 0xd9, 0x42, 0x03, 0x97, 0x36, 0xbf, 0x3b, 0x48, +0xd8, 0x31, 0x7b, 0x28, 0xf5, 0xbc, 0x9a, 0xf9, 0x56, 0x92, 0x2d, 0x61, 0x43, 0x46, 0x8c, 0x15, 0x06, 0x39, 0xe9, 0x5a, 0x5e, 0x69, 0xa2, 0x41, 0xbb, 0x88, 0x76, 0x77, 0xca, 0xac, 0x1e, 0xdc, 0x81, 0xce, 0x38, 0xcc, 0x30, 0xfe, 0x3a, 0xc7, +0x86, 0x17, 0x34, 0x79, 0x51, 0x6a, 0xb8, 0x35, 0x84, 0x02, 0xcd, 0xfb, 0x2a, 0x18, 0x62, 0xa8, 0x49, 0xf6, 0x0d, 0x4e, 0x0a, 0xb4, 0x63, 0xab, 0x4d, 0x54, 0xb7, 0x0e, 0xe7, 0x10, 0x01, 0xd5, 0x8a, 0xe6, 0x5c, 0xd4, 0x8b, 0xda, 0xc1, 0x91, +0x2f, 0x4f, 0x0b, 0xa1, 0x19, 0x09, 0xbe, 0x8f, 0x9d, 0xf7, 0x68, 0x1c, 0x6c, 0xad, 0x6d, 0xcf, 0xa5, 0x59, 0x67, 0xd7, 0xe5, 0x9e, 0x2e, 0x40, 0xaf, 0xf8, 0x9b, 0x27, 0xf1, 0xd2, 0x89, 0x3f, 0x74, 0x78, 0x65, 0x7e, 0xaa, 0x83, 0x04, 0x73, +0xf2, 0x99, 0xdf, 0x00, 0x45, 0xff, 0x12, 0xe2, 0xc3, 0x21, 0xe0, 0x32, 0x6f, 0x13, 0xc2, 0x5f, 0x3d, 0x50, 0x95, 0x3c, 0xd0, 0xee, 0x75, 0xc0, 0xc9, 0x33, 0xf4, 0x25, 0x4a, 0x23, 0x52, 0x72, 0x85, 0xc5, 0x80, 0x05, 0x96, 0xb0, 0x16, 0x0c, +0xa4, 0x5b, 0x37, 0xed, 0x57, 0x6e, 0x93, 0xfc, 0x6b, 0xb6, 0xe3, 0xde, 0x1d, 0x11, 0x44, 0xe1, 0xea, 0x1b, 0xc8, 0xc6, 0x70, 0x22, 0x20, 0x5d, 0x8d, 0x53, 0xbd, 0xb9, 0x94, 0x7f, 0x7c, 0x4c, 0xf0, 0x82, 0xb1, 0xe4, 0x9c, 0xa9, 0x98, 0x08, +0x71, 0x14, 0x1a, 0xd3, 0x3e, 0x4b, 0xa0, 0xc4, 0x24, 0x7a, 0x66, 0x2c, 0xb5, 0xe8, 0x0f, 0x2b, 0x21, 0xe8, 0xdc, 0xa1, 0x99, 0x5c, 0x5d, 0x11, 0xc7, 0x4d, 0x49, 0xfa, 0x50, 0x1a, 0x58, 0xfd, 0x3f, 0x43, 0xda, 0xb0, 0xf9, 0xca, 0xe4, 0x13, +0x07, 0x48, 0x37, 0x89, 0x9a, 0x20, 0x96, 0x6a, 0x09, 0xfb, 0xb2, 0x1d, 0xd0, 0x98, 0x92, 0x3c, 0xb1, 0xed, 0xe0, 0x67, 0x0b, 0x7b, 0x00, 0x62, 0x04, 0x0c, 0x56, 0x2c, 0x5f, 0x06, 0x80, 0x46, 0x1e, 0x19, 0x47, 0xe1, 0x90, 0x02, 0x4c, 0xcf, +0x10, 0x59, 0x66, 0x77, 0xee, 0xae, 0x3b, 0x0e, 0x26, 0xd9, 0x4f, 0xa4, 0x16, 0x9f, 0x93, 0xf4, 0x9c, 0x14, 0x8e, 0x44, 0xd1, 0xa6, 0x68, 0xc1, 0x3e, 0x88, 0xbd, 0x6c, 0xd3, 0x79, 0xf2, 0x7f, 0xad, 0xf7, 0x0f, 0x1c, 0x2b, 0xf8, 0x75, 0xe3, +0x97, 0x41, 0x25, 0x8d, 0x82, 0x7c, 0x24, 0xfc, 0x54, 0xbe, 0x2a, 0xff, 0xe9, 0x76, 0x4e, 0x30, 0x08, 0x4a, 0x6b, 0x84, 0x3d, 0xd8, 0xac, 0x94, 0x83, 0x85, 0xbb, 0x42, 0xbc, 0x70, 0xa3, 0xa0, 0xa2, 0x57, 0x78, 0xb5, 0xd2, 0xfe, 0xec, 0x5b, +0x03, 0x39, 0x40, 0x28, 0xe2, 0xb6, 0xf6, 0x87, 0xd4, 0x69, 0xd6, 0x45, 0xaf, 0x2e, 0xd5, 0x51, 0xa9, 0x8a, 0xcc, 0x36, 0x8b, 0xeb, 0xe5, 0xde, 0x61, 0x0d, 0xa7, 0x95, 0xc3, 0xea, 0x72, 0x1f, 0x65, 0xbf, 0x22, 0x12, 0x29, 0x5a, 0xc6, 0xcd, +0xb4, 0xd7, 0x32, 0x64, 0xa8, 0x2d, 0xdb, 0x4b, 0xb3, 0x63, 0x8c, 0x55, 0x33, 0x9e, 0xf1, 0x17, 0xc0, 0x86, 0x52, 0x0a, 0xe6, 0xc8, 0x7a, 0x31, 0xa5, 0x5e, 0x8f, 0x15, 0xc9, 0xc4, 0x23, 0xcb, 0xef, 0xf3, 0xb8, 0x3a, 0x91, 0xb9, 0x01, 0xc2, +0x6f, 0x9b, 0xf0, 0x38, 0xc5, 0x35, 0xdd, 0x6d, 0x53, 0xce, 0x05, 0x71, 0xaa, 0xab, 0xba, 0x6e, 0xf5, 0xe7, 0x27, 0x18, 0xdf, 0x81, 0x9d, 0x34, 0x1b, 0x7e, 0x2f, 0x7d, 0x74, 0x60, 0x73, 0xb7, 0xaf, 0x86, 0x97, 0x16, 0x41, 0x66, 0x3a, 0xa1, +0x36, 0x19, 0xbc, 0x5f, 0x23, 0x57, 0x84, 0x06, 0x76, 0xc0, 0x93, 0x45, 0xb7, 0x7c, 0xdc, 0x8f, 0xa2, 0x4c, 0x11, 0x14, 0xf3, 0x0f, 0xeb, 0x89, 0x56, 0xa5, 0xba, 0x78, 0xed, 0xa7, 0x44, 0xd6, 0xcd, 0x26, 0x24, 0xcb, 0x3e, 0xbe, 0xcc, 0x4a, +0x61, 0xd0, 0x43, 0x8d, 0xee, 0x8b, 0x99, 0xdf, 0x01, 0x91, 0x79, 0xce, 0x65, 0x4f, 0xca, 0x87, 0x46, 0xd9, 0xda, 0x9a, 0x49, 0x59, 0x58, 0xa0, 0xe7, 0xa4, 0xfc, 0x5c, 0xff, 0x85, 0xa6, 0xdb, 0x3f, 0x39, 0x1e, 0xc4, 0x1b, 0x4b, 0x52, 0x4d, +0x82, 0x9b, 0x37, 0x03, 0x74, 0x92, 0xb2, 0x30, 0x7a, 0xc2, 0xd2, 0xf0, 0xe4, 0xe9, 0x07, 0xf7, 0x55, 0x3d, 0xef, 0x15, 0x8e, 0xf6, 0xa9, 0xec, 0xea, 0xb1, 0x3c, 0xdd, 0xfa, 0x08, 0x51, 0x2d, 0x70, 0xe6, 0x8c, 0x25, 0x0b, 0xfd, 0xbf, 0xa8, +0xe1, 0x4e, 0x42, 0x28, 0x53, 0x64, 0x20, 0xfb, 0x5d, 0xc9, 0x34, 0xd4, 0xb9, 0x6a, 0x60, 0x17, 0x80, 0x68, 0xc1, 0x71, 0xf5, 0x6c, 0xfe, 0x12, 0x5a, 0xb3, 0x0d, 0xac, 0x22, 0x18, 0xf2, 0xd1, 0x1f, 0x29, 0x9e, 0x83, 0x94, 0x6d, 0x9d, 0xad, +0xde, 0x73, 0xaa, 0xf4, 0x32, 0x54, 0x38, 0x8a, 0x27, 0xb6, 0xa3, 0x3b, 0x77, 0x09, 0x72, 0x47, 0x75, 0x7d, 0xe8, 0x21, 0xd7, 0x2a, 0x1c, 0x13, 0x48, 0x1a, 0xbd, 0xe5, 0x67, 0xbb, 0xb5, 0x0a, 0xc6, 0xb0, 0x02, 0x33, 0x2b, 0xae, 0xcf, 0xe3, +0x35, 0x90, 0xf8, 0x7b, 0x5b, 0x9c, 0xf9, 0x40, 0xd3, 0x04, 0xc7, 0x96, 0xe2, 0x1d, 0x6e, 0x2c, 0x9f, 0x95, 0x7e, 0xf1, 0xe0, 0x31, 0xc3, 0x6b, 0xd8, 0x62, 0x2e, 0x5e, 0x69, 0x7f, 0x81, 0x88, 0xb4, 0x00, 0x6f, 0x0e, 0xd5, 0xb8, 0x2f, 0xab, +0x98, 0x05, 0x0c, 0x10, 0xc5, 0x50, 0xc8, 0x63, 0x5d, 0xa6, 0x9e, 0x7f, 0x33, 0xa7, 0xce, 0xae, 0x1d, 0xe2, 0x0d, 0xb1, 0x6c, 0x6e, 0xff, 0x6d, 0x9f, 0xf2, 0xb8, 0xed, 0x1a, 0x04, 0x0b, 0x89, 0xac, 0x6a, 0xe0, 0xd4, 0xba, 0x8c, 0x2f, 0x3e, +0xf6, 0xcd, 0x90, 0x66, 0x80, 0x5b, 0x07, 0x9d, 0xfb, 0x78, 0x23, 0xad, 0x41, 0x61, 0x11, 0xfa, 0x5f, 0x43, 0x54, 0x71, 0x99, 0x83, 0x52, 0x7b, 0x93, 0xda, 0x85, 0xd5, 0xe1, 0x53, 0xde, 0x87, 0xdc, 0xa4, 0xc9, 0x03, 0x77, 0xd9, 0x9c, 0x70, +0xb7, 0x20, 0x12, 0x4a, 0xf5, 0x65, 0x59, 0x67, 0x0f, 0xcf, 0xe7, 0x97, 0xc5, 0x73, 0x17, 0x2e, 0x94, 0x84, 0x98, 0xeb, 0x08, 0xd8, 0x60, 0x6f, 0x64, 0x46, 0xf4, 0xbc, 0x3b, 0xb3, 0xd6, 0x3f, 0xef, 0xe3, 0xc2, 0x47, 0xd0, 0x96, 0x82, 0x26, +0xa3, 0x7d, 0xc8, 0x19, 0xbf, 0xdd, 0x10, 0x5e, 0x50, 0xf0, 0xc6, 0x1f, 0x01, 0x0a, 0xbd, 0x2c, 0x63, 0x69, 0x38, 0xab, 0xfe, 0x2a, 0xb5, 0xb0, 0xe6, 0x27, 0x2b, 0x56, 0x31, 0x4f, 0xa5, 0x1e, 0xfd, 0xa0, 0x37, 0xc7, 0xf9, 0xc3, 0x8f, 0x62, +0xfc, 0x8a, 0x4d, 0xa8, 0x25, 0xaf, 0xd2, 0x1c, 0x42, 0x4b, 0xe4, 0xe5, 0x51, 0xec, 0xe9, 0x22, 0x32, 0x75, 0xdb, 0x44, 0xf3, 0x3a, 0xcb, 0x29, 0x9b, 0xc4, 0x4c, 0x24, 0x0e, 0xbe, 0x35, 0xe8, 0x7e, 0xc1, 0xb6, 0x05, 0x81, 0xb9, 0x72, 0x58, +0x57, 0x18, 0x86, 0x2d, 0x1b, 0x3c, 0x5c, 0xa2, 0x88, 0x8e, 0xa9, 0x4e, 0xb4, 0x6b, 0x48, 0x16, 0x45, 0xd3, 0x30, 0x0c, 0x74, 0x7a, 0x92, 0xf8, 0xd1, 0x15, 0x28, 0x91, 0xa1, 0x21, 0xbb, 0x76, 0x55, 0x8d, 0xb2, 0x06, 0x79, 0x9a, 0x14, 0xaa, +0x40, 0x09, 0x34, 0x5a, 0x49, 0x36, 0xea, 0x13, 0x8b, 0xf7, 0xf1, 0x95, 0xca, 0xdf, 0xee, 0x3d, 0x39, 0xcc, 0x00, 0xd7, 0x02, 0xc0, 0x7c, 0x68, 0xf0, 0xd6, 0x8c, 0x5f, 0xae, 0x99, 0xc1, 0x5b, 0x7b, 0xe4, 0x74, 0x6f, 0x03, 0xda, 0xe9, 0xaa, +0x93, 0x54, 0xeb, 0x2f, 0xba, 0x1d, 0x72, 0x8d, 0x0d, 0xd9, 0xf4, 0x1a, 0xb2, 0x04, 0x2e, 0xb0, 0x17, 0xfc, 0x5e, 0x46, 0x41, 0x55, 0xbc, 0x4f, 0xd1, 0x1e, 0x3c, 0xed, 0xf5, 0xe3, 0x07, 0x06, 0xb1, 0x4a, 0x70, 0x2b, 0x79, 0xef, 0x49, 0x3b, +0x68, 0x95, 0xf2, 0x22, 0x73, 0xc6, 0x36, 0x48, 0x4b, 0xbb, 0x6e, 0x43, 0xc4, 0x0e, 0x12, 0x57, 0x0a, 0xa9, 0x80, 0xde, 0x40, 0x5d, 0x11, 0x00, 0x5c, 0x64, 0xcf, 0x82, 0x1f, 0x59, 0x30, 0xe2, 0xc0, 0xa1, 0xe0, 0x38, 0xb7, 0xc2, 0xe5, 0xf9, +0x86, 0x24, 0x51, 0x09, 0xdb, 0xea, 0xdc, 0x39, 0x78, 0xfa, 0xce, 0x3f, 0x69, 0x97, 0x1c, 0x87, 0x3e, 0x9f, 0x66, 0xee, 0x32, 0x76, 0x2a, 0x9a, 0x83, 0xca, 0x60, 0x7f, 0x3d, 0xdd, 0x0f, 0x4e, 0x98, 0x14, 0xa6, 0x23, 0xa0, 0x7c, 0x05, 0xb6, +0xf1, 0xd8, 0x29, 0xa2, 0xd4, 0x6a, 0x3a, 0x15, 0x16, 0x8f, 0x02, 0xac, 0xb8, 0xd7, 0x89, 0xb3, 0xa3, 0x65, 0x63, 0x7a, 0x44, 0x42, 0xc5, 0x92, 0x2d, 0x45, 0x28, 0x2c, 0x25, 0x6d, 0xa8, 0x10, 0x62, 0x0b, 0xe1, 0x18, 0x75, 0x13, 0x91, 0xc8, +0x21, 0xab, 0x08, 0xb9, 0xf7, 0x67, 0xd3, 0x37, 0x20, 0xb5, 0x56, 0x19, 0xe7, 0x9e, 0xc9, 0xa4, 0x26, 0xb4, 0x58, 0x33, 0x8a, 0x47, 0xcb, 0x4d, 0x53, 0x77, 0xa5, 0xd5, 0x50, 0xdf, 0xa7, 0x34, 0x5a, 0x61, 0xe8, 0xff, 0xfd, 0x81, 0x31, 0x9d, +0x7e, 0xe6, 0x8e, 0x85, 0xbd, 0x9c, 0x9b, 0x52, 0xaf, 0x84, 0x01, 0x6b, 0x1b, 0xfb, 0x0c, 0x6c, 0xbe, 0xc3, 0xd0, 0x4c, 0xf8, 0x8b, 0xcd, 0x35, 0xc7, 0x96, 0xd2, 0x27, 0xf3, 0x88, 0xfe, 0x7d, 0xcc, 0x71, 0xbf, 0xec, 0xf6, 0x94, 0x90, 0xad, +0x1c, 0x9d, 0x85, 0x80, 0xff, 0xb1, 0x9a, 0x30, 0x1e, 0x2a, 0xe0, 0xa0, 0x8d, 0x41, 0xf2, 0x9c, 0x90, 0x8e, 0xc0, 0xac, 0x65, 0xb3, 0x08, 0xeb, 0x39, 0xd3, 0x9f, 0x5e, 0xf7, 0x57, 0xda, 0x00, 0xc2, 0xb4, 0xb8, 0x1d, 0x68, 0x23, 0x7e, 0x72, +0x38, 0xd0, 0x84, 0x10, 0x2e, 0x3b, 0x15, 0xe2, 0xb2, 0x14, 0x61, 0xdd, 0x75, 0xa2, 0xf5, 0xa7, 0x16, 0xfb, 0x2b, 0xe3, 0x71, 0xde, 0x63, 0x8a, 0xe4, 0xea, 0xf3, 0xa9, 0xaa, 0x89, 0xe8, 0x33, 0xef, 0x8c, 0xee, 0x79, 0x82, 0x3d, 0x43, 0x01, +0x74, 0x03, 0x7b, 0x97, 0xf1, 0x2c, 0x93, 0xc7, 0x62, 0xdb, 0x34, 0x18, 0x60, 0xe9, 0x46, 0xc8, 0x78, 0x47, 0x48, 0xaf, 0xae, 0xfe, 0x35, 0x4f, 0xed, 0xd4, 0x49, 0xce, 0x98, 0xec, 0x36, 0xfd, 0x45, 0x55, 0xb5, 0x53, 0xe7, 0xab, 0x58, 0x1f, +0x54, 0xa8, 0x2d, 0x0a, 0xbb, 0xa1, 0x51, 0x92, 0x7f, 0xc9, 0xfa, 0xd5, 0x7a, 0x8b, 0x02, 0xbf, 0x4e, 0x0d, 0x0f, 0x09, 0x96, 0xdf, 0xca, 0x56, 0x52, 0x6f, 0x26, 0xd8, 0xb7, 0x9e, 0xd1, 0x3f, 0xfc, 0x8f, 0x11, 0x50, 0x3e, 0x27, 0x06, 0x99, +0x94, 0xc5, 0x5f, 0x07, 0xf8, 0x4b, 0x86, 0x21, 0x0e, 0x64, 0xc6, 0x67, 0x9b, 0xf4, 0xf0, 0x6a, 0x0b, 0xcf, 0xcc, 0x40, 0xd7, 0xe6, 0x25, 0xa6, 0x5a, 0x7c, 0x29, 0x87, 0x0c, 0xbc, 0xd2, 0x32, 0x73, 0x37, 0xe1, 0x81, 0x6d, 0xbe, 0xb6, 0x2f, +0x95, 0x70, 0x20, 0x5b, 0x44, 0x83, 0x28, 0xad, 0xc3, 0xf9, 0x6b, 0x5c, 0x3c, 0x17, 0xc4, 0x4c, 0xd9, 0x05, 0xbd, 0x42, 0x7d, 0x88, 0xb9, 0x1b, 0xdc, 0x1a, 0x77, 0x6c, 0x5d, 0xa5, 0xb0, 0xcd, 0xe5, 0x6e, 0xf6, 0x22, 0xc1, 0xa3, 0x4d, 0xd6, +0x69, 0x76, 0x24, 0x59, 0x12, 0xcb, 0x31, 0x66, 0x13, 0x91, 0x4a, 0x19, 0xa4, 0x3a, 0xba, 0x04, ] +d0x6a0ba4d0=[ 0x65d91e78, 0x265b005f, 0x8d9658da, 0x0a9707d1, 0x94926bce, 0xc0af1051, 0x9e056c1f, 0x3c229950, 0x23bfd48c, 0xaa05dd2b, 0x042c517d, 0x8f23776f, 0x86c9daa5, 0xf4afa165, 0x150a4a0d, 0x35c8349a, 0x2fb1ad95, 0xc7feeb37, 0x8ac7a3bc, 0x33514a52, +0xcca16948, 0x55f5fe31, 0xdc4ff796, 0x4e44e290, 0xe310c4dd, 0x634060b0, 0xb2c96b91, 0x125bb16b, 0x82e58bd8, 0x603dcaab, 0x00000000, 0x5eaa7c4e, 0x1a79990f, 0x3e97b6e5, 0x2928d35d, 0x1f9d4ddc, 0x41373192, 0x139334c5, 0x8eebf2c1, 0x97efc1d5, +0xa9787730, 0xd1890b21, 0x50112ae2, 0x1ce0e7c7, 0x764a2abd, 0xd0418e8f, 0x9176bf1d, 0x9d78c604, 0x2b9dfce8, 0xfbdc7267, 0x0dc6fcb7, 0xf8a1d87c, 0x52a40557, 0x4cf1cd25, 0x681fe2cf, 0xf56724cb, 0xc945bd9b, 0xa7c3219c, 0x58330286, 0xe589ba15, +0x0c0e7919, 0x17bf65b8, 0x31e465e7, 0x02b52fb5, 0xedab9271, 0x88728c09, 0x87015f0b, 0x11261b70, 0xc88d3835, 0x1677e016, 0x2ccc078e, 0xeb32ecb9, 0x1bb11ca1, 0xdad6895e, 0xbc723d3d, 0x2d048220, 0x4a68b3ed, 0x0f73d302, 0x0751fb66, 0xf14b75b6, +0xb1b4c18a, 0xe987c30c, 0x7782af13, 0x5dd7d655, 0x6f4e19a9, 0x10ee9ede, 0x01c885ae, 0xe1a5eb68, 0x8b0f2612, 0x9cb043aa, 0xcfdcc353, 0x955aee60, 0x43821e27, 0xe2d84173, 0xdb1e0cf0, 0x19043314, 0xef1ebdc4, 0xe6f4100e, 0xdefad823, 0x5b4ea89d, +0xae298c56, 0xfff0231a, 0xce1446fd, 0x832d0e76, 0x20c27e97, 0xa60ba432, 0x6b6248d4, 0xabcd5885, 0x5a862d33, 0x753780a6, 0xdf325d8d, 0x0b5f827f, 0xb6e53aec, 0x1d286269, 0x2a557946, 0x89ba09a7, 0xfe38a6b4, 0xa5760e29, 0x6c33b3b2, 0x302ce049, +0xbb23c65b, 0xafe109f8, 0x70d35475, 0x59fb8728, 0x66a4b463, 0xa3ef70e1, 0x7b8cd60a, 0xc54bc482, 0x39c64d83, 0x44d3e541, 0x64119bd6, 0x72667bc0, 0x2e79283b, 0x9627447b, 0x9fcde9b1, 0x451b60ef, 0xdd877238, 0x676c31cd, 0xc21a3fe4, 0xb59890f7, +0xbaeb43f5, 0x69d76761, 0x93c390a8, 0x9be1b8cc, 0x847cf510, 0x4ba03643, 0xcbf0922e, 0x3f5f334b, 0xc483412c, 0xb85e6c40, 0xe4413fbb, 0x22775122, 0xa15a5f54, 0x989c12d7, 0x7d15a8c2, 0x78f17c11, 0xf9695dd2, 0xb07c4424, 0xd46ddff2, 0x3abbe798, +0x2526aa44, 0x6aaacd7a, 0x73aefe6e, 0x18ccb6ba, 0x4f8c673e, 0x536c80f9, 0x920b1506, 0x380ec82d, 0x543d7b9f, 0xf083f018, 0x14c2cfa3, 0x210afb39, 0xa8b0f29e, 0x05e4d4d3, 0xd71075e9, 0x3dea1cfe, 0xa4be8b87, 0x7cdd2d6c, 0xac9ca3e3, 0xc3d2ba4a, +0x279385f1, 0xc16795ff, 0x037daa1b, 0x6e869c07, 0xca381780, 0x5688542a, 0xbf0f9726, 0x424a9b89, 0x9a293d62, 0x99549779, 0xeafa6917, 0xe06d6ec6, 0xb4501559, 0xfa14f7c9, 0xad54264d, 0x61f54f05, 0x3b736236, 0x711bd1db, 0x819821c3, 0x28e056f3, +0x74ff0508, 0xb996e9ee, 0x5740d184, 0xd5a55a5c, 0xbdbab893, 0xf61a8ed0, 0xb301ee3f, 0x48dd9c58, 0x0ebb56ac, 0x6288e51e, 0x08222864, 0x7e6802d9, 0xd9ab2345, 0xc6366e99, 0x3400b134, 0x4d39488b, 0x6dfb361c, 0xfd450caf, 0x47ae4f5a, 0xfc8d8901, +0xd2f4a13a, 0x7a4453a4, 0x5f62f9e0, 0x8050a46d, 0x51d9af4c, 0x377d1b2f, 0xd863a6eb, 0x7fa08777, 0xd33c2494, 0xeed6386a, 0x7939f9bf, 0x5c1f53fb, 0xb72dbf42, 0xe84f46a2, 0x85b470be, 0xec6317df, 0xbec71288, 0x4666caf4, 0xd6d8f047, 0x1e55c872, +0xa227f54f, 0xe73c95a0, 0xf7d20b7e, 0x90be3ab3, 0x24ee2fea, 0xf236dfad, 0xf3fe5a03, 0xa092dafa, 0x8c5edd74, 0x06997ec8, 0x491519f6, 0x09eaadca, 0x40ffb43c, 0xcd69ece6, 0x36b59e81, 0x3299cffc, 0x3c4a3ee9, 0x4d0da1dc, 0x38ab0d56, 0x0e9ec10a, +0xba169e17, 0xd4e46e27, 0xb332194c, 0xa86645f6, 0x76cc7385, 0xa173684c, 0x56685787, 0x15fb3751, 0x356eb9b2, 0x99d8651a, 0x6948b661, 0x3f20e1e6, 0xda7aaf2d, 0x722d403a, 0xc80a74cc, 0x3635cc5c, 0x07ba4651, 0x4e56d432, 0xfd55679f, 0x67d6776b, +0x5b9c4982, 0x360466bd, 0xe6013b25, 0xe18ad795, 0x1b545cba, 0x6306ee35, 0x97770ef1, 0x244517bd, 0x93a797af, 0x5659fd66, 0xfaef21ce, 0x23ff51ec, 0x318f8a0d, 0x44292687, 0x6a22696e, 0x90cd48a0, 0xdeaa3673, 0x2e0b4fe9, 0xa5a3f112, 0x7852b28f, +0x0eaf6beb, 0xf71b3fcb, 0x3bf078b8, 0xd4d5c4c6, 0x85367ff1, 0x0df41e05, 0x0a7ff2b5, 0xb058c643, 0x389aa7b7, 0xd0055d98, 0xef25bc7e, 0xfe3fb890, 0xf0a1799a, 0x4743f988, 0x44188c66, 0xc12ef397, 0x2e3ae508, 0x55028888, 0xe2d1a27b, 0x5bade363, +0x8507d510, 0xc5cfc028, 0xd36f8297, 0x51d211d6, 0xddf1439d, 0xc2442c98, 0x7cb38130, 0x633744d4, 0x64bca864, 0xe2e0089a, 0x4e677ed3, 0x29b109b8, 0xbec60749, 0xbef7ada8, 0x2980a359, 0xd35e2876, 0x1cdfb00a, 0x9ab2ba15, 0xf471e0c4, 0xa857ef17, +0xd7bf1bc9, 0x9e62234b, 0x2adbd6b7, 0x47725369, 0x69791c80, 0x606c313a, 0xa6f884fc, 0x035b75ee, 0x2d503a07, 0x9e5389aa, 0x88c261f4, 0x7b386d80, 0x866d0a1f, 0xec4f6371, 0x439360d6, 0x6d982f3f, 0x111a04ee, 0x7b09c761, 0x43a2ca37, 0x99e9cffb, +0x3bc1d259, 0xb94debf9, 0xcb510122, 0xc83bde2d, 0x183e83b5, 0x0dc5b4e4, 0xf985fec1, 0x90fce241, 0x51e3bb37, 0x721ceadb, 0x8f498d44, 0xb4885f1d, 0xccdaed92, 0xf3fa0c74, 0x12417100, 0x5f4cd0dc, 0x7c822bd1, 0xe1bb7d74, 0x355f1353, 0xfade8b2f, +0x078becb0, 0x32d4ffe3, 0x2aea7c56, 0xfd64cd7e, 0xd921dac3, 0xcb60abc3, 0x6ec35ad1, 0x55332269, 0xcf81987c, 0xb7e28012, 0x5f7d7a3d, 0xef14169f, 0xebc48fc1, 0xf9b45420, 0x9d08fc44, 0x49ec9263, 0x9d3956a5, 0xafdc03a7, 0x9746a410, 0xc5fe6ac9, +0x8c23524b, 0x1f84c5e4, 0x1fb56f05, 0xde9b9c92, 0xd78eb128, 0x04d0995e, 0xddc0e97c, 0x4d3c0b3d, 0x00000000, 0x8c12f8aa, 0x0031aae1, 0x272fc8b2, 0x81d74c4e, 0xf3cba695, 0xc2758679, 0xa219b743, 0x4ab7e78d, 0xebf52520, 0xd034f779, 0x16a042bf, +0x20a42402, 0x5c260fd3, 0x2474bd5c, 0xab3d3018, 0x1691e85e, 0x5c17a532, 0x49dd3882, 0xc6a51f27, 0xa6c92e1d, 0xd9107022, 0x40c81538, 0x23cefb0d, 0xf090d37b, 0xac877649, 0xc694b5c6, 0x7fd95e3f, 0xafeda946, 0x036adf0f, 0x40f9bfd9, 0x865ca0fe, +0x648d0285, 0x605d9bdb, 0x4a864d6c, 0x8b99141a, 0x717635d4, 0x3f114b07, 0x67e7dd8a, 0x6a13c38f, 0x58f6968d, 0x15ca9db0, 0x828c39a0, 0x6ef2f030, 0x7863186e, 0x76fdd964, 0xe8ae50ce, 0xb7d32af3, 0x180f2954, 0x31be20ec, 0x82bd9341, 0xcfb0329d, +0xab0c9af9, 0xbd9d72a7, 0xc11f5976, 0x71479f35, 0xe56be42a, 0xa2281da2, 0xe89ffa2f, 0x93963d4e, 0xacb6dca8, 0x0924875b, 0x04e133bf, 0x7597066b, 0x942c7b1f, 0xa142c2ad, 0xb0696ca2, 0x271e6253, 0x9a8310f4, 0x8ba8befb, 0x32e55502, 0xb97c4118, +0x7fe8f4de, 0xe55a4ecb, 0x58c73c6c, 0x1b65f65b, 0xec7ec990, 0xf4404a25, 0x88f3cb15, 0xba2734f6, 0x09152dba, 0x52896438, 0x112bae0f, 0xcceb4773, 0x75a6ac8a, 0x20958ee3, 0x1270dbe1, 0x8f7827a5, 0x6da985de, 0x81e6e6af, 0xfe0e1271, 0x0a4e5854, +0xa5925bf3, 0x52b8ced9, 0x1cee1aeb, 0x3c7b9408, 0xe63091c4, 0x2d6190e6, 0xda4b05cc, 0xf72a952a, 0xb4b9f5fc, 0x941dd1fe, 0xb303b3ad, 0xbdacd846, 0x188b7e5e, 0x402d83f4, 0x12bde8db, 0x0d4bac0d, 0xde583433, 0x6028bd49, 0xd6b8c769, 0x2a33a838, +0x7043304d, 0xb6907a20, 0x2f98f76f, 0x4d19345c, 0x1f895f73, 0x3011a81c, 0x77411160, 0x50460ef0, 0x3f8c61ce, 0x38f15b46, 0xcce5dce8, 0x1a220024, 0x6a613069, 0x6fca6f3e, 0xce33b937, 0x6583e21e, 0x1ff644d6, 0x81fce8b4, 0xc1d16b40, 0x7fdef99f, +0x4750b97c, 0x8cb744b9, 0xf1c0c35c, 0x4a640ed4, 0xe6d674d0, 0xd95a151e, 0x7fa1e23a, 0xeb9dd8dd, 0x25d17a4f, 0x7a0abd6d, 0x759774bf, 0x6d631144, 0xbba4cd88, 0x94432142, 0xd9250ebb, 0xbcd9f700, 0x6a1e2bcc, 0x78dcd8b2, 0x0d34b7a8, 0x6d1c0ae1, +0x8183f311, 0xf1bfd8f9, 0x8681d23c, 0x1a5d1b81, 0xb6ef6185, 0xee36878a, 0x72955592, 0x289ad642, 0x37138931, 0x0a498d20, 0x4284fd8e, 0xcb98e660, 0x9e75b7c7, 0x9ca3d218, 0xc94e83bf, 0x8457b7e3, 0x835596ce, 0x8e612166, 0x91e87e15, 0xae1b047e, +0xa32fb3d6, 0x388e40e3, 0x86fec999, 0xec9ff9f0, 0xdcf14a49, 0x6fb5749b, 0xd36c839b, 0x50391555, 0xd411b913, 0xb90db3f2, 0x089fe8ff, 0x8bb56594, 0xf6bdf9d4, 0x05d444f2, 0x4fcf5183, 0x58a6fdaa, 0x8cc85f1c, 0xd1bae644, 0x077d3a88, 0x48b26b0b, +0x0a369685, 0xd6c7dccc, 0x65fcf9bb, 0xd313983e, 0x32b8d666, 0xc1ae70e5, 0x1d202109, 0x9bdee890, 0xa9663ef6, 0x42fbe62b, 0x7d089c40, 0x919765b0, 0x1d5f3aac, 0x40529851, 0x52906b2f, 0x891c1bee, 0x8963004b, 0x9341006f, 0xabcf408c, 0xb4461fff, +0xf95f2ba3, 0x2a4cb39d, 0x55ed51a7, 0x45f9c706, 0x007f1ba5, 0xfc8b6f51, 0xa1f9d609, 0x306eb3b9, 0x3d251fb4, 0x99088d4f, 0x101496a1, 0xe94bbd02, 0xe37d2b87, 0xc6ac51c8, 0x0702212d, 0xcbe7fdc5, 0x2d4e92b0, 0x675587c1, 0xb972a857, 0xbe70897a, +0x18f465fb, 0x20053ebd, 0xee499c2f, 0x933e1bca, 0x672a9c64, 0xa452895e, 0xe400110f, 0x02a97e7a, 0xa9192553, 0x68c84e13, 0xabb05b29, 0xc378153a, 0x0f9dc9d2, 0xebe2c378, 0x12c2f37e, 0x207a2518, 0xce4ca292, 0x1716b78c, 0x35baf74b, 0xfb894e7c, +0x3a273e99, 0x7d7787e5, 0x0fe2d277, 0x3ff37a6b, 0x2fe7ecca, 0xa684ec81, 0x68b755b6, 0xdc8e51ec, 0x5d72b958, 0xe6a96f75, 0xd46ea2b6, 0x106b8d04, 0x15c0d253, 0x7a75a6c8, 0x9ba1f335, 0xf46b9c0b, 0x4a1b1571, 0x2d318915, 0xa186cdac, 0x5fa4dc87, +0xe934a6a7, 0xc47a3417, 0xaccd61a1, 0xf9203006, 0xdb8c70c1, 0xb33b2577, 0x32c7cdc3, 0x832a8d6b, 0x376c9294, 0xc931981a, 0x9e0aac62, 0xa42d92fb, 0xd1c5fde1, 0xe1ab4e58, 0x997796ea, 0xb1925b0d, 0x4586dca3, 0x8e1e3ac3, 0x9cdcc9bd, 0x6057a6ec, +0x57442fdd, 0x22ac40c7, 0x52ef708a, 0xfcf474f4, 0xde272f96, 0x48cd70ae, 0x4d662ff9, 0xcc9ac74d, 0xf6c2e271, 0xbe0f92df, 0x72ea4e37, 0x3d5a0411, 0x35c5ecee, 0x9695449d, 0xe3023022, 0xb1ed40a8, 0xfe22112b, 0xbca6eca5, 0x8bca7e31, 0x05ab5f57, +0xe1d455fd, 0x25ae61ea, 0x3a58253c, 0x773e0ac5, 0xe47f0aaa, 0x943c3ae7, 0x472fa2d9, 0x55924a02, 0x75e86f1a, 0x96ea5f38, 0x5fdbc722, 0x4fb04a26, 0xdbf36b64, 0x1769ac29, 0x703c2be8, 0x5a709875, 0xacb27a04, 0x5a0f83d0, 0x58d9e60f, 0x08e0f35a, +0x27071f90, 0xa350a873, 0xb439045a, 0xfe5d0a8e, 0x00000000, 0xae641fdb, 0x02d665df, 0xfbf655d9, 0x22d35b62, 0x62fed896, 0xece0e255, 0x78a3c317, 0x15bfc9f6, 0xc3070e9f, 0xa6fbf724, 0xbbdbd62d, 0x6281c333, 0xb3443ed2, 0x28e5cde7, 0x8428ac46, +0x27780435, 0xf316a683, 0xc4052fb2, 0x5d0da2fd, 0xc6d34a6d, 0xf41487ae, 0x573b3478, 0xf369bd26, 0x805286c2, 0xbb9f235c, 0xf8c8d6b7, 0xef8d56f1, 0x55afe97a, 0x9992449d, 0x71cd2eec, 0x7c5d9554, 0x5cf897e3, 0x26caa2e0, 0xb2c85dc5, 0xf19fa82e, +0x761f126c, 0x0e854219, 0xdb782da1, 0xe3a0719e, 0x7f486cf5, 0xe767b4bf, 0xb06038b3, 0x57078c0c, 0xc4d74fa9, 0x8dc23d7a, 0xb375c112, 0x4485c96b, 0xfdb28f41, 0x5b2aab63, 0x07d23c80, 0x09577e99, 0x3c1f991e, 0x6b181512, 0x56ba10db, 0xcf285446, +0xa81d663b, 0x615a922a, 0xd22f5338, 0x6688aeaa, 0x1b68a729, 0x9402ff25, 0x9178a6d3, 0xab089f9a, 0x624f6b8b, 0x066fa057, 0x02a86576, 0x74b7771a, 0xfbdd2f16, 0xdcaa1121, 0x583f52c2, 0x9d5581bc, 0x5d450b34, 0x123fd9b0, 0xeaf70f07, 0x3eb7fc68, +0xaab5034d, 0x527dd5fa, 0xe85f6a71, 0x6aa589c5, 0xf64d94ae, 0x4bbd17a5, 0x88b8648c, 0x2ae7858f, 0x6cca2992, 0x50d5b08c, 0xfea776e0, 0x8528df34, 0x8f6a580c, 0x9ce81d6b, 0x9a87bd3c, 0xe6da2868, 0xb51a6145, 0x3965c0e8, 0x1ad53bfe, 0x1097bcc6, +0xc3057329, 0xd13aaa99, 0x69b07064, 0x5fed6e42, 0x491572d3, 0x4c6f2b25, 0x6735327d, 0xcbef9167, 0xad673fcd, 0x83477f63, 0x13824567, 0x82fae3b4, 0x7b8fa9d4, 0x96aa9a53, 0xf4e5f1d8, 0x8a1001fa, 0x20a502b7, 0xbc4d1fdc, 0x365d1e26, 0x8c7fa1ad, +0xe5cfd1c9, 0x5982ce15, 0xca520db0, 0x2c8825d8, 0x01bd9cd7, 0x7070b23b, 0x0d90bbb8, 0x4a008b72, 0xdd178df6, 0x3548e787, 0x04c7c521, 0x6fdfd033, 0xe9e2f6a6, 0x48a8ee04, 0xa4304154, 0xcc3dade7, 0xb60f98e4, 0x4dd2b7f2, 0xc56ad37e, 0x2f9ddc79, +0x00000000, 0x25df5b41, 0xd087364e, 0xee30ca26, 0x8bad9d2d, 0xa9a0faec, 0xc8fa68c6, 0x9b3a21eb, 0xf5586d0f, 0x0f38dece, 0xdfbfe880, 0x9e40781d, 0x1e12fedf, 0x2e2040ae, 0x17458046, 0x6420cbdc, 0xb88adafd, 0xba22bf8b, 0x982fd84a, 0xc1ad165f, +0x789a5075, 0xae72c66c, 0xa0f78475, 0x73654b9a, 0xfc0f1396, 0xa6982422, 0x93d0c3a5, 0x2d35b90f, 0x284fe0f9, 0xa25fe103, 0x4357f5eb, 0xf337cd58, 0x057a59f6, 0xd86dd400, 0x9ffde4ca, 0x29f27c2e, 0xa725b8f5, 0x38d85c3f, 0x40420c4a, 0x5e50f295, +0xe21ded49, 0x220d67c1, 0xacdaa31a, 0x145079e7, 0x3f0a60bf, 0x7927cca2, 0xa14a18a2, 0x15ede530, 0x7de00983, 0x51682c5b, 0xed253387, 0xc947f411, 0x1d07077e, 0xcd803130, 0x19c0c25f, 0x3032be71, 0xa58ddd83, 0xbf58e67d, 0xe0b5883f, 0x329adb07, +0xc7c2b608, 0x187d5e88, 0xd5fd6fb8, 0xdac5b176, 0xd392cfef, 0x53c0492d, 0x659d570b, 0x8905f85b, 0x37e082f1, 0x849543e3, 0x0bff1bef, 0x72d8d74d, 0x863d2695, 0x7a323503, 0xde027457, 0x926d5f72, 0xce95c891, 0x541275ad, 0x90c53a04, 0x6d77b545, +0x4ec74e53, 0xbee57aaa, 0xec98af50, 0x2b5a1958, 0xf7f00879, 0x8780ba42, 0x680decb3, 0x97170684, 0xfa60b3c1, 0x95bf63f2, 0xf9754a60, 0xc0108a88, 0xb1dda464, 0xe4724d1e, 0x5a9737b4, 0xa3e27dd4, 0xf02234f9, 0xbdf0830b, 0x34f57b50, 0x41ff909d, +0x6e624ce4, 0x1cba9ba9, 0x81ef1a15, 0xeb4a93d0, 0x750aebcd, 0x7ef5f022, 0xd9d048d7, 0x3a703949, 0x318f22a6, 0xb937462a, 0xff1aea37, 0xd7550ace, 0x0c2d276f, 0xc2b8effe, 0x453855bc, 0xd6e89619, 0x4f7ad284, 0x23b0fb16, 0x0315f9a1, 0x462dac1d, +0x1faf6208, 0xb4a7fd92, 0xe10814e8, 0x27773e37, 0x332747d0, 0x479030ca, 0x63f2f75c, 0x42ea693c, 0x3bcda59e, 0x16f81c91, 0xafcf5abb, 0x08eae24e, 0x21189e60, 0x0a428738, 0xd440f36f, 0xb7b20433, 0x60e70efd, 0xf28a518f, 0x112a2011, 0xc67f2adf, +0x77a28ebb, 0x3da205c9, 0x8ed7c4db, 0x2462c796, 0xf72a7228, 0x6b718bbe, 0x06211aa6, 0x4584d84b, 0x8111863a, 0xc46e4ad9, 0x43a5c2ed, 0x5835b34f, 0x576a5383, 0x76c0e0ba, 0x70139f55, 0x886f7c50, 0x0f56912d, 0x6d509118, 0xc4673b38, 0xa93edbc1, +0xb486c124, 0x583cc2ae, 0xf87ce305, 0x93f67c13, 0x58c7d606, 0x35652257, 0x8739ed7d, 0xd9243575, 0xcbcabebd, 0xa6613b0d, 0xcd19c152, 0xf10b688e, 0x62060035, 0xafe4d5cf, 0xcdeba41b, 0x952c721d, 0xf887f7ad, 0x2ef553f5, 0x1db16b04, 0x579836ca, +0x64d57fda, 0x8e471717, 0x121cee81, 0xf1f07c26, 0x81e3e373, 0x06286b47, 0xc2b444d7, 0xa04021ab, 0x58cea7e7, 0x143485c6, 0x62f4657c, 0x1d430e4d, 0x14c6e08f, 0xec4866c3, 0x57632262, 0x334438f1, 0xdf052fd3, 0x2e0736bc, 0x701aeeb4, 0xe3ec92a7, +0x4a295dce, 0xe317860f, 0x514238c4, 0x4cf353c0, 0x5791472b, 0x4576bd02, 0x1d4a7fac, 0xaf16b086, 0x6b8a9f16, 0xcb31aa15, 0xd92d4494, 0xa0b244e2, 0x3ac8a7d2, 0x3ce9bd74, 0x7fb76b31, 0x12e7fa29, 0x8ebc03bf, 0x93ff0df2, 0x87309c9c, 0xe31ef7ee, +0xd689b0f0, 0x9a888679, 0x12159f60, 0xd680c111, 0xa049504a, 0x000971e1, 0x0985eec2, 0x87c2f9d5, 0xd0a8aa56, 0x889d1919, 0xdffe3b7b, 0x09778b8b, 0xb25ccf2a, 0x952503fc, 0x1b990043, 0xf1f90dc7, 0x796d653f, 0x098c9f23, 0x2779ccd6, 0xe53fed48, +0x6d59e0f9, 0x51b92c6c, 0xdff74a9a, 0x458da9aa, 0xfe5df9a3, 0xe3e5e346, 0x9ca99cdf, 0x763285f3, 0x28d44953, 0x8e4e66f6, 0xdf0c5e32, 0x3a33b37a, 0xf7d16680, 0x6b83eef7, 0x4ad24966, 0x79967197, 0x4cfa2221, 0x12ee8bc8, 0xbd032fe6, 0x097efa6a, +0xf87592e4, 0xc2bd3536, 0xb255becb, 0xf102196f, 0x0f5fe0cc, 0xb474a46d, 0x6da2f451, 0x6dab85b0, 0x642e6b72, 0x2782d87e, 0xa6684aec, 0x620f71d4, 0x3a3ac29b, 0x4357a7a4, 0xea697c65, 0x3597471e, 0x9a81f798, 0x282f5dfb, 0xfea6ed0b, 0x7f4c7f99, +0x00f26549, 0x1b9071a2, 0x1db81ae5, 0xfeaf9cea, 0xd9d6503c, 0xe5cd8801, 0x5e14a9e9, 0x2770bd37, 0xe5c4f9e0, 0xc4955e71, 0xbb223540, 0x9c528877, 0xc49c2f90, 0x2151a791, 0x81ea9292, 0x1b6214eb, 0x4c084768, 0x06da0e0e, 0x95de1754, 0xa0bb3503, +0x514b4925, 0x8118f7db, 0x3c1bd83d, 0x0fad8585, 0xc246219e, 0xcde2d5fa, 0x2158d670, 0x5ee6cca0, 0xbd0a5e07, 0xb48fb0c5, 0x70e88bfd, 0x00fb14a8, 0x70e1fa1c, 0x435ed645, 0xf7d81761, 0x457fcce3, 0x8eb5725e, 0x21aab339, 0xd67bd5b9, 0xf88e864c, +0xea600d84, 0xd053befe, 0xcbc3cf5c, 0x28dd38b2, 0x1b6b650a, 0x9a7ae330, 0x3ce0cc95, 0xa9ccbe88, 0x2e0e475d, 0xa6935e44, 0xf72303c9, 0xd0a1dbb7, 0x00000000, 0xbdf14aaf, 0xa69a2fa5, 0x88660db1, 0x9a7392d1, 0x14cf916e, 0xcb38dbf4, 0x5e1dd808, +0xbdf83b4e, 0x7f450e78, 0x359e36ff, 0xecb3726b, 0x9c5bf996, 0x9ca0ed3e, 0xaf1fc167, 0x796414de, 0x43acb30c, 0x143df427, 0xcd10b0b3, 0x06d37fef, 0x62fd149d, 0xb2a7db82, 0x5eefbd41, 0xc24f507f, 0xb47dd58c, 0x889468f8, 0x356c53b6, 0x21a3c2d8, +0xafeda42e, 0x95d766b5, 0xbb2b44a1, 0xec411722, 0xbbd05009, 0xa9c5cf69, 0x799f0076, 0xd05acf1f, 0x0fa4f464, 0xfe548842, 0x4a202c2f, 0x6b78fa5f, 0x9304195a, 0xbbd921e8, 0x4c013689, 0xd672a458, 0x930d68bb, 0x4adb3887, 0x33b65db8, 0xea9268cd, +0x28262c1a, 0x51b05d8d, 0xea9b192c, 0x64dc0e3b, 0x87cb8834, 0xe5369ca9, 0x76c9915b, 0x3ac1d633, 0xd9df21dd, 0x763bf412, 0xecba038a, 0x278ba99f, 0x64271a93, 0xa937aa20, 0x33bf2c59, 0x3c12a9dc, 0x334d4910, 0xb2aeaa63, 0x7fbe1ad0, 0x2efc2214, +0xa37725b3, 0x0e939d14, 0xa5f041a2, 0x12a97e33, 0xe5659adc, 0x4ad7600f, 0x15b5299b, 0x53a796f4, 0xe115a9dc, 0x4444fd1b, 0xe343eba8, 0x5ef97a2d, 0x457edbc7, 0x5f624994, 0x0cc5df60, 0x00000000, 0x1d00c5fb, 0xe4fea965, 0xb7f82af4, 0x491a11c2, +0xf8c44a42, 0x43f9bfd6, 0xb38819f4, 0xf4019522, 0x0a42bb71, 0xbc80b759, 0xb3290c91, 0xffd81dea, 0x06876411, 0xa0ba547e, 0xa01b411b, 0xb8f08459, 0x10ff3c47, 0xf14b80fe, 0xb4944e5c, 0xec4b4505, 0xef8634c8, 0xbed6f52d, 0x58df0b59, 0x08b5ec60, +0xe609fe74, 0xeb5712ad, 0x41affda2, 0x092edfd9, 0x42c3990a, 0xb2132a4d, 0xfa331d53, 0x5fc35cf1, 0x49bb04a7, 0xae88dc0f, 0x0f08aead, 0x0b789dad, 0xbd1b84e0, 0x03cd71cd, 0xe792cdcd, 0xed7163d9, 0xbfecd3f1, 0xae29c96a, 0xab63dcb6, 0x44e5e87e, +0xe1b4bcb9, 0x59e52d85, 0x506ae739, 0xe279cd74, 0xf3bcd7ef, 0xfa920836, 0xa8aead7b, 0x07bd42cd, 0x1970f6fb, 0x53068391, 0xbe77e048, 0x5e586f48, 0x0e328871, 0x4cf1117b, 0x1da1d09e, 0xeebc1214, 0x1a1c9253, 0xf9fe6c9e, 0x0ae3ae14, 0x0814f905, +0xe89a6360, 0x0c64ca05, 0x472899b3, 0xfee23b36, 0x1c9bf642, 0xb50f7de5, 0x098fcabc, 0xaaf8ef0f, 0x564c964d, 0xf0d0b347, 0xf4a08047, 0x16d94d33, 0x16785856, 0xea6d3471, 0xa70716b3, 0x5bb36ff1, 0xf53bb3fe, 0xa12167c7, 0xb6c20c28, 0xaf13efb6, +0x1c3ae327, 0xb17f4ee5, 0x019b33b9, 0xf76df18a, 0xabc2c9d3, 0x4d6a22c2, 0x5776b091, 0x5c0e2d3c, 0x19d1e39e, 0x4095db7e, 0x594438e0, 0xb5ae6880, 0xe5c48fb9, 0xf657d756, 0xad45adc2, 0xa9948ba7, 0xef2721ad, 0xf59aa69b, 0x013a26dc, 0xb0e47d5c, +0xb851913c, 0x18ebc542, 0x541ad439, 0xacde9e7b, 0xfd8e5f9e, 0xf31dc28a, 0xe9a045bc, 0xf7cce4ef, 0xb4355b39, 0x5a89492d, 0x17e36bef, 0x11640ffe, 0xe90150d9, 0x071c57a8, 0xe2d8d811, 0x1ff792ea, 0xf1ea959b, 0xe3e2fecd, 0x11c51a9b, 0xb0456839, +0xa4ca677e, 0xeacc2114, 0xb663194d, 0x1e6ca153, 0xa24d036f, 0x12086b56, 0xa63d306f, 0xbaa6c62d, 0xb9caa285, 0x50cbf25c, 0xfc156c27, 0xaa59fa6a, 0x1ecdb436, 0x0dfff9bc, 0x054a15dc, 0x02f75711, 0x56ed8328, 0x13324d8a, 0x5581e780, 0x184ad027, +0xee1d0771, 0x42628c6f, 0x5caf3859, 0x0fa9bbc8, 0xa69c250a, 0x4358aab3, 0x0d5eecd9, 0xa46b721b, 0x410ee8c7, 0x4f3c60b6, 0xa7a603d6, 0xb2b23f28, 0xafb2fad3, 0x0bd988c8, 0xe02f8f00, 0x57d7a5f4, 0xf286f133, 0xb96bb7e0, 0x54bbc15c, 0xf8655f27, +0xe08e9a65, 0x4bed46d3, 0x4c50041e, 0x4612bf6f, 0xf95f79fb, 0xbb3df594, 0x46b3aa0a, 0xe6a8eb11, 0xa18072a2, 0xf071a622, 0xedd076bc, 0xba07d348, 0xbf4dc694, 0x4820371e, 0x142e1a22, 0x4dcb37a7, 0xfd2f4afb, 0xf227e456, 0xb1de5b80, 0xfe432e53, +0x15143cfe, 0xa9359ec2, 0x4b4c53b6, 0x06267174, 0xebf607c8, 0x1b87a1ea, 0xa55154c7, 0x529db028, 0x4ea7530f, 0x5b127a94, 0x1b26b48f, 0x51f1d480, 0x02564274, 0xe83b7605, 0x5520f2e5, 0xfb093b8f, 0xb7593f91, 0xa3d630d6, 0x4034ce1b, 0x1f56878f, +0xfcb47942, 0x4881227b, 0x105e2922, 0x00a11565, 0xbb9ce0f1, 0x47898cd6, 0xbc21a23c, 0xa2ec160a, 0x036c64a8, 0xe733d8a8, 0xbdba9185, 0x5d340be0, 0x05eb00b9, 0x17427e8a, 0x139358ef, 0x4e06466a, 0x148f0f47, 0x5d951e85, 0xfba82eea, 0x04703300, +0x5a285c48, 0x1abd8736, 0x4a76756a, 0xac7f8b1e, 0xa80fb81e, 0x45dfcea2, 0xf6f6c233, 0x4f9d75d3, 0xade4b8a7, 0xff79088f, 0x523ca54d, 0x04d12665, 0x587e1e3c, 0xecea5060, 0x5150c1e5, 0xe45fbc00, 0x7af2a38a, 0xbb854505, 0x9a993907, 0xcb854f52, +0x600d18fe, 0xa9dcfc74, 0xd6e82759, 0x865f26f1, 0x0792d37f, 0x70000a57, 0xe23f3155, 0xf0668824, 0x2a45a222, 0xaa232051, 0x11a66554, 0xf3995401, 0xc177e68f, 0x5e28a72f, 0x75c672f0, 0xeb3244ad, 0x646017a4, 0x5beedf88, 0x1b54cc89, 0x3be3c776, +0x9ef4365d, 0x4be3cd21, 0xfcad857b, 0xf7f45b5b, 0x22e3a027, 0x1affbb74, 0x50b701a8, 0x7e9facd0, 0x746d050d, 0x0639a482, 0xafe558f6, 0x6d6d625c, 0x69006d06, 0xfb3f5604, 0xe5ade22a, 0x4a48badc, 0xbe433da2, 0x7d6070f5, 0xfd06f286, 0xbfe84a5f, +0xd4bc8c81, 0x59ba7450, 0x03ffdc25, 0x0e9fa687, 0xe40695d7, 0x9d0bea78, 0x87f4510c, 0x30ba1956, 0x0d607aa2, 0xc6e535f0, 0x9b324efa, 0x98cd92df, 0xe6523e0f, 0x3728ca29, 0x3c711409, 0x42eeb8d9, 0x68ab1afb, 0x568ea52a, 0x8a942bae, 0x5a45a875, +0x090d75f8, 0xff52595e, 0x179fc1d6, 0xe39446a8, 0xf96bfddc, 0x94069f80, 0x1634b62b, 0x2c7c06a0, 0xb51ae382, 0xa4bc86d6, 0xc2883aaa, 0x790d7faf, 0x2e28ad78, 0xe06b9a8d, 0x1d6d680b, 0x24da04a5, 0x5725d2d7, 0xef5f4bf7, 0xb6e53fa7, 0x3dda63f4, +0xb74e485a, 0x01ab77fd, 0xf8c08a21, 0x5571790f, 0x18ab10ac, 0xe8cd9888, 0x6259b326, 0x6b54c6de, 0xa0d1898c, 0xea993350, 0x05c678a7, 0x78a60852, 0xae4e2f0b, 0xc4b19e28, 0x896bf78b, 0xd32e5ffe, 0x481c1104, 0x97f943a5, 0x0ccb0d5f, 0x31116eab, +0x411164fc, 0xa8778b89, 0xeef43c0a, 0xc74e420d, 0x511c7655, 0x1f39c3d3, 0x88c08076, 0x19006751, 0x3a48b08b, 0x32eeb28e, 0xb177ecd8, 0x2beed5df, 0x906b90da, 0x4c711e5e, 0xd517fb7c, 0x3f8ec82c, 0xba2e32f8, 0x0f34d17a, 0x5dd77b0a, 0xd17af426, +0x7254a18f, 0x93944cff, 0x2725d880, 0x81cdf58e, 0x9966e522, 0x5348dd8d, 0xe1c0ed70, 0x5c7c0cf7, 0x6e92be79, 0x1259b971, 0xe966ef75, 0x2f83da85, 0x15cb6a0e, 0xcc179c2d, 0xc51ae9d5, 0x4683b783, 0xdb885dfb, 0x8cad8f2c, 0x4728c07e, 0x25717358, +0x71ab7daa, 0xed0be02f, 0xca2e38af, 0xfef92ea3, 0x1cc61ff6, 0x95ade87d, 0x85a0fad4, 0xce4337f5, 0x1e92b42e, 0x4dda69a3, 0x83995e56, 0x7ccb0708, 0xb9d1eedd, 0xf40b877e, 0x3683bdd4, 0x6affb123, 0x13f2ce8c, 0xc9d1e48a, 0x679fcb81, 0x3e25bfd1, +0xb87a9920, 0x6634bc7c, 0x44d71c5b, 0x7792d928, 0xcdbcebd0, 0xc87a9377, 0x52e3aa70, 0x840b8d29, 0x8b3f5c53, 0x9f5f41a0, 0xa7435af3, 0x8f525309, 0x00000000, 0x49b766f9, 0xdfe552a1, 0x6cc615a1, 0xddb1f979, 0x357c61f1, 0xc0dc9172, 0xf23223fc, +0x96523458, 0x91c0e727, 0x4e25b586, 0xa517f12b, 0xadb1f32e, 0x9ca09d85, 0x8ef924f4, 0xa2852254, 0x08a60205, 0xeca097d2, 0xf1cdffd9, 0x7f34db2d, 0x80668273, 0x046d0f5a, 0xda232a06, 0xbdbce187, 0xa32e55a9, 0xac1a84d3, 0xcfe84008, 0xd2852803, +0x7b59d477, 0x823229ab, 0x0af2a9dd, 0x0b59de20, 0x581103ad, 0x4f8ec27b, 0x39b76cae, 0x7639aed5, 0xb4b1947f, 0x6f39c984, 0xdc1a8e84, 0xbc17967a, 0xa6e82d0e, 0x0254abd8, 0xa17afe71, 0x2348d7da, 0x457c6ba6, 0x3345c573, 0x65cb6059, 0x61a66f03, +0x268eaf7d, 0xf5a0f083, 0x29ba7e07, 0x54da0ef2, 0xfa9421f9, 0x63f2c4db, 0x34d7160c, 0xc3234d57, 0x100d12a9, 0xb28830fd, 0xf65f2ca6, 0x8d06f8d1, 0x14601df3, 0xab8857ac, 0xe7f949f2, 0x40ba1301, 0xb0dc9b25, 0xd9dcf623, 0x281109fa, 0xb3234700, +0xd0d183db, 0x211c7c02, 0xde4e255c, 0x20b70bff, 0x73ffd672, 0x2dd7715d, 0x381c1b53, 0xd87781de, 0x923f3b02, 0xd74350a4, 0x4345cf24, 0x5f83d0d2, 0xa58b470a, 0x663c0a42, 0x45e19b59, 0x6cb36ee4, 0xeae6d40c, 0x19a57aca, 0x9761398d, 0x6cb0021d, +0xd5448f8e, 0x696ab24e, 0x663f66bb, 0x1bbbe7c3, 0x7a40ac22, 0x47ff0650, 0xb9f48d93, 0xb6a15966, 0x510cc496, 0x2e95b41e, 0x16f0ae3f, 0x0f56b80c, 0xd75a1287, 0xe2772da3, 0xc93829ee, 0xe069b0aa, 0x3733a22d, 0xaade93ff, 0xe06adc53, 0x9834ed78, +0x77088927, 0x9a291c88, 0x63e5d6e8, 0xd280a2d4, 0xb4bfc46f, 0xd7597e7e, 0x0d4b49fc, 0xf6991e95, 0x6eae9f14, 0x819197b2, 0xbbe97c63, 0xfbd13b90, 0x403847f3, 0xa5882bf3, 0xe5b06c00, 0xcb26b4e7, 0xe7aef109, 0x4ab44fac, 0x9ff0c022, 0xf484ef65, +0xbbea109a, 0x8b1d9fed, 0xe8f84905, 0xda123782, 0xddd57621, 0x1e615790, 0x63e6ba11, 0x7f997088, 0x90a6782e, 0x0f55d4f5, 0x3fa25b82, 0x132a1e6c, 0x241ad0b8, 0xa8c00ef6, 0xef3f08a6, 0x6eadf3ed, 0x386676d8, 0x26044db1, 0xa24f6a50, 0x838f0abb, +0x19a61633, 0x9ff3acdb, 0x9dee5d2b, 0x2b4c68b4, 0x510fa86f, 0x844b27e1, 0x07c42d5a, 0x00000000, 0xc1aabcb8, 0xb9f7e16a, 0x599d3d39, 0x89006e1d, 0x8192fb4b, 0xd547e377, 0xaaddff06, 0x8656d611, 0x5c478d6a, 0x352d3f24, 0x53113566, 0xb37885cc, +0x84484b18, 0x8cdade4e, 0x6969deb7, 0xc1a9d041, 0x838c6642, 0x38651a21, 0x4f6effff, 0x0891f9af, 0x5e591063, 0xa0529ba0, 0xe8fb25fc, 0xfe08e73a, 0xb37be935, 0x97625574, 0x23defde2, 0xcb25d81e, 0x3dbfaa72, 0xa796b6fa, 0xfc167a33, 0x61f82718, +0x48a9be5c, 0x4226dafa, 0x4d7062f6, 0xf343aec6, 0x352e53dd, 0x957cc87d, 0x45e2f7a0, 0x23dd911b, 0x56cb8535, 0xf69a726c, 0x92b8e527, 0x6b742f47, 0x2419bc41, 0x00036cf9, 0x16f3c2c6, 0xb165743c, 0x48aad2a5, 0x13297295, 0x021df1f0, 0x5c44e193, +0x751578d7, 0xe7ad9df0, 0x32ea7e87, 0x05dab053, 0xad19d25c, 0x5b80ccc9, 0xaf0423ac, 0xaf074f55, 0xa795da03, 0xd80fc672, 0x785d5dd2, 0x6b7743be, 0x47fc6aa9, 0x9a2a7071, 0x2b4f044d, 0x61fb4be1, 0x98378181, 0x32e9127e, 0x07c741a3, 0x14ee3336, +0xdfc887d1, 0x7d87ed81, 0x3dbcc68b, 0x1bb88b3a, 0x785e312b, 0xbe33cc30, 0x56c8e9cc, 0xe5b300f9, 0xb6a2359f, 0xfc1516ca, 0x403b2b0a, 0xc4700ceb, 0x70cfc884, 0xa051f759, 0xd09d5324, 0x1c7ca660, 0xb16618c5, 0x2c8b2917, 0xddd61ad8, 0x14ed5fcf, +0x4ab72355, 0xf9cfa699, 0xf15d33cf, 0xf9ccca60, 0xf487839c, 0xdfcbeb28, 0xc3b421b1, 0x3a7b8728, 0x72d23974, 0xb4bca896, 0xfbd25769, 0x3730ced4, 0x957fa484, 0x30f78f77, 0xc3b74d48, 0x8b1ef314, 0x0d482505, 0x2e96d8e7, 0xfe0b8bc3, 0xd09e3fdd, +0x8655bae8, 0xed22f956, 0x8ec44347, 0x1c7fca99, 0xda115b7b, 0x890302e4, 0x54d674c5, 0x21c30c12, 0xc66dfd1b, 0x70cca47d, 0x3a78ebd1, 0xbe30a0c9, 0x7516142e, 0x4f6d9306, 0x5e5a7c9a, 0x2c8845ee, 0x72d1558d, 0xbc2e3dc0, 0x5b83a030, 0x3fa1377b, +0x29519944, 0xf340c23f, 0x9ded31d2, 0xeae5b8f5, 0xf15e5f36, 0xceff684d, 0x08929556, 0x599e51c0, 0x92bb89de, 0x26072148, 0xe274415a, 0x4d730e0f, 0xc93b4517, 0xef3c645f, 0x11348365, 0x7d848178, 0xed2195af, 0x30f4e38e, 0x0a8f64a6, 0x90a514d7, +0x5312599f, 0xd80caa8b, 0x1137ef9c, 0x770be5de, 0x1e623b69, 0x8ec72fbe, 0x2952f5bd, 0x7a43c0db, 0xa8c3620f, 0xd283ce2d, 0x05d9dcaa, 0x4225b603, 0xcce1f544, 0xcefc04b4, 0xa24c06a9, 0x21c060eb, 0x021e9d09, 0xcce299bd, 0x0a8c085f, 0x6421fbb2, +0x6422974b, 0x7f9a1c71, 0xc66e91e2, 0xbc2d5139, 0x8cd9b2b7, 0x54d5183c, 0xc4736012, 0xad1abea5, 0xac373256, 0x068db1ee, 0x6fe05a6a, 0x49b5bc79, 0x4b4be816, 0x260e77ac, 0x12ea83af, 0x2392520b, 0xd277ee65, 0x4d9dc847, 0x326945ed, 0xb80b91a8, +0x7e1b4d8c, 0x9a2d923a, 0x8e1131c4, 0x98d3c655, 0x15d363d8, 0x6b93bfeb, 0x9fb1b79d, 0xaae11207, 0x7d51487a, 0xe7274bff, 0xd4a1ce34, 0x5f2cda57, 0xc4b519f4, 0x3232d452, 0x59a16bb9, 0xd1667a2c, 0x7a3339b2, 0x889c802a, 0xa9ab17f1, 0xe1f16bae, +0x8e4aa07b, 0xbe862046, 0xf59659ef, 0xc64b4d9b, 0x6fbbcbd5, 0xaf26a61f, 0x3550a59a, 0x30cc803d, 0x2655e613, 0x1776a608, 0x7a68a80d, 0x49ee2dc6, 0x7ce519e3, 0xd7ebcbc2, 0x143ca3fe, 0xf7339c3f, 0xc1293c53, 0x4801ede0, 0x01b45199, 0x27ba2635, +0xd5159fad, 0xe30f3fc1, 0xc55ad9d2, 0xa9f0864e, 0x11a08659, 0x5b04ae69, 0x6cf1ce23, 0x9e05e604, 0xd0d22bb5, 0xe436dfb6, 0xf4220876, 0xe0453a37, 0x27e1b78a, 0x24abb27c, 0x6bc82e54, 0xbf3271df, 0x22260392, 0xd6040be4, 0x11fb17e6, 0xaf7d37a0, +0x216c0664, 0xc0c6fc75, 0x8b8d1463, 0x8bd685dc, 0x02a5c5d0, 0x8cb4f414, 0x5c66dfa1, 0xbb1a05e1, 0x12b11210, 0x4e8c5c0e, 0x3123401b, 0x584eab9f, 0x9d14724d, 0xd089ba0a, 0x8928d1b3, 0x696deb84, 0x5f774be8, 0xc7ff1c02, 0xf051edf7, 0xd4fa5f8b, +0x338685cb, 0x5d891f87, 0xd3c3bffc, 0x8fa5605d, 0x05c7b418, 0x6a27ee72, 0xa844d7d7, 0x03119449, 0x4c2999de, 0x34bf65bc, 0xa81f4668, 0x5ec31a71, 0x8d5b3432, 0xf1e5bc6e, 0xe77cda40, 0xbc787429, 0xbf69e060, 0xf6dc5c19, 0xb8500017, 0x01efc026, +0xf47999c9, 0xad8363cf, 0x213797db, 0x9d4fe3f2, 0x14673241, 0x20d857fd, 0x034a05f6, 0x3178d1a4, 0x2083c642, 0x9ca023d4, 0x7ff48daa, 0x34e4f403, 0x172d37b7, 0x135ed236, 0xab0ed221, 0x4b1079a9, 0x251fe3e5, 0x005b91bf, 0xab55439e, 0xf00a7c48, +0xe354ae7e, 0xadd8f270, 0x7922adfb, 0xc610dc24, 0x13054389, 0x5c3d4e1e, 0xc26339a5, 0xd22c7fda, 0x8ffef1e2, 0xc3d7683c, 0x6d1e0e05, 0x7cbe885c, 0x79793c44, 0x9cfbb26b, 0x6e0f9a4c, 0xd65f9a5b, 0xe2e0ffe7, 0x364131d3, 0x7bdcf994, 0x485a7c5f, +0xaec96639, 0x7d0ad9c5, 0x06d62051, 0x02fe546f, 0xf7680d80, 0xbaae5478, 0x988857ea, 0x361aa06c, 0xd3982e43, 0x6a7c7fcd, 0x0739e077, 0xaaba83b8, 0x78cd6ddd, 0xd13deb93, 0x8a3945fa, 0xf2f42827, 0xc501486d, 0x4f380d97, 0x23c9c3b4, 0xe46d4e09, +0x5ab0fff0, 0x8a62d445, 0x7faf1c15, 0x993c0673, 0xc7a48dbd, 0xbc23e596, 0x8973400c, 0x37aef1f5, 0xbb41945e, 0x6d459fba, 0x69367a3b, 0x2544725a, 0xe6931a66, 0xae92f786, 0xb9bfc031, 0x37f5604a, 0xbd97b40f, 0xc38cf983, 0x5aeb6e4f, 0xc4ee884b, +0x58153a20, 0x24f023c3, 0xf1be2dd1, 0xbaf5c5c7, 0xe5d91f90, 0x00000000, 0x076271c8, 0x7e40dc33, 0xac6ca3e9, 0x33dd1474, 0x4dc659f8, 0x4c720861, 0x88c71195, 0x9b99c3a3, 0x5e988bce, 0xf687cda6, 0x30971182, 0xc09d6dca, 0x0473e581, 0xc172adec, +0x59fafa06, 0x6e540bf3, 0xe1aafa11, 0xbeddb1f9, 0x7896fc62, 0x059c25a7, 0xc238a81a, 0x0428743e, 0xd7b05a7d, 0x9e5e77bb, 0x7b87682b, 0xe6c88bd9, 0x4f639c28, 0x104f467f, 0x4aa42830, 0xf5cdc850, 0x350b3425, 0x996797cc, 0x5b5f3fd6, 0x8d00a58d, +0x6caa5f9c, 0x4ed7cdb1, 0x9a760385, 0x8cef65ab, 0x227d922d, 0x4affb98f, 0xbdcc25b0, 0x68d9ba1d, 0xe01eab88, 0x5dd28e38, 0xd54e0e12, 0xf2afb998, 0x68822ba2, 0xe5828e2f, 0x1699662e, 0x9fea2622, 0x16c2f791, 0xb9e4518e, 0xe2bb6e58, 0x1588f267, +0x1014d7c0, 0xf34079be, 0x9bc2521c, 0xf31be801, 0xc8b02fe6, 0xe1ab6996, 0x07dd967e, 0xbd093eb6, 0x4833cedc, 0xd6706907, 0xf78fd249, 0xd76f5a07, 0x6f0ed0ec, 0x8236c319, 0x0b4eec1d, 0x539b3c60, 0xa2d64b57, 0xcb1a3ec5, 0xdf8ba739, 0xf3f85514, +0x2bae6453, 0x1802e39f, 0xa3c97857, 0xd318dd5a, 0x0f396b40, 0x03aa1123, 0x66f51ed2, 0x4ef16ba2, 0xab2d8569, 0x273d1e30, 0x2ec6d00e, 0xb8618aeb, 0xcf6db998, 0x5446aa1e, 0x32b3b4cc, 0x819cd23a, 0x0c937a63, 0x50312d43, 0x6b7957b1, 0x7c42df6e, +0x38e26bd1, 0xe31e4bb5, 0x4c444981, 0x1c7564c2, 0x3c95ec8c, 0xca050dc5, 0xdae31364, 0x8329f019, 0x0d8c4963, 0xf53af06a, 0x9e43a7db, 0x941278c6, 0x68d34692, 0x88671c04, 0x52840f60, 0xf690e149, 0x792a6b33, 0xc4235585, 0x6e11e3ec, 0xaf5a0234, +0x41c800e2, 0x5e177503, 0x2d6cc12d, 0x58d5d07d, 0xc3fec3fb, 0x76130073, 0x6037bbac, 0x3d8adf8c, 0x437d22c1, 0x5f084603, 0x988102a5, 0xd9490247, 0x6dbbf2cf, 0x655f0ff1, 0xe769cce8, 0x4fee58a2, 0xb08577d5, 0x40d733e2, 0xf2e76614, 0x9de9b6f8, +0x33ac87cc, 0x10e61ea1, 0x300696ef, 0x347111b2, 0xc14be1d8, 0x9f5c94db, 0xfdde0d54, 0x0e265840, 0x0a51df1d, 0x950d4bc6, 0xebfab68b, 0x78355833, 0xa6a1cc0a, 0x1624bbdf, 0xf8b6b909, 0xeae5858b, 0x470aa59c, 0x08e4fd3e, 0x3b487af2, 0x9a342086, +0xd207ee5a, 0x426211c1, 0x8ad23e27, 0x56f3883d, 0xf14d7737, 0x8bcd0d27, 0x7fe8ce4d, 0x37db0091, 0xe850a7a8, 0x5a60f25e, 0x4615969c, 0x9065ff9b, 0xf0524437, 0xcdd89bbb, 0xc78944a6, 0x3e20ceaf, 0xa887944a, 0x291b4670, 0x1fdf75e1, 0x492cfddc, +0x134c0f82, 0xde949439, 0x6282998f, 0x8ea5b97a, 0x59cae37d, 0x24970f13, 0xb758e1ab, 0xb19a44d5, 0x512e1e43, 0x75b91150, 0x6a6664b1, 0x84f46667, 0xa50bdd29, 0xc054d2d8, 0xd5da7824, 0xadef2017, 0x7a807a10, 0x64403cf1, 0x36c43391, 0x234a996d, +0x999e31a5, 0xf9a98a09, 0x356e22b2, 0xbfbc1c95, 0xc69677a6, 0xfcc13e54, 0x92d0ddb8, 0x93cfeeb8, 0x74a62250, 0x8c109b59, 0xacf01317, 0x875e7744, 0x12533c82, 0xfa039b2a, 0x86414444, 0xa7beff0a, 0xa17c5a74, 0xa414ee29, 0xe94f94a8, 0x39fd58d1, +0xf425c36a, 0xd1adff79, 0x26222d30, 0x8083e13a, 0x4a86ecff, 0xb5edc388, 0xff6b2f77, 0x770c3373, 0xae453134, 0x20e0884e, 0x85eb5567, 0x149199fc, 0x7264872e, 0xd8563147, 0x44a0b4bf, 0x69cc7592, 0xc2e1f0fb, 0x7b9f4910, 0x4b99dfff, 0x011f3300, +0xbc160db6, 0x158eaafc, 0x639daa8f, 0xbad4a8c8, 0xe20178b5, 0xdd3e851a, 0xb97eb9eb, 0xee9202d6, 0x67ea2dd2, 0x11f92da1, 0x97b869e5, 0x9cf685f8, 0xb23055f6, 0xfe741c77, 0xaa32b669, 0x0568b45d, 0x8d0fa859, 0x28047570, 0x02b52223, 0x00000000, +0x1d6a57c2, 0x1ab7c1bc, 0xb647d2ab, 0x6ca4c1cf, 0x612888ac, 0xb32f66f6, 0x9b2b1386, 0x2ab15753, 0xd0b2cc79, 0xa998a74a, 0xd4c54b24, 0xdbfc2064, 0x0477875d, 0x3f3ffdaf, 0xec2720f5, 0x3119a5ef, 0x06c2a57e, 0x4d5b7a81, 0x737bb42e, 0x173b88df, +0x57ecbb3d, 0x89782f04, 0xa0636974, 0x5559991e, 0xe5dceecb, 0x25883c13, 0xdc21b61a, 0x5ca25720, 0x1ec046e1, 0xe4c3ddcb, 0x2fd9e30e, 0xfb1ca82a, 0x5dbd6420, 0x1ba8f2bc, 0x2255aa6d, 0x3a5749f2, 0xb4f2f088, 0xe676ffe8, 0xbbcb9bc8, 0x7ef7fd4d, +0x70d1a50d, 0xbea32f95, 0xe0b45a96, 0x5b7fc15e, 0xce728a98, 0x2c73f22d, 0xc53c6685, 0x21ffbb4e, 0x71ce960d, 0x96a75ae5, 0x7d5dec6e, 0xc9af1ce6, 0x09fbce3e, 0xef8d31d6, 0x191dd09f, 0xccc7a8bb, 0x8fba8a7a, 0x45bf87bf, 0xed3813f5, 0x917acc9b, +0x3196ed3e, 0xa2fcea51, 0x99acc812, 0x85ff9859, 0x730b9bb9, 0xd44104e1, 0x71d7ad7b, 0x8c80b4c8, 0x2aaffebe, 0x3c3a6188, 0xf791d6ce, 0x8a8f222d, 0x206931c3, 0x322f0ed2, 0x9d7f6835, 0xedcd1060, 0xfeeefa5f, 0x9fa35ef7, 0x86467bb5, 0x8936c1c1, +0xc16d783b, 0xf19e402b, 0xebc28685, 0x940044a4, 0x11ffdcfd, 0x58c1b029, 0xde87cb9c, 0x98c91d3c, 0x90d3e483, 0x8723ae9b, 0xab83c6c0, 0x2bca2b90, 0x25df44ca, 0xdd3e2870, 0xb30336ac, 0xd092a4c6, 0x6391926a, 0x614da4a8, 0x1e8f6689, 0x40414045, +0xd32b472a, 0xc9778184, 0xd69d3223, 0x936a076f, 0x8295db92, 0xaf5066e7, 0x885314ef, 0x50db4996, 0xb50ca049, 0xc4db0d32, 0xf54de00c, 0x9a152bfe, 0x659e048f, 0xbeafba1a, 0x2dc5bd75, 0x35454d19, 0x5b7853c5, 0x398c1481, 0x076a43cb, 0xad8c5025, +0x5408e9b1, 0x19e52542, 0x70b27855, 0xd524d1cf, 0x77d83b9e, 0x64fbd1a1, 0x2e7c5e99, 0x57b10a5d, 0xfc32cc9d, 0x4f31fa31, 0xae35b3c9, 0xb7d0968b, 0xd24e9204, 0x30f33810, 0xbc738cd8, 0xce1dc24f, 0xb1df006e, 0xb8a02cff, 0x6d84fd30, 0x5fabf3e2, +0x7ea7170f, 0x45f7354c, 0x6ce1281e, 0x36fcaef5, 0x3b502243, 0x6f58cbf2, 0x37997bdb, 0xc008ad15, 0x1323ea3f, 0x3d5fb4a6, 0xe10449f8, 0x23d0d22f, 0xf6f403e0, 0x4e542f1f, 0x9ec68bd9, 0x1a5cc6ae, 0x9b70fed0, 0xa14509bd, 0x429d7687, 0xe0619cd6, +0xe70bdf1d, 0x43f8a3a9, 0x472b038e, 0x334adbfc, 0x0e156f5a, 0x097f2c91, 0xf984b994, 0x4be25a16, 0x2666a726, 0xc81254aa, 0xa4f37cb4, 0x9565918a, 0x22b50701, 0x2ca0685b, 0x4124956b, 0xfb588f56, 0xa74a9f58, 0x79cd54c4, 0x0ac6cf7d, 0x4dedccf3, +0xa596a99a, 0xcbabb746, 0x04d3a027, 0xe87b6569, 0x6e3d1edc, 0xd8885d79, 0x109a09d3, 0x34209837, 0xdfe21eb2, 0x3a35f76d, 0xe2bdaa14, 0xeaa753ab, 0xc762eede, 0xb0bad540, 0xa3993f7f, 0xcf781761, 0x68328839, 0xe3d87f3a, 0x5a1d86eb, 0xf227a3c7, +0xb266e382, 0x1feab3a7, 0x27037208, 0x1449a9f4, 0x4c8819dd, 0x849a4d77, 0xe66e0a33, 0x52077f54, 0x17f04a18, 0x0dac8cb6, 0xfa3d5a78, 0x0ba31a53, 0xbd1659f6, 0x7b116206, 0x76bdeeb0, 0x38e9c1af, 0x1880f06c, 0xc2d49bd7, 0x75040d5c, 0x60287186, +0x1c53504b, 0x5d77c520, 0xa020dc93, 0xace9850b, 0x62f44744, 0xf4283522, 0xf34276e9, 0x96dc7266, 0x920fd241, 0x91b631ad, 0xa83a252c, 0x5c12100e, 0x060f96e5, 0x29161d52, 0x16959f36, 0xc3b14ef9, 0xdc5bfd5e, 0x8de561e6, 0xeca8c54e, 0x03b9e3ec, +0x081af9bf, 0xd9ed8857, 0xfd5719b3, 0x5362aa7a, 0x3ee6574a, 0xee74f38c, 0xda546bbb, 0x2f198bb7, 0x7a74b728, 0x210ce4ed, 0xc5bed81c, 0x2873c87c, 0x97b9a748, 0x1b391380, 0xccc1f48d, 0x9c1abd1b, 0x0f70ba74, 0xbfca6f34, 0x00000000, 0x56d4df73, +0xd1f771e8, 0x152c7cda, 0xf8e16cba, 0x6742324d, 0x464ed6a0, 0x05b67509, 0x59a46507, 0x493e6cd4, 0x78a881ea, 0x24ba91e4, 0x5ece26cc, 0x812c387e, 0x51be9cb8, 0x726e4e97, 0x6627e763, 0xba7c1a3d, 0xc6073bf0, 0x0165d52e, 0x02dc36c2, 0x7461d872, +0xcda421a3, 0xef1126a2, 0xb9c5f9d1, 0x6aeebefb, 0x3f838264, 0xaae613ee, 0x8beaf703, 0x4a878f38, 0xa95ff002, 0xe5d7e9df, 0xe4b23cf1, 0x83f00ebc, 0x8f395724, 0x7fc2c221, 0x8e5c820a, 0xdb31be95, 0xff8b2f71, 0xcace6268, 0x485bb9fa, 0x556d3c9f, +0x8049ed50, 0xd7f8e70d, 0x7c7b21cd, 0xb6b543a5, 0x7d1ef4e3, 0xf0fb9505, 0xb4697567, 0x1d368565, 0x6b8b6bd5, 0xe91eb047, 0x0cc95998, 0x12463f11, 0x4492e062, 0xbb19cf13, 0xa62f4a76, 0x69575d17, 0x8e6a4c9f, 0x36a4fbe8, 0x20db5564, 0x63845cf6, +0x5136da37, 0x35a007b6, 0x8f630530, 0xd9475e70, 0xebd8435e, 0x6080a0a8, 0x20f6ce8b, 0xbaee9969, 0xf9b190fb, 0xc82a718b, 0x4152bc63, 0xd84e17df, 0x8c4a6281, 0x8d6eb0c1, 0xfcaea47d, 0x116d2ffb, 0x31b67a9f, 0x4544c14a, 0xa8874acc, 0x76ff0e24, +0xdf710d47, 0xac9137e5, 0x3484d5f6, 0xcd18dee2, 0xd8638c30, 0x9d0ad695, 0x57008900, 0xf89542bb, 0xadb5e5a5, 0xefce3e77, 0x62a08eb6, 0x22fb7b7a, 0x533b6fc6, 0xedc38b86, 0xeec777d8, 0xc90ea3cb, 0x8e47d770, 0xfea3118c, 0x1556c93d, 0x319be170, +0x26c09dbc, 0x25c461e2, 0x051f3486, 0xe9f86d40, 0xdd512359, 0xbac30286, 0x8b757819, 0x145f8092, 0xead10af1, 0xedee1069, 0x073f1a98, 0xfa98f74a, 0x1776e723, 0x75d66995, 0x134d01e5, 0xf99c0b14, 0xcb03163a, 0xde55df07, 0x37adb247, 0xfbbc250a, +0x9a35cc0d, 0x8978cde8, 0x329f1d2e, 0xbff1adef, 0xc807ea64, 0x427bdbd2, 0x70c95d13, 0x9f076364, 0xce1c22bc, 0x8b58e3f6, 0x16523563, 0xacbcac0a, 0x405bf5cc, 0x043be6c6, 0x002d9bef, 0x1269d3a5, 0xaa8aff3d, 0xc9233824, 0x46403d14, 0xca27c47a, +0xcc3c0ca2, 0xfd8a763d, 0x52322669, 0x00000000, 0x991cabbc, 0xbef8e440, 0x511b41d8, 0x75fbf27a, 0xbcf551b1, 0x77dbdc64, 0x8a51aa59, 0xafb85054, 0x60ad3b47, 0xfc833f92, 0xefe3a598, 0xfb91bee5, 0x983879fc, 0x358d9c59, 0x74df203a, 0x435f0992, +0x9e0e2acb, 0xce31b953, 0x89555607, 0x9f2af88b, 0xbed57faf, 0xdb67706e, 0x628d1559, 0xca0a5f95, 0x5520a71e, 0x30bf3330, 0xe8f124ef, 0x73e03aa2, 0x0124d240, 0x378029a8, 0x9e23b124, 0xcf38f0fc, 0x99313053, 0x010949af, 0xff87c3cc, 0xcf156b13, +0x14721b7d, 0x65b20fc1, 0x3092a8df, 0x444d88e5, 0x24e0b3a2, 0xabae2d7d, 0xdf5c96a8, 0x22d6e095, 0x56245b40, 0x9b111e4d, 0xab83b692, 0x32b286c1, 0x61a472e8, 0xebf5d8b1, 0x34a94e19, 0x4372927d, 0xeccac229, 0xd96ac59f, 0x67bfba30, 0x9b3c85a2, +0xb8e32c98, 0x032967b1, 0x40766e23, 0xfab56ca5, 0x020db5f1, 0x061bc8d8, 0x63a9c719, 0xaaa764d2, 0x521fbd86, 0xa9a3988c, 0xbdfc181e, 0x88718447, 0x6189e907, 0xe8dcbf00, 0xece759c6, 0x885c1fa8, 0x27e44ffc, 0x8d432b2e, 0x9815e213, 0x24cd284d, +0x02202e1e, 0xfda7edd2, 0x71c014bc, 0xb9ea6537, 0xeeeaec37, 0x0304fc5e, 0x45695aa5, 0x1049fdbb, 0x06365337, 0xfe8e8a63, 0xcc11974d, 0x64bb466e, 0x21d21ccb, 0x5429eeb1, 0x70e4c6fc, 0x5316f429, 0x8f4e9edf, 0x23f232d5, 0xa98e0363, 0x167fae8c, +0x76d295cb, 0x1244484a, 0xbbca4b29, 0xaeb119fb, 0xe9d5f6af, 0x503f9398, 0x8c67f96e, 0x1140b414, 0x157b52d2, 0x572d12ef, 0x13609a0a, 0xde7844e8, 0xbcd8ca5e, 0x4256403d, 0x550d3cf1, 0xdd7cb8b6, 0x9c039f3a, 0x474974bb, 0x8a7c31b6, 0x73cda14d, +0x9a1857e2, 0x466da6fb, 0x6496dd81, 0xeafc911e, 0x33bbcf6e, 0x74f2bbd5, 0x9c2e04d5, 0xdb4aeb81, 0x5404755e, 0x07128177, 0x21ff8724, 0x27c9d413, 0xcd35450d, 0xdc586af6, 0x669b6870, 0xae9c8214, 0xdc75f119, 0xffaa5823, 0x71ed8f53, 0x10646654, +0x77f6478b, 0x4460130a, 0x175b7ccc, 0x679221df, 0x4764ef54, 0x04167d29, 0xf8b8d954, 0x417f278c, 0xda6e39c1, 0xa8aad123, 0x50120877, 0x72e9730d, 0x9d274d7a, 0x72c4e8e2, 0xbfdc3600, 0x25e9fa0d, 0xda43a22e, 0x5609c0af, 0xbdd183f1, 0x0532af69, +0xcb2e8dd5, 0xad987e4a, 0xaf95cbbb, 0xb9c7fed8, 0x23dfa93a, 0x33965481, 0x26ed0653, 0xbbe7d0c6, 0xb8ceb777, 0x36896007, 0x659f942e, 0x66b6f39f, 0x9604725a, 0x39065ca7, 0xe5d861eb, 0xa71bfd07, 0x7f02670c, 0xa02a9d6a, 0x3cef9ca5, 0xabc589ba, +0x39c779dc, 0x4d2a0a00, 0x9202f066, 0xdf28fa66, 0xa8334e90, 0x0ec7f1a9, 0xd528ac88, 0xa31d7f3b, 0xdcde3d4c, 0xa42c1f56, 0x36efca4b, 0x702ad49b, 0x9edc84db, 0x42c39cec, 0x32286d0c, 0xefd83705, 0x0b2e31ab, 0x91f4374c, 0xd731299c, 0x09f691c4, +0x7bc5c04b, 0x972a151f, 0x7b04e530, 0x7eed2532, 0x95f2b570, 0x02198514, 0x4ff2aa6f, 0x4202b997, 0x45f2fc81, 0x3af09b8d, 0xd12e2eb4, 0x4a1b6a6d, 0x3f195b8f, 0x9ff2e39e, 0x48c3ca02, 0xdbef5d21, 0x492c883c, 0x9e1da1a0, 0xec2ef02f, 0x43edfba9, +0x0731606d, 0x061f0728, 0xa4ed3a2d, 0x3a31bef6, 0x901b7572, 0xd7f00ce7, 0x7e2c0049, 0x35d8281a, 0xedc1b211, 0x401b3c83, 0x9533900b, 0xa5c35d68, 0x38e91e99, 0x92c3d51d, 0xd3f68edb, 0xaaebeeff, 0xa233187e, 0x742c56a7, 0x9f33c6e5, 0xed00976a, +0xe9c7302d, 0x9deb668a, 0xeaf0d27c, 0x441dbebf, 0xacf4e9d7, 0x4c046d45, 0x7c35855d, 0xafc30b86, 0x9b3544d9, 0x362eef30, 0x311f8f5d, 0xeb1f9042, 0x4deb2f7b, 0xd219cce5, 0x04c7a747, 0x9bf461a2, 0xa6f4bf39, 0xe7c1e4ff, 0x46043bab, 0x0937b4bf, +0xaa2acb84, 0xd61f4ed9, 0xd00049f1, 0xaeed6cc3, 0xd337aba0, 0x3e373cca, 0xdb2e785a, 0x3b1fd9b3, 0xd2d8e99e, 0xa104fa2f, 0x90da5009, 0x72f274f4, 0x79dc455f, 0xe0f08492, 0xdec7b858, 0x012e6745, 0x00000000, 0xe30643b8, 0x31deaa26, 0xea31f707, +0x08d8f681, 0x0e06d4d2, 0x4e1de851, 0x33c72f32, 0x0fe996ec, 0x4533d9fa, 0x0bef14d0, 0xecefd554, 0x941df74e, 0x0406823c, 0x4bf42853, 0x0337e251, 0xe3c766c3, 0x98c383f3, 0x05e9c002, 0xe1dee3d7, 0x34376a24, 0xd8199a0b, 0xa2f23d05, 0x02d8a06f, +0x0c1f51c6, 0x06de2253, 0x4f338f14, 0x99ede4b6, 0x38283be2, 0x3fd87ef4, 0x4ada4f16, 0x7a2a8275, 0x41355bc6, 0x750231e2, 0x91351237, 0x0528e579, 0x4cc5483e, 0xddf05a09, 0x01ef423e, 0x78330761, 0x75c31499, 0xaf022efd, 0x771bb4f6, 0xa7dad87c, +0xe6ef83ba, 0x0df013f8, 0x46c51ed0, 0xd4c7eeb6, 0xd6de6ba2, 0x7233518f, 0x74ed73dc, 0xe9061556, 0xdc1f1837, 0xebdeb539, 0xa91d29d5, 0xdfe9df1d, 0x0d313683, 0x78f2221a, 0x731d36ca, 0x94dcd235, 0x4802ef79, 0x9802a688, 0x3031e818, 0xa6359a42, +0x76f4f6c8, 0x7ddac763, 0xe2e90186, 0xac35ccac, 0x7cf4a026, 0xa9dc0cae, 0x03f6c72a, 0x3c2eb9de, 0xe8287213, 0x33060a49, 0xa8f26beb, 0x3dc1fbe0, 0xef19127e, 0x7fc34277, 0x70ebf1e0, 0xd1ef0bcf, 0x9d2a43f1, 0xd937fd4e, 0xad1babe9, 0xadda8e92, +0x3ef619b1, 0x0f28b397, 0x9c0424b4, 0x992cc1cd, 0xd9f6d835, 0xda001f1f, 0x96c55721, 0x791d6024, 0x7aeba70e, 0x35190d61, 0x32e94877, 0xd406cbcd, 0x93edb258, 0x97eb3064, 0x3bdefcc8, 0xe22824fd, 0xe11fc6ac, 0xdd317f72, 0xe8e95768, 0xab04acc1, +0x73dc13b1, 0x7104b3de, 0x34f64f5f, 0x0ac17395, 0x71c596a5, 0x0a0056ee, 0xdac13a64, 0xee37753b, 0x432cded2, 0xd0c16c8a, 0x4edccd2a, 0xa1c5df54, 0x7635d3b3, 0xeef65040, 0xe700c184, 0xd5e989f3, 0xa3dc5a40, 0x37008875, 0xd8d8bf70, 0x0cde74bd, +0x7d1be218, 0x9cc501cf, 0x49edad47, 0x00c1257b, 0x9ada06e7, 0x3d00de9b, 0x0819d3fa, 0x44dc9bc4, 0x41f47ebd, 0xe031a1e9, 0x932c9723, 0x77da918d, 0x9a1b239c, 0x30f0cd63, 0x4b350d28, 0x47eb7995, 0xde069d23, 0xe43723d5, 0xe4f606ae, 0xa5027813, +0xe62ea6c1, 0xae2c49b8, 0x40da19f8, 0x37c1ad0e, 0xa0ebb811, 0xe5194490, 0x472a5cee, 0x07f04516, 0xefa229bc, 0xb68baf7d, 0x9a3bb26c, 0x7238590f, 0xd6c302d1, 0x5c9cd3c1, 0xdc0e933f, 0xcb795796, 0xb19808a8, 0x5445d5f0, 0x9757e15d, 0x6d969b97, +0x7df2f8eb, 0xcc6af043, 0x2c02781b, 0xe0daed52, 0xe5dddd58, 0x97e58457, 0xccd89549, 0xae84af3a, 0x15635376, 0x8234b22b, 0x728a3c05, 0x4194e38c, 0xd4d7950e, 0xd37657d1, 0x36ab8a89, 0x5b3d111e, 0x4493d386, 0x0f78c4ee, 0x95437682, 0x5651422f, +0x1faec298, 0x00000000, 0x8aedb41a, 0xa14e0ede, 0x88f923c5, 0xa99708ef, 0xdb1d34ea, 0x95f11388, 0x78f5c8e1, 0xbee0cc46, 0x90f62382, 0xd9bbc63f, 0x592986c1, 0x7fe66f34, 0x56e32725, 0x4c4ad5b7, 0x1a1b9798, 0x75999bd0, 0x0fcaa1e4, 0x0dde363b, +0x6d24fe9d, 0xac9038e5, 0x1064637c, 0x3e728cb8, 0x7ae15f3e, 0xb42d5da8, 0xab839f30, 0x852715fe, 0x310a4856, 0x8286d721, 0x2cb01d11, 0x982f25b3, 0xb9410e99, 0x62ee5f79, 0x709eabda, 0xc9dfa543, 0xe2ce7a8d, 0xedb6be63, 0x02a6f2d5, 0xc96dc049, +0x08d90631, 0xf8d5ed15, 0x33acba83, 0x3ec0e9b2, 0x2e16efc4, 0x5e88441e, 0xab31fa3a, 0x0507300a, 0x8f58e11a, 0xef104cb6, 0xff742fca, 0xb33efa7d, 0xae36ca30, 0x05b55500, 0x625c3a73, 0x6f820c48, 0x1f1ca792, 0x3619ef83, 0x809240fe, 0xbcf45b99, +0x0d6c5331, 0x5142e5fa, 0x87338221, 0xe7c94a87, 0x07a1c2df, 0x43807453, 0x2ba3bac4, 0xb49f38a2, 0x3b75bcb2, 0x884b46cf, 0x5b8f7414, 0xc1b4c678, 0x7a533a34, 0xbe52a94c, 0x675b0a79, 0xa9256de5, 0x4e5e4268, 0x10d60676, 0xa4fb5bde, 0xf867881f, +0x1d08304d, 0xfd60b815, 0x23c8d9ff, 0xd465f004, 0xa3e8fc0b, 0x340d785c, 0xfdd2dd1f, 0xe803eb63, 0x4b597262, 0x1dba5547, 0x24691b20, 0x752bfeda, 0xd909a335, 0xb38c9f77, 0x90444688, 0x086b633b, 0xc4019378, 0xf50bdb2e, 0x494de5bd, 0x18bd654d, +0x0acd91ee, 0x65fdf8ac, 0xc106a372, 0x9a89d766, 0x1777c4a9, 0x51f080f0, 0x15d1367c, 0x92e2b45d, 0xfa731fc0, 0x53567225, 0x9f8ee76c, 0x8dfe13cf, 0xc4b3f672, 0x31b82d5c, 0x12c291a9, 0xffc64ac0, 0xd1d0a504, 0xcbcb329c, 0xa35a9901, 0x2ea48ace, +0xd67167db, 0xc61504a7, 0xd3c432db, 0xc6a761ad, 0xb9f36b93, 0xbc463e93, 0xbbe7fc4c, 0x7d409de1, 0x39d34e67, 0x6048adac, 0x46352153, 0xc3a051a7, 0x331edf89, 0x21dc4e20, 0xf71f4cf1, 0x9f3c8266, 0x802025f4, 0x6891ab9d, 0x989d40b9, 0x0713a7d5, +0x2b11dfce, 0x24db7e2a, 0x6a375948, 0xe27c1f87, 0xa6efcc01, 0x7847adeb, 0xea177cbc, 0x773f6905, 0x54f7b0fa, 0x4421b68c, 0x778d0c0f, 0x00b2650a, 0xf7ad29fb, 0x0a7ff4e4, 0x6a853c42, 0xf2187cfb, 0x021497df, 0x267d8cff, 0x49ff80b7, 0x6823ce97, +0xe77b2f8d, 0x4beb1768, 0x67e96f73, 0xe56fb852, 0x60fac8a6, 0x859570f4, 0x43321159, 0x3cd47e6d, 0x216e2b2a, 0xf2aa19f1, 0x4cf8b0bd, 0xc31234ad, 0x29b72d1b, 0x5e3a2114, 0x39612b6d, 0xcecc0296, 0xfac17aca, 0x8fea8410, 0xa65da90b, 0xdbaf51e0, +0xb639ca77, 0x5c2eb6cb, 0x1aa9f292, 0xbb559946, 0xf00ceb24, 0x8d4c76c5, 0x599be3cb, 0x9d2815b9, 0xce7e679c, 0x1270f4a3, 0xf5b9be24, 0x3c661b67, 0x4eec2762, 0xa1fc6bd4, 0xdcbcf635, 0x237abcf5, 0xd162c00e, 0x180f0047, 0x6f306942, 0x46874459, +0x29054811, 0xa4493ed4, 0xe8b18e69, 0xac225def, 0x702cced0, 0xdea861ea, 0x654f9da6, 0x9d9a70b3, 0x3bc7d9b8, 0x17c5a1a3, 0xe0688858, 0x8a5fd110, 0xde1a04e0, 0x7f540a3e, 0x26cfe9f5, 0x41268686, 0xb12a6da2, 0xf0be8e2e, 0x53e4172f, 0x8781e72b, +0x34bf1d56, 0xed04db69, 0x9250d157, 0xeaa519b6, 0x5d4940b2, 0xd34c9d20, 0x642ec1d1, 0xd9d1eaf4, 0x57d43766, 0x1f39421e, 0x439411ce, 0x4a84e460, 0x05d33516, 0xd77bbb54, 0xf77bcf45, 0xaa328ff7, 0x55bda67e, 0xfe6b3aeb, 0x90d88cee, 0x0d27d3da, +0xe33be9ed, 0xde6b4efa, 0xdde6cc80, 0x3aea0319, 0xafe1bae1, 0x4b60f702, 0xa2c6693b, 0x7f20a5bb, 0xec75ab2f, 0xe9a69e39, 0xfbb80ffd, 0x37cdd0c3, 0xf34ce931, 0x0eaa51a0, 0xcbcf7b30, 0x885b6afe, 0x7b1783cf, 0x53e31112, 0xee1c3a37, 0xa498de57, +0x0b7964b6, 0x2f4e36d3, 0xd69fa836, 0x718af41b, 0xb13ceb9d, 0x1883e610, 0x07baa40e, 0xb0d8f8ff, 0xd1250c38, 0xe6e8dcfb, 0x7459c10d, 0x319367af, 0xc0b61f86, 0x0f4e42c2, 0xebcf0f21, 0x4f57d176, 0x01e41362, 0x344052b9, 0x45caa6a2, 0x94efaa9a, +0x789a01b5, 0x6cda271d, 0x627076bd, 0x2269e509, 0x8498aa46, 0x8715283c, 0x3edd256d, 0x5cad53d0, 0xd5122a4c, 0xeff82955, 0x39678163, 0x4eb3c214, 0x797e12d7, 0x25d34107, 0x291081bf, 0x265ec37d, 0xa0aff823, 0x0cc3c0b8, 0x38839201, 0x61fdf4c7, +0xb7625cf1, 0x8fe1cef0, 0xc2df8e9e, 0x6a849071, 0x7d4934a3, 0xdf8f5d98, 0x401993b4, 0xa9bf0d8d, 0x0910f5ae, 0x17cda4d2, 0xfc02abf3, 0x3b0e107b, 0x77d44377, 0x21e46773, 0xce1c4e26, 0x52070270, 0x4d3e406e, 0x6f57a567, 0x41fd80d6, 0xc33b9dfc, +0x664750c9, 0x1b0e646a, 0x92b11df6, 0x28f492dd, 0x144026a8, 0x8c6c4c8a, 0x7ec4b6d9, 0x6b608313, 0x82c61d2a, 0x7af390ad, 0xdbb87bec, 0x20007411, 0xc9a6ea28, 0x307774cd, 0x8e05dd92, 0xabd69c95, 0xe15278f5, 0x814b9f50, 0x83220e48, 0x6909120b, +0xcc75df3e, 0x3629c3a1, 0x1cb4c064, 0x5af3e4bc, 0xed91b84d, 0x2cc3b4a9, 0x93550e94, 0xe2dffa8f, 0x96863b82, 0x2a9d03c5, 0x5ec4c2c8, 0x3f39360f, 0xb9c80d51, 0xbf96ba3d, 0xa14beb41, 0x80af8c32, 0x238df66b, 0x9c1b4c56, 0xdc02dfe2, 0xc1520ce4, +0x518a800a, 0xc6e8a8ea, 0xb82c1e33, 0xae05a983, 0x73e36503, 0xe0b66b97, 0xcd91cc5c, 0x1edd517c, 0x04372674, 0xd4f6392e, 0xa3227a59, 0x02699118, 0x1aea7708, 0xba458f2b, 0x8d885fe8, 0xb4efde8b, 0xbe72a95f, 0x065eb76c, 0x982c6a22, 0x1d50d306, +0x67a343ab, 0xe70ccf99, 0x6019e7a5, 0x86f13b5e, 0xa57ccd35, 0x464724d8, 0xfa5c1c9f, 0x506e9368, 0xa85b1eef, 0x976228e0, 0x706ee779, 0xb3557a85, 0x00000000, 0x1967f572, 0xbc1b3847, 0xad882bf9, 0x76305015, 0x99c87940, 0x8a32fbe6, 0xf0c16b4b, +0x5b17f7de, 0x72077661, 0x89bf799c, 0x427002ac, 0x597e66c6, 0xd2a88e42, 0x9a45fb3a, 0xff8f2989, 0x68ed0169, 0xfde6b891, 0x107700dc, 0x24375265, 0xac6c389b, 0x9f96ce2c, 0xc842f94a, 0x3d50a717, 0x15a435ca, 0xca2b6852, 0xf69fdc27, 0xd835f996, +0x47a337ba, 0xf5125e5d, 0xda5c688e, 0x7cad27c1, 0xbba19c49, 0x75bdd26f, 0xc70cbb88, 0xb2b169e7, 0xf2a8fa53, 0xe8428d5b, 0xf9d19ee5, 0x0a9d77d4, 0x3cb4b475, 0x27bad01f, 0x913c9f8c, 0x6d3e347f, 0x639465df, 0x2eaa25b1, 0x321ee5d5, 0xbdff2b25, +0xf8358d87, 0x4909661a, 0xb50bcde9, 0xc5652a90, 0xe4814de3, 0xa6f14f4f, 0x950bb9f8, 0x857cb924, 0x9ba1e858, 0x4cda530c, 0x48ed7578, 0x5f20d1aa, 0x038d827a, 0x442eb5c0, 0x2b7910a7, 0x589a75a4, 0x5459b51c, 0xd0c11f5a, 0x65cad2b3, 0x119313be, +0xa7155c2d, 0x121e91c4, 0x33faf6b7, 0x9dff5f34, 0x2d27a7cb, 0x9e72dd4e, 0x56302404, 0x35a441db, 0x8bd6e884, 0xc48139f2, 0xf4f64d3f, 0x6eb3b605, 0xf1257829, 0x13fa82a6, 0xea2b1c43, 0xe5655e81, 0x08f4e6cc, 0xb6864f93, 0x1629b7b0, 0xcff85d44, +0x9d9f8dc5, 0xd027e285, 0x9183a5e9, 0xcccfac7d, 0x58fb82dc, 0x26e23a43, 0xbfc2acfe, 0xa12b02ea, 0x07b66ba4, 0xd6991911, 0x5bf2f200, 0x215451e7, 0xa98831be, 0x7004705f, 0xe82c76d2, 0xc9782735, 0x8add80b5, 0xd98c41e1, 0xe7392e22, 0x7aa6a3e7, +0x77b21bfb, 0xac3fbaf6, 0xcb79c7d9, 0x1de0dec8, 0x3eb56fc3, 0x39030467, 0x43a5a780, 0xc2d264bd, 0x380b9457, 0xb5607f46, 0x65479dc3, 0xa49c89a2, 0xde3a2a45, 0x2f499927, 0x00000000, 0x9a29e661, 0x84c04875, 0x9635ce4d, 0x3a0a74bb, 0x4cb0ff70, +0xc46c9f29, 0x57eeda2c, 0x4413cc24, 0x1a56b56c, 0x40acd75c, 0x09aba364, 0xaa814162, 0x5d4c0994, 0x371ecca7, 0x54e7aaf0, 0x1ce84ef8, 0x78a7430b, 0xdd335a99, 0xcece4c91, 0xe924e6e2, 0x36165c97, 0x7bae33d7, 0x59f312ec, 0xc3daf48d, 0x79afd33b, +0xb3de84d2, 0x41a4476c, 0xfad9f0ea, 0xb874c75a, 0x0aa2d3b8, 0xcfc6dca1, 0x62f1f667, 0xc5640f19, 0x3b02e48b, 0x52595164, 0xaf36ca2a, 0xca7157e9, 0xec936daa, 0xea2d963e, 0xb2d614e2, 0xe4305efe, 0xd32e9259, 0x685325df, 0xdc3bcaa9, 0x13fd1608, +0x730d0083, 0x33a1d7df, 0xfd6f9b4e, 0xcdc73c4d, 0x644f0df3, 0x5351c154, 0xe28ea56a, 0xbb7db786, 0x27eaaa73, 0x992096bd, 0x08a33354, 0xab89d152, 0x195fc5b0, 0x18575580, 0x88dc6059, 0x06befb94, 0xf27ac3be, 0xf173b362, 0x144b7dac, 0x8177c33d, +0xdf32ba75, 0x0f1558f0, 0x7d10c843, 0x0e1dc8c0, 0x0baa4388, 0x807f530d, 0x75b3fb17, 0x480fe408, 0x837623d1, 0x3cb48f2f, 0xff6e7ba2, 0x2355b10b, 0xf372538e, 0x24e3daaf, 0x5058b188, 0xc870b705, 0x4db86f40, 0x61f886bb, 0x6b5a5503, 0x8c637b21, +0x2d4879cb, 0xa5941992, 0xf9d08036, 0xf07b2352, 0xd59069cd, 0x664eed1f, 0x42ad37b0, 0xf5cca81a, 0x2afe126f, 0x93824505, 0x85c8d845, 0x3dbc1f1f, 0xe187d5b6, 0xee928d46, 0xd2260269, 0x87c938a9, 0x3417bc7b, 0x2c40e9fb, 0xb97c576a, 0x7e19b89f, +0x9f9e6d29, 0x32a947ef, 0xeb25060e, 0xe08f4586, 0x0201e0ec, 0x9c971df5, 0x89d4f069, 0x0c1c282c, 0x225d213b, 0xbdc34c12, 0x695bb5ef, 0x11fcf6e4, 0x6fe54e7b, 0x720590b3, 0x5e457948, 0x908b35d9, 0xf8d81006, 0x973d5e7d, 0x164a9d40, 0xf4c4382a, +0xbccbdc22, 0xf6c5d8c6, 0x30a8a703, 0x5c4499a4, 0x030970dc, 0xe631be12, 0x471abcf8, 0xdb8da10d, 0xb0d7f40e, 0x827eb3e1, 0xd498f9fd, 0xa880a18e, 0xfbd160da, 0x86c1a899, 0x94342ea1, 0xc0d38451, 0x4eb11f9c, 0x2e410917, 0x2bf6825f, 0x5f4de978, +0x31a03733, 0x7f1128af, 0x953cbe91, 0x6a52c533, 0x351f2c4b, 0xb7619faa, 0xb6690f9a, 0xd7918921, 0xe538cece, 0xa2227236, 0xc66d7fc5, 0x63f96657, 0x4b0694d4, 0xb1df643e, 0xc1db1461, 0x28fff283, 0x8f6a0bfd, 0x25eb4a9f, 0x4a0e04e4, 0x01089030, +0x8d6beb11, 0x710ce06f, 0x04bf1b78, 0x76ba8bcb, 0xba7527b6, 0x6de4ae97, 0xed9bfd9a, 0x928ad535, 0xa795f97e, 0x6eedde4b, 0xfc670b7e, 0xd12f72b5, 0xa69d694e, 0x49077438, 0x8e629bcd, 0xa02392da, 0x60f0168b, 0x6cec3ea7, 0xae3e5a1a, 0x56e64a1c, +0xbeca3cce, 0xb468ef76, 0xad372ac6, 0x8bd51085, 0x1543ed9c, 0x17420d70, 0xef9a1d76, 0x12f58638, 0xc765eff5, 0x55ef3ac0, 0x1b5e255c, 0x205cc1d7, 0xd884d1d1, 0x7c185873, 0x0d14b81c, 0xa32ae206, 0x515021b8, 0xe386355a, 0x74bb6b27, 0xfe66eb92, +0x1ee9ae14, 0x9828068d, 0x4fb98fac, 0x3fbdfff3, 0x46122cc8, 0xf7cd48f6, 0x9b217651, 0x451b5c14, 0x29f762b3, 0xda85313d, 0x67467d2f, 0x10f466d4, 0x1fe13e24, 0x05b78b48, 0x9e96fd19, 0x5afa6230, ] + +d0x6a0bf4d0=[ 0x00000000, 0x44f508f0, 0xaa22fd20, 0xeed7f5d0, 0xe9b1d166, 0xad44d996, 0x43932c46, 0x076624b6, 0x2fe43499, 0x6b113c69, 0x85c6c9b9, 0xc133c149, 0xc655e5ff, 0x82a0ed0f, 0x6c7718df, 0x2882102f, 0x448eed84, 0x007be574, 0xeeac10a4, 0xaa591854, +0xad3f3ce2, 0xe9ca3412, 0x071dc1c2, 0x43e8c932, 0x6b6ad91d, 0x2f9fd1ed, 0xc148243d, 0x85bd2ccd, 0x82db087b, 0xc62e008b, 0x28f9f55b, 0x6c0cfdab, 0x0866414d, 0x4c9349bd, 0xa244bc6d, 0xe6b1b49d, 0xe1d7902b, 0xa52298db, 0x4bf56d0b, 0x0f0065fb, +0x278275d4, 0x63777d24, 0x8da088f4, 0xc9558004, 0xce33a4b2, 0x8ac6ac42, 0x64115992, 0x20e45162, 0x4ce8acc9, 0x081da439, 0xe6ca51e9, 0xa23f5919, 0xa5597daf, 0xe1ac755f, 0x0f7b808f, 0x4b8e887f, 0x630c9850, 0x27f990a0, 0xc92e6570, 0x8ddb6d80, +0x8abd4936, 0xce4841c6, 0x209fb416, 0x646abce6, 0x268c049c, 0x62790c6c, 0x8caef9bc, 0xc85bf14c, 0xcf3dd5fa, 0x8bc8dd0a, 0x651f28da, 0x21ea202a, 0x09683005, 0x4d9d38f5, 0xa34acd25, 0xe7bfc5d5, 0xe0d9e163, 0xa42ce993, 0x4afb1c43, 0x0e0e14b3, +0x6202e918, 0x26f7e1e8, 0xc8201438, 0x8cd51cc8, 0x8bb3387e, 0xcf46308e, 0x2191c55e, 0x6564cdae, 0x4de6dd81, 0x0913d571, 0xe7c420a1, 0xa3312851, 0xa4570ce7, 0xe0a20417, 0x0e75f1c7, 0x4a80f937, 0x2eea45d1, 0x6a1f4d21, 0x84c8b8f1, 0xc03db001, +0xc75b94b7, 0x83ae9c47, 0x6d796997, 0x298c6167, 0x010e7148, 0x45fb79b8, 0xab2c8c68, 0xefd98498, 0xe8bfa02e, 0xac4aa8de, 0x429d5d0e, 0x066855fe, 0x6a64a855, 0x2e91a0a5, 0xc0465575, 0x84b35d85, 0x83d57933, 0xc72071c3, 0x29f78413, 0x6d028ce3, +0x45809ccc, 0x0175943c, 0xefa261ec, 0xab57691c, 0xac314daa, 0xe8c4455a, 0x0613b08a, 0x42e6b87a, 0x5e200972, 0x1ad50182, 0xf402f452, 0xb0f7fca2, 0xb791d814, 0xf364d0e4, 0x1db32534, 0x59462dc4, 0x71c43deb, 0x3531351b, 0xdbe6c0cb, 0x9f13c83b, +0x9875ec8d, 0xdc80e47d, 0x325711ad, 0x76a2195d, 0x1aaee4f6, 0x5e5bec06, 0xb08c19d6, 0xf4791126, 0xf31f3590, 0xb7ea3d60, 0x593dc8b0, 0x1dc8c040, 0x354ad06f, 0x71bfd89f, 0x9f682d4f, 0xdb9d25bf, 0xdcfb0109, 0x980e09f9, 0x76d9fc29, 0x322cf4d9, +0x5646483f, 0x12b340cf, 0xfc64b51f, 0xb891bdef, 0xbff79959, 0xfb0291a9, 0x15d56479, 0x51206c89, 0x79a27ca6, 0x3d577456, 0xd3808186, 0x97758976, 0x9013adc0, 0xd4e6a530, 0x3a3150e0, 0x7ec45810, 0x12c8a5bb, 0x563dad4b, 0xb8ea589b, 0xfc1f506b, +0xfb7974dd, 0xbf8c7c2d, 0x515b89fd, 0x15ae810d, 0x3d2c9122, 0x79d999d2, 0x970e6c02, 0xd3fb64f2, 0xd49d4044, 0x906848b4, 0x7ebfbd64, 0x3a4ab594, 0x78ac0dee, 0x3c59051e, 0xd28ef0ce, 0x967bf83e, 0x911ddc88, 0xd5e8d478, 0x3b3f21a8, 0x7fca2958, +0x57483977, 0x13bd3187, 0xfd6ac457, 0xb99fcca7, 0xbef9e811, 0xfa0ce0e1, 0x14db1531, 0x502e1dc1, 0x3c22e06a, 0x78d7e89a, 0x96001d4a, 0xd2f515ba, 0xd593310c, 0x916639fc, 0x7fb1cc2c, 0x3b44c4dc, 0x13c6d4f3, 0x5733dc03, 0xb9e429d3, 0xfd112123, +0xfa770595, 0xbe820d65, 0x5055f8b5, 0x14a0f045, 0x70ca4ca3, 0x343f4453, 0xdae8b183, 0x9e1db973, 0x997b9dc5, 0xdd8e9535, 0x335960e5, 0x77ac6815, 0x5f2e783a, 0x1bdb70ca, 0xf50c851a, 0xb1f98dea, 0xb69fa95c, 0xf26aa1ac, 0x1cbd547c, 0x58485c8c, +0x3444a127, 0x70b1a9d7, 0x9e665c07, 0xda9354f7, 0xddf57041, 0x990078b1, 0x77d78d61, 0x33228591, 0x1ba095be, 0x5f559d4e, 0xb182689e, 0xf577606e, 0xf21144d8, 0xb6e44c28, 0x5833b9f8, 0x1cc6b108, 0x00000000, 0x892abe6f, 0xcf94787a, 0x46bec615, +0x09b75c8d, 0x809de2e2, 0xc62324f7, 0x4f099a98, 0xc1b43f30, 0x489e815f, 0x0e20474a, 0x870af925, 0xc80363bd, 0x4129ddd2, 0x07971bc7, 0x8ebda5a8, 0xc39d5421, 0x4ab7ea4e, 0x0c092c5b, 0x85239234, 0xca2a08ac, 0x4300b6c3, 0x05be70d6, 0x8c94ceb9, +0x02296b11, 0x8b03d57e, 0xcdbd136b, 0x4497ad04, 0x0b9e379c, 0x82b489f3, 0xc40a4fe6, 0x4d20f189, 0x3dc7db02, 0xb4ed656d, 0xf253a378, 0x7b791d17, 0x3470878f, 0xbd5a39e0, 0xfbe4fff5, 0x72ce419a, 0xfc73e432, 0x75595a5d, 0x33e79c48, 0xbacd2227, +0xf5c4b8bf, 0x7cee06d0, 0x3a50c0c5, 0xb37a7eaa, 0xfe5a8f23, 0x7770314c, 0x31cef759, 0xb8e44936, 0xf7edd3ae, 0x7ec76dc1, 0x3879abd4, 0xb15315bb, 0x3feeb013, 0xb6c40e7c, 0xf07ac869, 0x79507606, 0x3659ec9e, 0xbf7352f1, 0xf9cd94e4, 0x70e72a8b, +0x27b9a541, 0xae931b2e, 0xe82ddd3b, 0x61076354, 0x2e0ef9cc, 0xa72447a3, 0xe19a81b6, 0x68b03fd9, 0xe60d9a71, 0x6f27241e, 0x2999e20b, 0xa0b35c64, 0xefbac6fc, 0x66907893, 0x202ebe86, 0xa90400e9, 0xe424f160, 0x6d0e4f0f, 0x2bb0891a, 0xa29a3775, +0xed93aded, 0x64b91382, 0x2207d597, 0xab2d6bf8, 0x2590ce50, 0xacba703f, 0xea04b62a, 0x632e0845, 0x2c2792dd, 0xa50d2cb2, 0xe3b3eaa7, 0x6a9954c8, 0x1a7e7e43, 0x9354c02c, 0xd5ea0639, 0x5cc0b856, 0x13c922ce, 0x9ae39ca1, 0xdc5d5ab4, 0x5577e4db, +0xdbca4173, 0x52e0ff1c, 0x145e3909, 0x9d748766, 0xd27d1dfe, 0x5b57a391, 0x1de96584, 0x94c3dbeb, 0xd9e32a62, 0x50c9940d, 0x16775218, 0x9f5dec77, 0xd05476ef, 0x597ec880, 0x1fc00e95, 0x96eab0fa, 0x18571552, 0x917dab3d, 0xd7c36d28, 0x5ee9d347, +0x11e049df, 0x98caf7b0, 0xde7431a5, 0x575e8fca, 0x8582ac1d, 0x0ca81272, 0x4a16d467, 0xc33c6a08, 0x8c35f090, 0x051f4eff, 0x43a188ea, 0xca8b3685, 0x4436932d, 0xcd1c2d42, 0x8ba2eb57, 0x02885538, 0x4d81cfa0, 0xc4ab71cf, 0x8215b7da, 0x0b3f09b5, +0x461ff83c, 0xcf354653, 0x898b8046, 0x00a13e29, 0x4fa8a4b1, 0xc6821ade, 0x803cdccb, 0x091662a4, 0x87abc70c, 0x0e817963, 0x483fbf76, 0xc1150119, 0x8e1c9b81, 0x073625ee, 0x4188e3fb, 0xc8a25d94, 0xb845771f, 0x316fc970, 0x77d10f65, 0xfefbb10a, +0xb1f22b92, 0x38d895fd, 0x7e6653e8, 0xf74ced87, 0x79f1482f, 0xf0dbf640, 0xb6653055, 0x3f4f8e3a, 0x704614a2, 0xf96caacd, 0xbfd26cd8, 0x36f8d2b7, 0x7bd8233e, 0xf2f29d51, 0xb44c5b44, 0x3d66e52b, 0x726f7fb3, 0xfb45c1dc, 0xbdfb07c9, 0x34d1b9a6, +0xba6c1c0e, 0x3346a261, 0x75f86474, 0xfcd2da1b, 0xb3db4083, 0x3af1feec, 0x7c4f38f9, 0xf5658696, 0xa23b095c, 0x2b11b733, 0x6daf7126, 0xe485cf49, 0xab8c55d1, 0x22a6ebbe, 0x64182dab, 0xed3293c4, 0x638f366c, 0xeaa58803, 0xac1b4e16, 0x2531f079, +0x6a386ae1, 0xe312d48e, 0xa5ac129b, 0x2c86acf4, 0x61a65d7d, 0xe88ce312, 0xae322507, 0x27189b68, 0x681101f0, 0xe13bbf9f, 0xa785798a, 0x2eafc7e5, 0xa012624d, 0x2938dc22, 0x6f861a37, 0xe6aca458, 0xa9a53ec0, 0x208f80af, 0x663146ba, 0xef1bf8d5, +0x9ffcd25e, 0x16d66c31, 0x5068aa24, 0xd942144b, 0x964b8ed3, 0x1f6130bc, 0x59dff6a9, 0xd0f548c6, 0x5e48ed6e, 0xd7625301, 0x91dc9514, 0x18f62b7b, 0x57ffb1e3, 0xded50f8c, 0x986bc999, 0x114177f6, 0x5c61867f, 0xd54b3810, 0x93f5fe05, 0x1adf406a, +0x55d6daf2, 0xdcfc649d, 0x9a42a288, 0x13681ce7, 0x9dd5b94f, 0x14ff0720, 0x5241c135, 0xdb6b7f5a, 0x9462e5c2, 0x1d485bad, 0x5bf69db8, 0xd2dc23d7, 0x00000000, 0x588bae3b, 0x4a2c9b8b, 0x12a735b0, 0xbeb95dfd, 0xe632f3c6, 0xf495c676, 0xac1e684d, +0x82df8d91, 0xda5423aa, 0xc8f3161a, 0x9078b821, 0x3c66d06c, 0x64ed7e57, 0x764a4be7, 0x2ec1e5dc, 0xbdb6a361, 0xe53d0d5a, 0xf79a38ea, 0xaf1196d1, 0x030ffe9c, 0x5b8450a7, 0x49236517, 0x11a8cb2c, 0x3f692ef0, 0x67e280cb, 0x7545b57b, 0x2dce1b40, +0x81d0730d, 0xd95bdd36, 0xcbfce886, 0x937746bd, 0x2bc0b505, 0x734b1b3e, 0x61ec2e8e, 0x396780b5, 0x9579e8f8, 0xcdf246c3, 0xdf557373, 0x87dedd48, 0xa91f3894, 0xf19496af, 0xe333a31f, 0xbbb80d24, 0x17a66569, 0x4f2dcb52, 0x5d8afee2, 0x050150d9, +0x96761664, 0xcefdb85f, 0xdc5a8def, 0x84d123d4, 0x28cf4b99, 0x7044e5a2, 0x62e3d012, 0x3a687e29, 0x14a99bf5, 0x4c2235ce, 0x5e85007e, 0x060eae45, 0xaa10c608, 0xf29b6833, 0xe03c5d83, 0xb8b7f3b8, 0x659c12fa, 0x3d17bcc1, 0x2fb08971, 0x773b274a, +0xdb254f07, 0x83aee13c, 0x9109d48c, 0xc9827ab7, 0xe7439f6b, 0xbfc83150, 0xad6f04e0, 0xf5e4aadb, 0x59fac296, 0x01716cad, 0x13d6591d, 0x4b5df726, 0xd82ab19b, 0x80a11fa0, 0x92062a10, 0xca8d842b, 0x6693ec66, 0x3e18425d, 0x2cbf77ed, 0x7434d9d6, +0x5af53c0a, 0x027e9231, 0x10d9a781, 0x485209ba, 0xe44c61f7, 0xbcc7cfcc, 0xae60fa7c, 0xf6eb5447, 0x4e5ca7ff, 0x16d709c4, 0x04703c74, 0x5cfb924f, 0xf0e5fa02, 0xa86e5439, 0xbac96189, 0xe242cfb2, 0xcc832a6e, 0x94088455, 0x86afb1e5, 0xde241fde, +0x723a7793, 0x2ab1d9a8, 0x3816ec18, 0x609d4223, 0xf3ea049e, 0xab61aaa5, 0xb9c69f15, 0xe14d312e, 0x4d535963, 0x15d8f758, 0x077fc2e8, 0x5ff46cd3, 0x7135890f, 0x29be2734, 0x3b191284, 0x6392bcbf, 0xcf8cd4f2, 0x97077ac9, 0x85a04f79, 0xdd2be142, +0xb73650ef, 0xefbdfed4, 0xfd1acb64, 0xa591655f, 0x098f0d12, 0x5104a329, 0x43a39699, 0x1b2838a2, 0x35e9dd7e, 0x6d627345, 0x7fc546f5, 0x274ee8ce, 0x8b508083, 0xd3db2eb8, 0xc17c1b08, 0x99f7b533, 0x0a80f38e, 0x520b5db5, 0x40ac6805, 0x1827c63e, +0xb439ae73, 0xecb20048, 0xfe1535f8, 0xa69e9bc3, 0x885f7e1f, 0xd0d4d024, 0xc273e594, 0x9af84baf, 0x36e623e2, 0x6e6d8dd9, 0x7ccab869, 0x24411652, 0x9cf6e5ea, 0xc47d4bd1, 0xd6da7e61, 0x8e51d05a, 0x224fb817, 0x7ac4162c, 0x6863239c, 0x30e88da7, +0x1e29687b, 0x46a2c640, 0x5405f3f0, 0x0c8e5dcb, 0xa0903586, 0xf81b9bbd, 0xeabcae0d, 0xb2370036, 0x2140468b, 0x79cbe8b0, 0x6b6cdd00, 0x33e7733b, 0x9ff91b76, 0xc772b54d, 0xd5d580fd, 0x8d5e2ec6, 0xa39fcb1a, 0xfb146521, 0xe9b35091, 0xb138feaa, +0x1d2696e7, 0x45ad38dc, 0x570a0d6c, 0x0f81a357, 0xd2aa4215, 0x8a21ec2e, 0x9886d99e, 0xc00d77a5, 0x6c131fe8, 0x3498b1d3, 0x263f8463, 0x7eb42a58, 0x5075cf84, 0x08fe61bf, 0x1a59540f, 0x42d2fa34, 0xeecc9279, 0xb6473c42, 0xa4e009f2, 0xfc6ba7c9, +0x6f1ce174, 0x37974f4f, 0x25307aff, 0x7dbbd4c4, 0xd1a5bc89, 0x892e12b2, 0x9b892702, 0xc3028939, 0xedc36ce5, 0xb548c2de, 0xa7eff76e, 0xff645955, 0x537a3118, 0x0bf19f23, 0x1956aa93, 0x41dd04a8, 0xf96af710, 0xa1e1592b, 0xb3466c9b, 0xebcdc2a0, +0x47d3aaed, 0x1f5804d6, 0x0dff3166, 0x55749f5d, 0x7bb57a81, 0x233ed4ba, 0x3199e10a, 0x69124f31, 0xc50c277c, 0x9d878947, 0x8f20bcf7, 0xd7ab12cc, 0x44dc5471, 0x1c57fa4a, 0x0ef0cffa, 0x567b61c1, 0xfa65098c, 0xa2eea7b7, 0xb0499207, 0xe8c23c3c, +0xc603d9e0, 0x9e8877db, 0x8c2f426b, 0xd4a4ec50, 0x78ba841d, 0x20312a26, 0x32961f96, 0x6a1db1ad, 0x00000000, 0xe89cc585, 0x6206293b, 0x8a9aecbe, 0xab6121ff, 0x43fde47a, 0xc96708c4, 0x21fbcd41, 0x030c6faa, 0xeb90aa2f, 0x610a4691, 0x89968314, +0xa86d4e55, 0x40f18bd0, 0xca6b676e, 0x22f7a2eb, 0x088f3d5a, 0xe013f8df, 0x6a891461, 0x8215d1e4, 0xa3ee1ca5, 0x4b72d920, 0xc1e8359e, 0x2974f01b, 0x0b8352f0, 0xe31f9775, 0x69857bcb, 0x8119be4e, 0xa0e2730f, 0x487eb68a, 0xc2e45a34, 0x2a789fb1, +0xb514791b, 0x5d88bc9e, 0xd7125020, 0x3f8e95a5, 0x1e7558e4, 0xf6e99d61, 0x7c7371df, 0x94efb45a, 0xb61816b1, 0x5e84d334, 0xd41e3f8a, 0x3c82fa0f, 0x1d79374e, 0xf5e5f2cb, 0x7f7f1e75, 0x97e3dbf0, 0xbd9b4441, 0x550781c4, 0xdf9d6d7a, 0x3701a8ff, +0x16fa65be, 0xfe66a03b, 0x74fc4c85, 0x9c608900, 0xbe972beb, 0x560bee6e, 0xdc9102d0, 0x340dc755, 0x15f60a14, 0xfd6acf91, 0x77f0232f, 0x9f6ce6aa, 0xe76d5061, 0x0ff195e4, 0x856b795a, 0x6df7bcdf, 0x4c0c719e, 0xa490b41b, 0x2e0a58a5, 0xc6969d20, +0xe4613fcb, 0x0cfdfa4e, 0x866716f0, 0x6efbd375, 0x4f001e34, 0xa79cdbb1, 0x2d06370f, 0xc59af28a, 0xefe26d3b, 0x077ea8be, 0x8de44400, 0x65788185, 0x44834cc4, 0xac1f8941, 0x268565ff, 0xce19a07a, 0xecee0291, 0x0472c714, 0x8ee82baa, 0x6674ee2f, +0x478f236e, 0xaf13e6eb, 0x25890a55, 0xcd15cfd0, 0x5279297a, 0xbae5ecff, 0x307f0041, 0xd8e3c5c4, 0xf9180885, 0x1184cd00, 0x9b1e21be, 0x7382e43b, 0x517546d0, 0xb9e98355, 0x33736feb, 0xdbefaa6e, 0xfa14672f, 0x1288a2aa, 0x98124e14, 0x708e8b91, +0x5af61420, 0xb26ad1a5, 0x38f03d1b, 0xd06cf89e, 0xf19735df, 0x190bf05a, 0x93911ce4, 0x7b0dd961, 0x59fa7b8a, 0xb166be0f, 0x3bfc52b1, 0xd3609734, 0xf29b5a75, 0x1a079ff0, 0x909d734e, 0x7801b6cb, 0xd18f0483, 0x3913c106, 0xb3892db8, 0x5b15e83d, +0x7aee257c, 0x9272e0f9, 0x18e80c47, 0xf074c9c2, 0xd2836b29, 0x3a1faeac, 0xb0854212, 0x58198797, 0x79e24ad6, 0x917e8f53, 0x1be463ed, 0xf378a668, 0xd90039d9, 0x319cfc5c, 0xbb0610e2, 0x539ad567, 0x72611826, 0x9afddda3, 0x1067311d, 0xf8fbf498, +0xda0c5673, 0x329093f6, 0xb80a7f48, 0x5096bacd, 0x716d778c, 0x99f1b209, 0x136b5eb7, 0xfbf79b32, 0x649b7d98, 0x8c07b81d, 0x069d54a3, 0xee019126, 0xcffa5c67, 0x276699e2, 0xadfc755c, 0x4560b0d9, 0x67971232, 0x8f0bd7b7, 0x05913b09, 0xed0dfe8c, +0xccf633cd, 0x246af648, 0xaef01af6, 0x466cdf73, 0x6c1440c2, 0x84888547, 0x0e1269f9, 0xe68eac7c, 0xc775613d, 0x2fe9a4b8, 0xa5734806, 0x4def8d83, 0x6f182f68, 0x8784eaed, 0x0d1e0653, 0xe582c3d6, 0xc4790e97, 0x2ce5cb12, 0xa67f27ac, 0x4ee3e229, +0x36e254e2, 0xde7e9167, 0x54e47dd9, 0xbc78b85c, 0x9d83751d, 0x751fb098, 0xff855c26, 0x171999a3, 0x35ee3b48, 0xdd72fecd, 0x57e81273, 0xbf74d7f6, 0x9e8f1ab7, 0x7613df32, 0xfc89338c, 0x1415f609, 0x3e6d69b8, 0xd6f1ac3d, 0x5c6b4083, 0xb4f78506, +0x950c4847, 0x7d908dc2, 0xf70a617c, 0x1f96a4f9, 0x3d610612, 0xd5fdc397, 0x5f672f29, 0xb7fbeaac, 0x960027ed, 0x7e9ce268, 0xf4060ed6, 0x1c9acb53, 0x83f62df9, 0x6b6ae87c, 0xe1f004c2, 0x096cc147, 0x28970c06, 0xc00bc983, 0x4a91253d, 0xa20de0b8, +0x80fa4253, 0x686687d6, 0xe2fc6b68, 0x0a60aeed, 0x2b9b63ac, 0xc307a629, 0x499d4a97, 0xa1018f12, 0x8b7910a3, 0x63e5d526, 0xe97f3998, 0x01e3fc1d, 0x2018315c, 0xc884f4d9, 0x421e1867, 0xaa82dde2, 0x88757f09, 0x60e9ba8c, 0xea735632, 0x02ef93b7, +0x23145ef6, 0xcb889b73, 0x411277cd, 0xa98eb248, 0x00000000, 0xbfa4b165, 0x70db9ebd, 0xcf7f2fd8, 0xc7faa9dd, 0x785e18b8, 0xb7213760, 0x08858605, 0xe0d0d58c, 0x5f7464e9, 0x900b4b31, 0x2faffa54, 0x272a7c51, 0x988ecd34, 0x57f1e2ec, 0xe8555389, +0xf11c5ec3, 0x4eb8efa6, 0x81c7c07e, 0x3e63711b, 0x36e6f71e, 0x8942467b, 0x463d69a3, 0xf999d8c6, 0x11cc8b4f, 0xae683a2a, 0x611715f2, 0xdeb3a497, 0xd6362292, 0x699293f7, 0xa6edbc2f, 0x19490d4a, 0xb53f9f3d, 0x0a9b2e58, 0xc5e40180, 0x7a40b0e5, +0x72c536e0, 0xcd618785, 0x021ea85d, 0xbdba1938, 0x55ef4ab1, 0xea4bfbd4, 0x2534d40c, 0x9a906569, 0x9215e36c, 0x2db15209, 0xe2ce7dd1, 0x5d6accb4, 0x4423c1fe, 0xfb87709b, 0x34f85f43, 0x8b5cee26, 0x83d96823, 0x3c7dd946, 0xf302f69e, 0x4ca647fb, +0xa4f31472, 0x1b57a517, 0xd4288acf, 0x6b8c3baa, 0x6309bdaf, 0xdcad0cca, 0x13d22312, 0xac769277, 0xd39855a0, 0x6c3ce4c5, 0xa343cb1d, 0x1ce77a78, 0x1462fc7d, 0xabc64d18, 0x64b962c0, 0xdb1dd3a5, 0x3348802c, 0x8cec3149, 0x43931e91, 0xfc37aff4, +0xf4b229f1, 0x4b169894, 0x8469b74c, 0x3bcd0629, 0x22840b63, 0x9d20ba06, 0x525f95de, 0xedfb24bb, 0xe57ea2be, 0x5ada13db, 0x95a53c03, 0x2a018d66, 0xc254deef, 0x7df06f8a, 0xb28f4052, 0x0d2bf137, 0x05ae7732, 0xba0ac657, 0x7575e98f, 0xcad158ea, +0x66a7ca9d, 0xd9037bf8, 0x167c5420, 0xa9d8e545, 0xa15d6340, 0x1ef9d225, 0xd186fdfd, 0x6e224c98, 0x86771f11, 0x39d3ae74, 0xf6ac81ac, 0x490830c9, 0x418db6cc, 0xfe2907a9, 0x31562871, 0x8ef29914, 0x97bb945e, 0x281f253b, 0xe7600ae3, 0x58c4bb86, +0x50413d83, 0xefe58ce6, 0x209aa33e, 0x9f3e125b, 0x776b41d2, 0xc8cff0b7, 0x07b0df6f, 0xb8146e0a, 0xb091e80f, 0x0f35596a, 0xc04a76b2, 0x7feec7d7, 0x964b0217, 0x29efb372, 0xe6909caa, 0x59342dcf, 0x51b1abca, 0xee151aaf, 0x216a3577, 0x9ece8412, +0x769bd79b, 0xc93f66fe, 0x06404926, 0xb9e4f843, 0xb1617e46, 0x0ec5cf23, 0xc1bae0fb, 0x7e1e519e, 0x67575cd4, 0xd8f3edb1, 0x178cc269, 0xa828730c, 0xa0adf509, 0x1f09446c, 0xd0766bb4, 0x6fd2dad1, 0x87878958, 0x3823383d, 0xf75c17e5, 0x48f8a680, +0x407d2085, 0xffd991e0, 0x30a6be38, 0x8f020f5d, 0x23749d2a, 0x9cd02c4f, 0x53af0397, 0xec0bb2f2, 0xe48e34f7, 0x5b2a8592, 0x9455aa4a, 0x2bf11b2f, 0xc3a448a6, 0x7c00f9c3, 0xb37fd61b, 0x0cdb677e, 0x045ee17b, 0xbbfa501e, 0x74857fc6, 0xcb21cea3, +0xd268c3e9, 0x6dcc728c, 0xa2b35d54, 0x1d17ec31, 0x15926a34, 0xaa36db51, 0x6549f489, 0xdaed45ec, 0x32b81665, 0x8d1ca700, 0x426388d8, 0xfdc739bd, 0xf542bfb8, 0x4ae60edd, 0x85992105, 0x3a3d9060, 0x45d357b7, 0xfa77e6d2, 0x3508c90a, 0x8aac786f, +0x8229fe6a, 0x3d8d4f0f, 0xf2f260d7, 0x4d56d1b2, 0xa503823b, 0x1aa7335e, 0xd5d81c86, 0x6a7cade3, 0x62f92be6, 0xdd5d9a83, 0x1222b55b, 0xad86043e, 0xb4cf0974, 0x0b6bb811, 0xc41497c9, 0x7bb026ac, 0x7335a0a9, 0xcc9111cc, 0x03ee3e14, 0xbc4a8f71, +0x541fdcf8, 0xebbb6d9d, 0x24c44245, 0x9b60f320, 0x93e57525, 0x2c41c440, 0xe33eeb98, 0x5c9a5afd, 0xf0ecc88a, 0x4f4879ef, 0x80375637, 0x3f93e752, 0x37166157, 0x88b2d032, 0x47cdffea, 0xf8694e8f, 0x103c1d06, 0xaf98ac63, 0x60e783bb, 0xdf4332de, +0xd7c6b4db, 0x686205be, 0xa71d2a66, 0x18b99b03, 0x01f09649, 0xbe54272c, 0x712b08f4, 0xce8fb991, 0xc60a3f94, 0x79ae8ef1, 0xb6d1a129, 0x0975104c, 0xe12043c5, 0x5e84f2a0, 0x91fbdd78, 0x2e5f6c1d, 0x26daea18, 0x997e5b7d, 0x560174a5, 0xe9a5c5c0, +0x00000000, 0x85ae995e, 0x21ceee9c, 0xa46077c2, 0x6ac3a1b9, 0xef6d38e7, 0x4b0d4f25, 0xcea3d67b, 0xe2ddd316, 0x67734a48, 0xc3133d8a, 0x46bda4d4, 0x881e72af, 0x0db0ebf1, 0xa9d09c33, 0x2c7e056d, 0x5ff08342, 0xda5e1a1c, 0x7e3e6dde, 0xfb90f480, +0x353322fb, 0xb09dbba5, 0x14fdcc67, 0x91535539, 0xbd2d5054, 0x3883c90a, 0x9ce3bec8, 0x194d2796, 0xd7eef1ed, 0x524068b3, 0xf6201f71, 0x738e862f, 0x069ea15a, 0x83303804, 0x27504fc6, 0xa2fed698, 0x6c5d00e3, 0xe9f399bd, 0x4d93ee7f, 0xc83d7721, +0xe443724c, 0x61edeb12, 0xc58d9cd0, 0x4023058e, 0x8e80d3f5, 0x0b2e4aab, 0xaf4e3d69, 0x2ae0a437, 0x596e2218, 0xdcc0bb46, 0x78a0cc84, 0xfd0e55da, 0x33ad83a1, 0xb6031aff, 0x12636d3d, 0x97cdf463, 0xbbb3f10e, 0x3e1d6850, 0x9a7d1f92, 0x1fd386cc, +0xd17050b7, 0x54dec9e9, 0xf0bebe2b, 0x75102775, 0x1a8a2ea7, 0x9f24b7f9, 0x3b44c03b, 0xbeea5965, 0x70498f1e, 0xf5e71640, 0x51876182, 0xd429f8dc, 0xf857fdb1, 0x7df964ef, 0xd999132d, 0x5c378a73, 0x92945c08, 0x173ac556, 0xb35ab294, 0x36f42bca, +0x457aade5, 0xc0d434bb, 0x64b44379, 0xe11ada27, 0x2fb90c5c, 0xaa179502, 0x0e77e2c0, 0x8bd97b9e, 0xa7a77ef3, 0x2209e7ad, 0x8669906f, 0x03c70931, 0xcd64df4a, 0x48ca4614, 0xecaa31d6, 0x6904a888, 0x1c148ffd, 0x99ba16a3, 0x3dda6161, 0xb874f83f, +0x76d72e44, 0xf379b71a, 0x5719c0d8, 0xd2b75986, 0xfec95ceb, 0x7b67c5b5, 0xdf07b277, 0x5aa92b29, 0x940afd52, 0x11a4640c, 0xb5c413ce, 0x306a8a90, 0x43e40cbf, 0xc64a95e1, 0x622ae223, 0xe7847b7d, 0x2927ad06, 0xac893458, 0x08e9439a, 0x8d47dac4, +0xa139dfa9, 0x249746f7, 0x80f73135, 0x0559a86b, 0xcbfa7e10, 0x4e54e74e, 0xea34908c, 0x6f9a09d2, 0x6889b7fc, 0xed272ea2, 0x49475960, 0xcce9c03e, 0x024a1645, 0x87e48f1b, 0x2384f8d9, 0xa62a6187, 0x8a5464ea, 0x0ffafdb4, 0xab9a8a76, 0x2e341328, +0xe097c553, 0x65395c0d, 0xc1592bcf, 0x44f7b291, 0x377934be, 0xb2d7ade0, 0x16b7da22, 0x9319437c, 0x5dba9507, 0xd8140c59, 0x7c747b9b, 0xf9dae2c5, 0xd5a4e7a8, 0x500a7ef6, 0xf46a0934, 0x71c4906a, 0xbf674611, 0x3ac9df4f, 0x9ea9a88d, 0x1b0731d3, +0x6e1716a6, 0xebb98ff8, 0x4fd9f83a, 0xca776164, 0x04d4b71f, 0x817a2e41, 0x251a5983, 0xa0b4c0dd, 0x8ccac5b0, 0x09645cee, 0xad042b2c, 0x28aab272, 0xe6096409, 0x63a7fd57, 0xc7c78a95, 0x426913cb, 0x31e795e4, 0xb4490cba, 0x10297b78, 0x9587e226, +0x5b24345d, 0xde8aad03, 0x7aeadac1, 0xff44439f, 0xd33a46f2, 0x5694dfac, 0xf2f4a86e, 0x775a3130, 0xb9f9e74b, 0x3c577e15, 0x983709d7, 0x1d999089, 0x7203995b, 0xf7ad0005, 0x53cd77c7, 0xd663ee99, 0x18c038e2, 0x9d6ea1bc, 0x390ed67e, 0xbca04f20, +0x90de4a4d, 0x1570d313, 0xb110a4d1, 0x34be3d8f, 0xfa1debf4, 0x7fb372aa, 0xdbd30568, 0x5e7d9c36, 0x2df31a19, 0xa85d8347, 0x0c3df485, 0x89936ddb, 0x4730bba0, 0xc29e22fe, 0x66fe553c, 0xe350cc62, 0xcf2ec90f, 0x4a805051, 0xeee02793, 0x6b4ebecd, +0xa5ed68b6, 0x2043f1e8, 0x8423862a, 0x018d1f74, 0x749d3801, 0xf133a15f, 0x5553d69d, 0xd0fd4fc3, 0x1e5e99b8, 0x9bf000e6, 0x3f907724, 0xba3eee7a, 0x9640eb17, 0x13ee7249, 0xb78e058b, 0x32209cd5, 0xfc834aae, 0x792dd3f0, 0xdd4da432, 0x58e33d6c, +0x2b6dbb43, 0xaec3221d, 0x0aa355df, 0x8f0dcc81, 0x41ae1afa, 0xc40083a4, 0x6060f466, 0xe5ce6d38, 0xc9b06855, 0x4c1ef10b, 0xe87e86c9, 0x6dd01f97, 0xa373c9ec, 0x26dd50b2, 0x82bd2770, 0x0713be2e, 0x00000000, 0xf57c57a7, 0x5e13cea0, 0xab6f9907, +0x84b70155, 0x71cb56f2, 0xdaa4cff5, 0x2fd89852, 0xea1e07a1, 0x1f625006, 0xb40dc901, 0x41719ea6, 0x6ea906f4, 0x9bd55153, 0x30bac854, 0xc5c69ff3, 0x78cab77b, 0x8db6e0dc, 0x26d979db, 0xd3a52e7c, 0xfc7db62e, 0x0901e189, 0xa26e788e, 0x57122f29, +0x92d4b0da, 0x67a8e77d, 0xccc77e7a, 0x39bb29dd, 0x1663b18f, 0xe31fe628, 0x48707f2f, 0xbd0c2888, 0x0d479435, 0xf83bc392, 0x53545a95, 0xa6280d32, 0x89f09560, 0x7c8cc2c7, 0xd7e35bc0, 0x229f0c67, 0xe7599394, 0x1225c433, 0xb94a5d34, 0x4c360a93, +0x63ee92c1, 0x9692c566, 0x3dfd5c61, 0xc8810bc6, 0x758d234e, 0x80f174e9, 0x2b9eedee, 0xdee2ba49, 0xf13a221b, 0x044675bc, 0xaf29ecbb, 0x5a55bb1c, 0x9f9324ef, 0x6aef7348, 0xc180ea4f, 0x34fcbde8, 0x1b2425ba, 0xee58721d, 0x4537eb1a, 0xb04bbcbd, +0x344d886b, 0xc131dfcc, 0x6a5e46cb, 0x9f22116c, 0xb0fa893e, 0x4586de99, 0xeee9479e, 0x1b951039, 0xde538fca, 0x2b2fd86d, 0x8040416a, 0x753c16cd, 0x5ae48e9f, 0xaf98d938, 0x04f7403f, 0xf18b1798, 0x4c873f10, 0xb9fb68b7, 0x1294f1b0, 0xe7e8a617, +0xc8303e45, 0x3d4c69e2, 0x9623f0e5, 0x635fa742, 0xa69938b1, 0x53e56f16, 0xf88af611, 0x0df6a1b6, 0x222e39e4, 0xd7526e43, 0x7c3df744, 0x8941a0e3, 0x390a1c5e, 0xcc764bf9, 0x6719d2fe, 0x92658559, 0xbdbd1d0b, 0x48c14aac, 0xe3aed3ab, 0x16d2840c, +0xd3141bff, 0x26684c58, 0x8d07d55f, 0x787b82f8, 0x57a31aaa, 0xa2df4d0d, 0x09b0d40a, 0xfccc83ad, 0x41c0ab25, 0xb4bcfc82, 0x1fd36585, 0xeaaf3222, 0xc577aa70, 0x300bfdd7, 0x9b6464d0, 0x6e183377, 0xabdeac84, 0x5ea2fb23, 0xf5cd6224, 0x00b13583, +0x2f69add1, 0xda15fa76, 0x717a6371, 0x840634d6, 0x6d06dded, 0x987a8a4a, 0x3315134d, 0xc66944ea, 0xe9b1dcb8, 0x1ccd8b1f, 0xb7a21218, 0x42de45bf, 0x8718da4c, 0x72648deb, 0xd90b14ec, 0x2c77434b, 0x03afdb19, 0xf6d38cbe, 0x5dbc15b9, 0xa8c0421e, +0x15cc6a96, 0xe0b03d31, 0x4bdfa436, 0xbea3f391, 0x917b6bc3, 0x64073c64, 0xcf68a563, 0x3a14f2c4, 0xffd26d37, 0x0aae3a90, 0xa1c1a397, 0x54bdf430, 0x7b656c62, 0x8e193bc5, 0x2576a2c2, 0xd00af565, 0x604149d8, 0x953d1e7f, 0x3e528778, 0xcb2ed0df, +0xe4f6488d, 0x118a1f2a, 0xbae5862d, 0x4f99d18a, 0x8a5f4e79, 0x7f2319de, 0xd44c80d9, 0x2130d77e, 0x0ee84f2c, 0xfb94188b, 0x50fb818c, 0xa587d62b, 0x188bfea3, 0xedf7a904, 0x46983003, 0xb3e467a4, 0x9c3cfff6, 0x6940a851, 0xc22f3156, 0x375366f1, +0xf295f902, 0x07e9aea5, 0xac8637a2, 0x59fa6005, 0x7622f857, 0x835eaff0, 0x283136f7, 0xdd4d6150, 0x594b5586, 0xac370221, 0x07589b26, 0xf224cc81, 0xddfc54d3, 0x28800374, 0x83ef9a73, 0x7693cdd4, 0xb3555227, 0x46290580, 0xed469c87, 0x183acb20, +0x37e25372, 0xc29e04d5, 0x69f19dd2, 0x9c8dca75, 0x2181e2fd, 0xd4fdb55a, 0x7f922c5d, 0x8aee7bfa, 0xa536e3a8, 0x504ab40f, 0xfb252d08, 0x0e597aaf, 0xcb9fe55c, 0x3ee3b2fb, 0x958c2bfc, 0x60f07c5b, 0x4f28e409, 0xba54b3ae, 0x113b2aa9, 0xe4477d0e, +0x540cc1b3, 0xa1709614, 0x0a1f0f13, 0xff6358b4, 0xd0bbc0e6, 0x25c79741, 0x8ea80e46, 0x7bd459e1, 0xbe12c612, 0x4b6e91b5, 0xe00108b2, 0x157d5f15, 0x3aa5c747, 0xcfd990e0, 0x64b609e7, 0x91ca5e40, 0x2cc676c8, 0xd9ba216f, 0x72d5b868, 0x87a9efcf, +0xa871779d, 0x5d0d203a, 0xf662b93d, 0x031eee9a, 0xc6d87169, 0x33a426ce, 0x98cbbfc9, 0x6db7e86e, 0x426f703c, 0xb713279b, 0x1c7cbe9c, 0xe900e93b, 0x00000000, 0x69e1354f, 0xacf53f25, 0xc5140a6a, 0x74a35347, 0x1d426608, 0xd8566c62, 0xb1b7592d, +0x5e60e411, 0x3781d15e, 0xf295db34, 0x9b74ee7b, 0x2ac3b756, 0x43228219, 0x86368873, 0xefd7bd3c, 0x97a64493, 0xfe4771dc, 0x3b537bb6, 0x52b24ef9, 0xe30517d4, 0x8ae4229b, 0x4ff028f1, 0x26111dbe, 0xc9c6a082, 0xa02795cd, 0x65339fa7, 0x0cd2aae8, +0xbd65f3c5, 0xd484c68a, 0x1190cce0, 0x7871f9af, 0xe59038d6, 0x8c710d99, 0x496507f3, 0x208432bc, 0x91336b91, 0xf8d25ede, 0x3dc654b4, 0x542761fb, 0xbbf0dcc7, 0xd211e988, 0x1705e3e2, 0x7ee4d6ad, 0xcf538f80, 0xa6b2bacf, 0x63a6b0a5, 0x0a4785ea, +0x72367c45, 0x1bd7490a, 0xdec34360, 0xb722762f, 0x06952f02, 0x6f741a4d, 0xaa601027, 0xc3812568, 0x2c569854, 0x45b7ad1b, 0x80a3a771, 0xe942923e, 0x58f5cb13, 0x3114fe5c, 0xf400f436, 0x9de1c179, 0xfa04f740, 0x93e5c20f, 0x56f1c865, 0x3f10fd2a, +0x8ea7a407, 0xe7469148, 0x22529b22, 0x4bb3ae6d, 0xa4641351, 0xcd85261e, 0x08912c74, 0x6170193b, 0xd0c74016, 0xb9267559, 0x7c327f33, 0x15d34a7c, 0x6da2b3d3, 0x0443869c, 0xc1578cf6, 0xa8b6b9b9, 0x1901e094, 0x70e0d5db, 0xb5f4dfb1, 0xdc15eafe, +0x33c257c2, 0x5a23628d, 0x9f3768e7, 0xf6d65da8, 0x47610485, 0x2e8031ca, 0xeb943ba0, 0x82750eef, 0x1f94cf96, 0x7675fad9, 0xb361f0b3, 0xda80c5fc, 0x6b379cd1, 0x02d6a99e, 0xc7c2a3f4, 0xae2396bb, 0x41f42b87, 0x28151ec8, 0xed0114a2, 0x84e021ed, +0x355778c0, 0x5cb64d8f, 0x99a247e5, 0xf04372aa, 0x88328b05, 0xe1d3be4a, 0x24c7b420, 0x4d26816f, 0xfc91d842, 0x9570ed0d, 0x5064e767, 0x3985d228, 0xd6526f14, 0xbfb35a5b, 0x7aa75031, 0x1346657e, 0xa2f13c53, 0xcb10091c, 0x0e040376, 0x67e53639, +0x36c28753, 0x5f23b21c, 0x9a37b876, 0xf3d68d39, 0x4261d414, 0x2b80e15b, 0xee94eb31, 0x8775de7e, 0x68a26342, 0x0143560d, 0xc4575c67, 0xadb66928, 0x1c013005, 0x75e0054a, 0xb0f40f20, 0xd9153a6f, 0xa164c3c0, 0xc885f68f, 0x0d91fce5, 0x6470c9aa, +0xd5c79087, 0xbc26a5c8, 0x7932afa2, 0x10d39aed, 0xff0427d1, 0x96e5129e, 0x53f118f4, 0x3a102dbb, 0x8ba77496, 0xe24641d9, 0x27524bb3, 0x4eb37efc, 0xd352bf85, 0xbab38aca, 0x7fa780a0, 0x1646b5ef, 0xa7f1ecc2, 0xce10d98d, 0x0b04d3e7, 0x62e5e6a8, +0x8d325b94, 0xe4d36edb, 0x21c764b1, 0x482651fe, 0xf99108d3, 0x90703d9c, 0x556437f6, 0x3c8502b9, 0x44f4fb16, 0x2d15ce59, 0xe801c433, 0x81e0f17c, 0x3057a851, 0x59b69d1e, 0x9ca29774, 0xf543a23b, 0x1a941f07, 0x73752a48, 0xb6612022, 0xdf80156d, +0x6e374c40, 0x07d6790f, 0xc2c27365, 0xab23462a, 0xccc67013, 0xa527455c, 0x60334f36, 0x09d27a79, 0xb8652354, 0xd184161b, 0x14901c71, 0x7d71293e, 0x92a69402, 0xfb47a14d, 0x3e53ab27, 0x57b29e68, 0xe605c745, 0x8fe4f20a, 0x4af0f860, 0x2311cd2f, +0x5b603480, 0x328101cf, 0xf7950ba5, 0x9e743eea, 0x2fc367c7, 0x46225288, 0x833658e2, 0xead76dad, 0x0500d091, 0x6ce1e5de, 0xa9f5efb4, 0xc014dafb, 0x71a383d6, 0x1842b699, 0xdd56bcf3, 0xb4b789bc, 0x295648c5, 0x40b77d8a, 0x85a377e0, 0xec4242af, +0x5df51b82, 0x34142ecd, 0xf10024a7, 0x98e111e8, 0x7736acd4, 0x1ed7999b, 0xdbc393f1, 0xb222a6be, 0x0395ff93, 0x6a74cadc, 0xaf60c0b6, 0xc681f5f9, 0xbef00c56, 0xd7113919, 0x12053373, 0x7be4063c, 0xca535f11, 0xa3b26a5e, 0x66a66034, 0x0f47557b, +0xe090e847, 0x8971dd08, 0x4c65d762, 0x2584e22d, 0x9433bb00, 0xfdd28e4f, 0x38c68425, 0x5127b16a, 0x00000000, 0x26045a6d, 0x7d13aeef, 0x5b17f482, 0xeaef236b, 0xcceb7906, 0x97fc8d84, 0xb1f8d7e9, 0xd52a0703, 0xf32e5d6e, 0xa839a9ec, 0x8e3df381, +0x3fc52468, 0x19c17e05, 0x42d68a87, 0x64d2d0ea, 0xf4741f51, 0xd270453c, 0x8967b1be, 0xaf63ebd3, 0x1e9b3c3a, 0x389f6657, 0x638892d5, 0x458cc8b8, 0x215e1852, 0x075a423f, 0x5c4db6bd, 0x7a49ecd0, 0xcbb13b39, 0xedb56154, 0xb6a295d6, 0x90a6cfbb, +0x50582f69, 0x765c7504, 0x2d4b8186, 0x0b4fdbeb, 0xbab70c02, 0x9cb3566f, 0xc7a4a2ed, 0xe1a0f880, 0x8572286a, 0xa3767207, 0xf8618685, 0xde65dce8, 0x6f9d0b01, 0x4999516c, 0x128ea5ee, 0x348aff83, 0xa42c3038, 0x82286a55, 0xd93f9ed7, 0xff3bc4ba, +0x4ec31353, 0x68c7493e, 0x33d0bdbc, 0x15d4e7d1, 0x7106373b, 0x57026d56, 0x0c1599d4, 0x2a11c3b9, 0x9be91450, 0xbded4e3d, 0xe6fababf, 0xc0fee0d2, 0x51809376, 0x7784c91b, 0x2c933d99, 0x0a9767f4, 0xbb6fb01d, 0x9d6bea70, 0xc67c1ef2, 0xe078449f, +0x84aa9475, 0xa2aece18, 0xf9b93a9a, 0xdfbd60f7, 0x6e45b71e, 0x4841ed73, 0x135619f1, 0x3552439c, 0xa5f48c27, 0x83f0d64a, 0xd8e722c8, 0xfee378a5, 0x4f1baf4c, 0x691ff521, 0x320801a3, 0x140c5bce, 0x70de8b24, 0x56dad149, 0x0dcd25cb, 0x2bc97fa6, +0x9a31a84f, 0xbc35f222, 0xe72206a0, 0xc1265ccd, 0x01d8bc1f, 0x27dce672, 0x7ccb12f0, 0x5acf489d, 0xeb379f74, 0xcd33c519, 0x9624319b, 0xb0206bf6, 0xd4f2bb1c, 0xf2f6e171, 0xa9e115f3, 0x8fe54f9e, 0x3e1d9877, 0x1819c21a, 0x430e3698, 0x650a6cf5, +0xf5aca34e, 0xd3a8f923, 0x88bf0da1, 0xaebb57cc, 0x1f438025, 0x3947da48, 0x62502eca, 0x445474a7, 0x2086a44d, 0x0682fe20, 0x5d950aa2, 0x7b9150cf, 0xca698726, 0xec6ddd4b, 0xb77a29c9, 0x917e73a4, 0x1eb1b36c, 0x38b5e901, 0x63a21d83, 0x45a647ee, +0xf45e9007, 0xd25aca6a, 0x894d3ee8, 0xaf496485, 0xcb9bb46f, 0xed9fee02, 0xb6881a80, 0x908c40ed, 0x21749704, 0x0770cd69, 0x5c6739eb, 0x7a636386, 0xeac5ac3d, 0xccc1f650, 0x97d602d2, 0xb1d258bf, 0x002a8f56, 0x262ed53b, 0x7d3921b9, 0x5b3d7bd4, +0x3fefab3e, 0x19ebf153, 0x42fc05d1, 0x64f85fbc, 0xd5008855, 0xf304d238, 0xa81326ba, 0x8e177cd7, 0x4ee99c05, 0x68edc668, 0x33fa32ea, 0x15fe6887, 0xa406bf6e, 0x8202e503, 0xd9151181, 0xff114bec, 0x9bc39b06, 0xbdc7c16b, 0xe6d035e9, 0xc0d46f84, +0x712cb86d, 0x5728e200, 0x0c3f1682, 0x2a3b4cef, 0xba9d8354, 0x9c99d939, 0xc78e2dbb, 0xe18a77d6, 0x5072a03f, 0x7676fa52, 0x2d610ed0, 0x0b6554bd, 0x6fb78457, 0x49b3de3a, 0x12a42ab8, 0x34a070d5, 0x8558a73c, 0xa35cfd51, 0xf84b09d3, 0xde4f53be, +0x4f31201a, 0x69357a77, 0x32228ef5, 0x1426d498, 0xa5de0371, 0x83da591c, 0xd8cdad9e, 0xfec9f7f3, 0x9a1b2719, 0xbc1f7d74, 0xe70889f6, 0xc10cd39b, 0x70f40472, 0x56f05e1f, 0x0de7aa9d, 0x2be3f0f0, 0xbb453f4b, 0x9d416526, 0xc65691a4, 0xe052cbc9, +0x51aa1c20, 0x77ae464d, 0x2cb9b2cf, 0x0abde8a2, 0x6e6f3848, 0x486b6225, 0x137c96a7, 0x3578ccca, 0x84801b23, 0xa284414e, 0xf993b5cc, 0xdf97efa1, 0x1f690f73, 0x396d551e, 0x627aa19c, 0x447efbf1, 0xf5862c18, 0xd3827675, 0x889582f7, 0xae91d89a, +0xca430870, 0xec47521d, 0xb750a69f, 0x9154fcf2, 0x20ac2b1b, 0x06a87176, 0x5dbf85f4, 0x7bbbdf99, 0xeb1d1022, 0xcd194a4f, 0x960ebecd, 0xb00ae4a0, 0x01f23349, 0x27f66924, 0x7ce19da6, 0x5ae5c7cb, 0x3e371721, 0x18334d4c, 0x4324b9ce, 0x6520e3a3, +0xd4d8344a, 0xf2dc6e27, 0xa9cb9aa5, 0x8fcfc0c8, 0x00000000, 0x1f589135, 0x031a7b45, 0x1c42ea70, 0x4c9cca4a, 0x53c45b7f, 0x4f86b10f, 0x50de203a, 0x821b6555, 0x9d43f460, 0x81011e10, 0x9e598f25, 0xce87af1f, 0xd1df3e2a, 0xcd9dd45a, 0xd2c5456f, +0xa8c94f43, 0xb791de76, 0xabd33406, 0xb48ba533, 0xe4558509, 0xfb0d143c, 0xe74ffe4c, 0xf8176f79, 0x2ad22a16, 0x358abb23, 0x29c85153, 0x3690c066, 0x664ee05c, 0x79167169, 0x65549b19, 0x7a0c0a2c, 0x10def12b, 0x0f86601e, 0x13c48a6e, 0x0c9c1b5b, +0x5c423b61, 0x431aaa54, 0x5f584024, 0x4000d111, 0x92c5947e, 0x8d9d054b, 0x91dfef3b, 0x8e877e0e, 0xde595e34, 0xc101cf01, 0xdd432571, 0xc21bb444, 0xb817be68, 0xa74f2f5d, 0xbb0dc52d, 0xa4555418, 0xf48b7422, 0xebd3e517, 0xf7910f67, 0xe8c99e52, +0x3a0cdb3d, 0x25544a08, 0x3916a078, 0x264e314d, 0x76901177, 0x69c88042, 0x758a6a32, 0x6ad2fb07, 0x5626fb48, 0x497e6a7d, 0x553c800d, 0x4a641138, 0x1aba3102, 0x05e2a037, 0x19a04a47, 0x06f8db72, 0xd43d9e1d, 0xcb650f28, 0xd727e558, 0xc87f746d, +0x98a15457, 0x87f9c562, 0x9bbb2f12, 0x84e3be27, 0xfeefb40b, 0xe1b7253e, 0xfdf5cf4e, 0xe2ad5e7b, 0xb2737e41, 0xad2bef74, 0xb1690504, 0xae319431, 0x7cf4d15e, 0x63ac406b, 0x7feeaa1b, 0x60b63b2e, 0x30681b14, 0x2f308a21, 0x33726051, 0x2c2af164, +0x46f80a63, 0x59a09b56, 0x45e27126, 0x5abae013, 0x0a64c029, 0x153c511c, 0x097ebb6c, 0x16262a59, 0xc4e36f36, 0xdbbbfe03, 0xc7f91473, 0xd8a18546, 0x887fa57c, 0x97273449, 0x8b65de39, 0x943d4f0c, 0xee314520, 0xf169d415, 0xed2b3e65, 0xf273af50, +0xa2ad8f6a, 0xbdf51e5f, 0xa1b7f42f, 0xbeef651a, 0x6c2a2075, 0x7372b140, 0x6f305b30, 0x7068ca05, 0x20b6ea3f, 0x3fee7b0a, 0x23ac917a, 0x3cf4004f, 0x51298412, 0x4e711527, 0x5233ff57, 0x4d6b6e62, 0x1db54e58, 0x02eddf6d, 0x1eaf351d, 0x01f7a428, +0xd332e147, 0xcc6a7072, 0xd0289a02, 0xcf700b37, 0x9fae2b0d, 0x80f6ba38, 0x9cb45048, 0x83ecc17d, 0xf9e0cb51, 0xe6b85a64, 0xfafab014, 0xe5a22121, 0xb57c011b, 0xaa24902e, 0xb6667a5e, 0xa93eeb6b, 0x7bfbae04, 0x64a33f31, 0x78e1d541, 0x67b94474, +0x3767644e, 0x283ff57b, 0x347d1f0b, 0x2b258e3e, 0x41f77539, 0x5eafe40c, 0x42ed0e7c, 0x5db59f49, 0x0d6bbf73, 0x12332e46, 0x0e71c436, 0x11295503, 0xc3ec106c, 0xdcb48159, 0xc0f66b29, 0xdfaefa1c, 0x8f70da26, 0x90284b13, 0x8c6aa163, 0x93323056, +0xe93e3a7a, 0xf666ab4f, 0xea24413f, 0xf57cd00a, 0xa5a2f030, 0xbafa6105, 0xa6b88b75, 0xb9e01a40, 0x6b255f2f, 0x747dce1a, 0x683f246a, 0x7767b55f, 0x27b99565, 0x38e10450, 0x24a3ee20, 0x3bfb7f15, 0x070f7f5a, 0x1857ee6f, 0x0415041f, 0x1b4d952a, +0x4b93b510, 0x54cb2425, 0x4889ce55, 0x57d15f60, 0x85141a0f, 0x9a4c8b3a, 0x860e614a, 0x9956f07f, 0xc988d045, 0xd6d04170, 0xca92ab00, 0xd5ca3a35, 0xafc63019, 0xb09ea12c, 0xacdc4b5c, 0xb384da69, 0xe35afa53, 0xfc026b66, 0xe0408116, 0xff181023, +0x2ddd554c, 0x3285c479, 0x2ec72e09, 0x319fbf3c, 0x61419f06, 0x7e190e33, 0x625be443, 0x7d037576, 0x17d18e71, 0x08891f44, 0x14cbf534, 0x0b936401, 0x5b4d443b, 0x4415d50e, 0x58573f7e, 0x470fae4b, 0x95caeb24, 0x8a927a11, 0x96d09061, 0x89880154, +0xd956216e, 0xc60eb05b, 0xda4c5a2b, 0xc514cb1e, 0xbf18c132, 0xa0405007, 0xbc02ba77, 0xa35a2b42, 0xf3840b78, 0xecdc9a4d, 0xf09e703d, 0xefc6e108, 0x3d03a467, 0x225b3552, 0x3e19df22, 0x21414e17, 0x719f6e2d, 0x6ec7ff18, 0x72851568, 0x6ddd845d, +0x00000000, 0xa64487e2, 0x9418904a, 0x325c17a8, 0x138d1eb5, 0xb5c99957, 0x87958eff, 0x21d1091d, 0x5e9472ed, 0xf8d0f50f, 0xca8ce2a7, 0x6cc86545, 0x4d196c58, 0xeb5debba, 0xd901fc12, 0x7f457bf0, 0xab07a9fc, 0x0d432e1e, 0x3f1f39b6, 0x995bbe54, +0xb88ab749, 0x1ece30ab, 0x2c922703, 0x8ad6a0e1, 0xf593db11, 0x53d75cf3, 0x618b4b5b, 0xc7cfccb9, 0xe61ec5a4, 0x405a4246, 0x720655ee, 0xd442d20c, 0x8325bc5a, 0x25613bb8, 0x173d2c10, 0xb179abf2, 0x90a8a2ef, 0x36ec250d, 0x04b032a5, 0xa2f4b547, +0xddb1ceb7, 0x7bf54955, 0x49a95efd, 0xefedd91f, 0xce3cd002, 0x687857e0, 0x5a244048, 0xfc60c7aa, 0x282215a6, 0x8e669244, 0xbc3a85ec, 0x1a7e020e, 0x3baf0b13, 0x9deb8cf1, 0xafb79b59, 0x09f31cbb, 0x76b6674b, 0xd0f2e0a9, 0xe2aef701, 0x44ea70e3, +0x653b79fe, 0xc37ffe1c, 0xf123e9b4, 0x57676e56, 0xbc957ca2, 0x1ad1fb40, 0x288dece8, 0x8ec96b0a, 0xaf186217, 0x095ce5f5, 0x3b00f25d, 0x9d4475bf, 0xe2010e4f, 0x444589ad, 0x76199e05, 0xd05d19e7, 0xf18c10fa, 0x57c89718, 0x659480b0, 0xc3d00752, +0x1792d55e, 0xb1d652bc, 0x838a4514, 0x25cec2f6, 0x041fcbeb, 0xa25b4c09, 0x90075ba1, 0x3643dc43, 0x4906a7b3, 0xef422051, 0xdd1e37f9, 0x7b5ab01b, 0x5a8bb906, 0xfccf3ee4, 0xce93294c, 0x68d7aeae, 0x3fb0c0f8, 0x99f4471a, 0xaba850b2, 0x0decd750, +0x2c3dde4d, 0x8a7959af, 0xb8254e07, 0x1e61c9e5, 0x6124b215, 0xc76035f7, 0xf53c225f, 0x5378a5bd, 0x72a9aca0, 0xd4ed2b42, 0xe6b13cea, 0x40f5bb08, 0x94b76904, 0x32f3eee6, 0x00aff94e, 0xa6eb7eac, 0x873a77b1, 0x217ef053, 0x1322e7fb, 0xb5666019, +0xca231be9, 0x6c679c0b, 0x5e3b8ba3, 0xf87f0c41, 0xd9ae055c, 0x7fea82be, 0x4db69516, 0xebf212f4, 0x80fd7b7a, 0x26b9fc98, 0x14e5eb30, 0xb2a16cd2, 0x937065cf, 0x3534e22d, 0x0768f585, 0xa12c7267, 0xde690997, 0x782d8e75, 0x4a7199dd, 0xec351e3f, +0xcde41722, 0x6ba090c0, 0x59fc8768, 0xffb8008a, 0x2bfad286, 0x8dbe5564, 0xbfe242cc, 0x19a6c52e, 0x3877cc33, 0x9e334bd1, 0xac6f5c79, 0x0a2bdb9b, 0x756ea06b, 0xd32a2789, 0xe1763021, 0x4732b7c3, 0x66e3bede, 0xc0a7393c, 0xf2fb2e94, 0x54bfa976, +0x03d8c720, 0xa59c40c2, 0x97c0576a, 0x3184d088, 0x1055d995, 0xb6115e77, 0x844d49df, 0x2209ce3d, 0x5d4cb5cd, 0xfb08322f, 0xc9542587, 0x6f10a265, 0x4ec1ab78, 0xe8852c9a, 0xdad93b32, 0x7c9dbcd0, 0xa8df6edc, 0x0e9be93e, 0x3cc7fe96, 0x9a837974, +0xbb527069, 0x1d16f78b, 0x2f4ae023, 0x890e67c1, 0xf64b1c31, 0x500f9bd3, 0x62538c7b, 0xc4170b99, 0xe5c60284, 0x43828566, 0x71de92ce, 0xd79a152c, 0x3c6807d8, 0x9a2c803a, 0xa8709792, 0x0e341070, 0x2fe5196d, 0x89a19e8f, 0xbbfd8927, 0x1db90ec5, +0x62fc7535, 0xc4b8f2d7, 0xf6e4e57f, 0x50a0629d, 0x71716b80, 0xd735ec62, 0xe569fbca, 0x432d7c28, 0x976fae24, 0x312b29c6, 0x03773e6e, 0xa533b98c, 0x84e2b091, 0x22a63773, 0x10fa20db, 0xb6bea739, 0xc9fbdcc9, 0x6fbf5b2b, 0x5de34c83, 0xfba7cb61, +0xda76c27c, 0x7c32459e, 0x4e6e5236, 0xe82ad5d4, 0xbf4dbb82, 0x19093c60, 0x2b552bc8, 0x8d11ac2a, 0xacc0a537, 0x0a8422d5, 0x38d8357d, 0x9e9cb29f, 0xe1d9c96f, 0x479d4e8d, 0x75c15925, 0xd385dec7, 0xf254d7da, 0x54105038, 0x664c4790, 0xc008c072, +0x144a127e, 0xb20e959c, 0x80528234, 0x261605d6, 0x07c70ccb, 0xa1838b29, 0x93df9c81, 0x359b1b63, 0x4ade6093, 0xec9ae771, 0xdec6f0d9, 0x7882773b, 0x59537e26, 0xff17f9c4, 0xcd4bee6c, 0x6b0f698e, 0x00000000, 0x36251851, 0x937721b2, 0xa55239e3, +0x3e1b75c2, 0x083e6d93, 0xad6c5470, 0x9b494c21, 0x7790b426, 0x41b5ac77, 0xe4e79594, 0xd2c28dc5, 0x498bc1e4, 0x7faed9b5, 0xdafce056, 0xecd9f807, 0xba146384, 0x8c317bd5, 0x29634236, 0x1f465a67, 0x840f1646, 0xb22a0e17, 0x177837f4, 0x215d2fa5, +0xcd84d7a2, 0xfba1cff3, 0x5ef3f610, 0x68d6ee41, 0xf39fa260, 0xc5baba31, 0x60e883d2, 0x56cd9b83, 0x1a57d7d8, 0x2c72cf89, 0x8920f66a, 0xbf05ee3b, 0x244ca21a, 0x1269ba4b, 0xb73b83a8, 0x811e9bf9, 0x6dc763fe, 0x5be27baf, 0xfeb0424c, 0xc8955a1d, +0x53dc163c, 0x65f90e6d, 0xc0ab378e, 0xf68e2fdf, 0xa043b45c, 0x9666ac0d, 0x333495ee, 0x05118dbf, 0x9e58c19e, 0xa87dd9cf, 0x0d2fe02c, 0x3b0af87d, 0xd7d3007a, 0xe1f6182b, 0x44a421c8, 0x72813999, 0xe9c875b8, 0xdfed6de9, 0x7abf540a, 0x4c9a4c5b, +0x98243b5a, 0xae01230b, 0x0b531ae8, 0x3d7602b9, 0xa63f4e98, 0x901a56c9, 0x35486f2a, 0x036d777b, 0xefb48f7c, 0xd991972d, 0x7cc3aece, 0x4ae6b69f, 0xd1affabe, 0xe78ae2ef, 0x42d8db0c, 0x74fdc35d, 0x223058de, 0x1415408f, 0xb147796c, 0x8762613d, +0x1c2b2d1c, 0x2a0e354d, 0x8f5c0cae, 0xb97914ff, 0x55a0ecf8, 0x6385f4a9, 0xc6d7cd4a, 0xf0f2d51b, 0x6bbb993a, 0x5d9e816b, 0xf8ccb888, 0xcee9a0d9, 0x8273ec82, 0xb456f4d3, 0x1104cd30, 0x2721d561, 0xbc689940, 0x8a4d8111, 0x2f1fb8f2, 0x193aa0a3, +0xf5e358a4, 0xc3c640f5, 0x66947916, 0x50b16147, 0xcbf82d66, 0xfddd3537, 0x588f0cd4, 0x6eaa1485, 0x38678f06, 0x0e429757, 0xab10aeb4, 0x9d35b6e5, 0x067cfac4, 0x3059e295, 0x950bdb76, 0xa32ec327, 0x4ff73b20, 0x79d22371, 0xdc801a92, 0xeaa502c3, +0x71ec4ee2, 0x47c956b3, 0xe29b6f50, 0xd4be7701, 0x44cd0ef0, 0x72e816a1, 0xd7ba2f42, 0xe19f3713, 0x7ad67b32, 0x4cf36363, 0xe9a15a80, 0xdf8442d1, 0x335dbad6, 0x0578a287, 0xa02a9b64, 0x960f8335, 0x0d46cf14, 0x3b63d745, 0x9e31eea6, 0xa814f6f7, +0xfed96d74, 0xc8fc7525, 0x6dae4cc6, 0x5b8b5497, 0xc0c218b6, 0xf6e700e7, 0x53b53904, 0x65902155, 0x8949d952, 0xbf6cc103, 0x1a3ef8e0, 0x2c1be0b1, 0xb752ac90, 0x8177b4c1, 0x24258d22, 0x12009573, 0x5e9ad928, 0x68bfc179, 0xcdedf89a, 0xfbc8e0cb, +0x6081acea, 0x56a4b4bb, 0xf3f68d58, 0xc5d39509, 0x290a6d0e, 0x1f2f755f, 0xba7d4cbc, 0x8c5854ed, 0x171118cc, 0x2134009d, 0x8466397e, 0xb243212f, 0xe48ebaac, 0xd2aba2fd, 0x77f99b1e, 0x41dc834f, 0xda95cf6e, 0xecb0d73f, 0x49e2eedc, 0x7fc7f68d, +0x931e0e8a, 0xa53b16db, 0x00692f38, 0x364c3769, 0xad057b48, 0x9b206319, 0x3e725afa, 0x085742ab, 0xdce935aa, 0xeacc2dfb, 0x4f9e1418, 0x79bb0c49, 0xe2f24068, 0xd4d75839, 0x718561da, 0x47a0798b, 0xab79818c, 0x9d5c99dd, 0x380ea03e, 0x0e2bb86f, +0x9562f44e, 0xa347ec1f, 0x0615d5fc, 0x3030cdad, 0x66fd562e, 0x50d84e7f, 0xf58a779c, 0xc3af6fcd, 0x58e623ec, 0x6ec33bbd, 0xcb91025e, 0xfdb41a0f, 0x116de208, 0x2748fa59, 0x821ac3ba, 0xb43fdbeb, 0x2f7697ca, 0x19538f9b, 0xbc01b678, 0x8a24ae29, +0xc6bee272, 0xf09bfa23, 0x55c9c3c0, 0x63ecdb91, 0xf8a597b0, 0xce808fe1, 0x6bd2b602, 0x5df7ae53, 0xb12e5654, 0x870b4e05, 0x225977e6, 0x147c6fb7, 0x8f352396, 0xb9103bc7, 0x1c420224, 0x2a671a75, 0x7caa81f6, 0x4a8f99a7, 0xefdda044, 0xd9f8b815, +0x42b1f434, 0x7494ec65, 0xd1c6d586, 0xe7e3cdd7, 0x0b3a35d0, 0x3d1f2d81, 0x984d1462, 0xae680c33, 0x35214012, 0x03045843, 0xa65661a0, 0x907379f1, 0x00000000, 0x51c739ea, 0xd2c60e64, 0x8301378e, 0x4f25345b, 0x1ee20db1, 0x9de33a3f, 0xcc2403d5, +0x06da1e70, 0x571d279a, 0xd41c1014, 0x85db29fe, 0x49ff2a2b, 0x183813c1, 0x9b39244f, 0xcafe1da5, 0x97bde61e, 0xc67adff4, 0x457be87a, 0x14bcd190, 0xd898d245, 0x895febaf, 0x0a5edc21, 0x5b99e5cb, 0x9167f86e, 0xc0a0c184, 0x43a1f60a, 0x1266cfe0, +0xde42cc35, 0x8f85f5df, 0x0c84c251, 0x5d43fbbb, 0xb2854ccd, 0xe3427527, 0x604342a9, 0x31847b43, 0xfda07896, 0xac67417c, 0x2f6676f2, 0x7ea14f18, 0xb45f52bd, 0xe5986b57, 0x66995cd9, 0x375e6533, 0xfb7a66e6, 0xaabd5f0c, 0x29bc6882, 0x787b5168, +0x2538aad3, 0x74ff9339, 0xf7fea4b7, 0xa6399d5d, 0x6a1d9e88, 0x3bdaa762, 0xb8db90ec, 0xe91ca906, 0x23e2b4a3, 0x72258d49, 0xf124bac7, 0xa0e3832d, 0x6cc780f8, 0x3d00b912, 0xbe018e9c, 0xefc6b776, 0x73c329ab, 0x22041041, 0xa10527cf, 0xf0c21e25, +0x3ce61df0, 0x6d21241a, 0xee201394, 0xbfe72a7e, 0x751937db, 0x24de0e31, 0xa7df39bf, 0xf6180055, 0x3a3c0380, 0x6bfb3a6a, 0xe8fa0de4, 0xb93d340e, 0xe47ecfb5, 0xb5b9f65f, 0x36b8c1d1, 0x677ff83b, 0xab5bfbee, 0xfa9cc204, 0x799df58a, 0x285acc60, +0xe2a4d1c5, 0xb363e82f, 0x3062dfa1, 0x61a5e64b, 0xad81e59e, 0xfc46dc74, 0x7f47ebfa, 0x2e80d210, 0xc1466566, 0x90815c8c, 0x13806b02, 0x424752e8, 0x8e63513d, 0xdfa468d7, 0x5ca55f59, 0x0d6266b3, 0xc79c7b16, 0x965b42fc, 0x155a7572, 0x449d4c98, +0x88b94f4d, 0xd97e76a7, 0x5a7f4129, 0x0bb878c3, 0x56fb8378, 0x073cba92, 0x843d8d1c, 0xd5fab4f6, 0x19deb723, 0x48198ec9, 0xcb18b947, 0x9adf80ad, 0x50219d08, 0x01e6a4e2, 0x82e7936c, 0xd320aa86, 0x1f04a953, 0x4ec390b9, 0xcdc2a737, 0x9c059edd, +0xeabb50e9, 0xbb7c6903, 0x387d5e8d, 0x69ba6767, 0xa59e64b2, 0xf4595d58, 0x77586ad6, 0x269f533c, 0xec614e99, 0xbda67773, 0x3ea740fd, 0x6f607917, 0xa3447ac2, 0xf2834328, 0x718274a6, 0x20454d4c, 0x7d06b6f7, 0x2cc18f1d, 0xafc0b893, 0xfe078179, +0x322382ac, 0x63e4bb46, 0xe0e58cc8, 0xb122b522, 0x7bdca887, 0x2a1b916d, 0xa91aa6e3, 0xf8dd9f09, 0x34f99cdc, 0x653ea536, 0xe63f92b8, 0xb7f8ab52, 0x583e1c24, 0x09f925ce, 0x8af81240, 0xdb3f2baa, 0x171b287f, 0x46dc1195, 0xc5dd261b, 0x941a1ff1, +0x5ee40254, 0x0f233bbe, 0x8c220c30, 0xdde535da, 0x11c1360f, 0x40060fe5, 0xc307386b, 0x92c00181, 0xcf83fa3a, 0x9e44c3d0, 0x1d45f45e, 0x4c82cdb4, 0x80a6ce61, 0xd161f78b, 0x5260c005, 0x03a7f9ef, 0xc959e44a, 0x989edda0, 0x1b9fea2e, 0x4a58d3c4, +0x867cd011, 0xd7bbe9fb, 0x54bade75, 0x057de79f, 0x99787942, 0xc8bf40a8, 0x4bbe7726, 0x1a794ecc, 0xd65d4d19, 0x879a74f3, 0x049b437d, 0x555c7a97, 0x9fa26732, 0xce655ed8, 0x4d646956, 0x1ca350bc, 0xd0875369, 0x81406a83, 0x02415d0d, 0x538664e7, +0x0ec59f5c, 0x5f02a6b6, 0xdc039138, 0x8dc4a8d2, 0x41e0ab07, 0x102792ed, 0x9326a563, 0xc2e19c89, 0x081f812c, 0x59d8b8c6, 0xdad98f48, 0x8b1eb6a2, 0x473ab577, 0x16fd8c9d, 0x95fcbb13, 0xc43b82f9, 0x2bfd358f, 0x7a3a0c65, 0xf93b3beb, 0xa8fc0201, +0x64d801d4, 0x351f383e, 0xb61e0fb0, 0xe7d9365a, 0x2d272bff, 0x7ce01215, 0xffe1259b, 0xae261c71, 0x62021fa4, 0x33c5264e, 0xb0c411c0, 0xe103282a, 0xbc40d391, 0xed87ea7b, 0x6e86ddf5, 0x3f41e41f, 0xf365e7ca, 0xa2a2de20, 0x21a3e9ae, 0x7064d044, +0xba9acde1, 0xeb5df40b, 0x685cc385, 0x399bfa6f, 0xf5bff9ba, 0xa478c050, 0x2779f7de, 0x76bece34, 0x00000000, 0xea4d3b90, 0xf0ac59eb, 0x1ae1627b, 0x8fd49b1e, 0x6599a08e, 0x7f78c2f5, 0x9535f965, 0x79616964, 0x932c52f4, 0x89cd308f, 0x63800b1f, +0xf6b5f27a, 0x1cf8c9ea, 0x0619ab91, 0xec549001, 0xa6476b92, 0x4c0a5002, 0x56eb3279, 0xbca609e9, 0x2993f08c, 0xc3decb1c, 0xd93fa967, 0x337292f7, 0xdf2602f6, 0x356b3966, 0x2f8a5b1d, 0xc5c7608d, 0x50f299e8, 0xbabfa278, 0xa05ec003, 0x4a13fb93, +0x6c2cc4b3, 0x8661ff23, 0x9c809d58, 0x76cda6c8, 0xe3f85fad, 0x09b5643d, 0x13540646, 0xf9193dd6, 0x154dadd7, 0xff009647, 0xe5e1f43c, 0x0faccfac, 0x9a9936c9, 0x70d40d59, 0x6a356f22, 0x807854b2, 0xca6baf21, 0x202694b1, 0x3ac7f6ca, 0xd08acd5a, +0x45bf343f, 0xaff20faf, 0xb5136dd4, 0x5f5e5644, 0xb30ac645, 0x5947fdd5, 0x43a69fae, 0xa9eba43e, 0x3cde5d5b, 0xd69366cb, 0xcc7204b0, 0x263f3f20, 0xe89cc720, 0x02d1fcb0, 0x18309ecb, 0xf27da55b, 0x67485c3e, 0x8d0567ae, 0x97e405d5, 0x7da93e45, +0x91fdae44, 0x7bb095d4, 0x6151f7af, 0x8b1ccc3f, 0x1e29355a, 0xf4640eca, 0xee856cb1, 0x04c85721, 0x4edbacb2, 0xa4969722, 0xbe77f559, 0x543acec9, 0xc10f37ac, 0x2b420c3c, 0x31a36e47, 0xdbee55d7, 0x37bac5d6, 0xddf7fe46, 0xc7169c3d, 0x2d5ba7ad, +0xb86e5ec8, 0x52236558, 0x48c20723, 0xa28f3cb3, 0x84b00393, 0x6efd3803, 0x741c5a78, 0x9e5161e8, 0x0b64988d, 0xe129a31d, 0xfbc8c166, 0x1185faf6, 0xfdd16af7, 0x179c5167, 0x0d7d331c, 0xe730088c, 0x7205f1e9, 0x9848ca79, 0x82a9a802, 0x68e49392, +0x22f76801, 0xc8ba5391, 0xd25b31ea, 0x38160a7a, 0xad23f31f, 0x476ec88f, 0x5d8faaf4, 0xb7c29164, 0x5b960165, 0xb1db3af5, 0xab3a588e, 0x4177631e, 0xd4429a7b, 0x3e0fa1eb, 0x24eec390, 0xcea3f800, 0x24f22020, 0xcebf1bb0, 0xd45e79cb, 0x3e13425b, +0xab26bb3e, 0x416b80ae, 0x5b8ae2d5, 0xb1c7d945, 0x5d934944, 0xb7de72d4, 0xad3f10af, 0x47722b3f, 0xd247d25a, 0x380ae9ca, 0x22eb8bb1, 0xc8a6b021, 0x82b54bb2, 0x68f87022, 0x72191259, 0x985429c9, 0x0d61d0ac, 0xe72ceb3c, 0xfdcd8947, 0x1780b2d7, +0xfbd422d6, 0x11991946, 0x0b787b3d, 0xe13540ad, 0x7400b9c8, 0x9e4d8258, 0x84ace023, 0x6ee1dbb3, 0x48dee493, 0xa293df03, 0xb872bd78, 0x523f86e8, 0xc70a7f8d, 0x2d47441d, 0x37a62666, 0xddeb1df6, 0x31bf8df7, 0xdbf2b667, 0xc113d41c, 0x2b5eef8c, +0xbe6b16e9, 0x54262d79, 0x4ec74f02, 0xa48a7492, 0xee998f01, 0x04d4b491, 0x1e35d6ea, 0xf478ed7a, 0x614d141f, 0x8b002f8f, 0x91e14df4, 0x7bac7664, 0x97f8e665, 0x7db5ddf5, 0x6754bf8e, 0x8d19841e, 0x182c7d7b, 0xf26146eb, 0xe8802490, 0x02cd1f00, +0xcc6ee700, 0x2623dc90, 0x3cc2beeb, 0xd68f857b, 0x43ba7c1e, 0xa9f7478e, 0xb31625f5, 0x595b1e65, 0xb50f8e64, 0x5f42b5f4, 0x45a3d78f, 0xafeeec1f, 0x3adb157a, 0xd0962eea, 0xca774c91, 0x203a7701, 0x6a298c92, 0x8064b702, 0x9a85d579, 0x70c8eee9, +0xe5fd178c, 0x0fb02c1c, 0x15514e67, 0xff1c75f7, 0x1348e5f6, 0xf905de66, 0xe3e4bc1d, 0x09a9878d, 0x9c9c7ee8, 0x76d14578, 0x6c302703, 0x867d1c93, 0xa04223b3, 0x4a0f1823, 0x50ee7a58, 0xbaa341c8, 0x2f96b8ad, 0xc5db833d, 0xdf3ae146, 0x3577dad6, +0xd9234ad7, 0x336e7147, 0x298f133c, 0xc3c228ac, 0x56f7d1c9, 0xbcbaea59, 0xa65b8822, 0x4c16b3b2, 0x06054821, 0xec4873b1, 0xf6a911ca, 0x1ce42a5a, 0x89d1d33f, 0x639ce8af, 0x797d8ad4, 0x9330b144, 0x7f642145, 0x95291ad5, 0x8fc878ae, 0x6585433e, +0xf0b0ba5b, 0x1afd81cb, 0x001ce3b0, 0xea51d820, 0x00000000, 0x65ba488c, 0xf2f79b58, 0x974dd3d4, 0x947beaa2, 0xf1c1a22e, 0x668c71fa, 0x03363976, 0xdcced15b, 0xb97499d7, 0x2e394a03, 0x4b83028f, 0x48b53bf9, 0x2d0f7375, 0xba42a0a1, 0xdff8e82d, +0x574a1cd6, 0x32f0545a, 0xa5bd878e, 0xc007cf02, 0xc331f674, 0xa68bbef8, 0x31c66d2c, 0x547c25a0, 0x8b84cd8d, 0xee3e8501, 0x797356d5, 0x1cc91e59, 0x1fff272f, 0x7a456fa3, 0xed08bc77, 0x88b2f4fb, 0x9038a20f, 0xf582ea83, 0x62cf3957, 0x077571db, +0x044348ad, 0x61f90021, 0xf6b4d3f5, 0x930e9b79, 0x4cf67354, 0x294c3bd8, 0xbe01e80c, 0xdbbba080, 0xd88d99f6, 0xbd37d17a, 0x2a7a02ae, 0x4fc04a22, 0xc772bed9, 0xa2c8f655, 0x35852581, 0x503f6d0d, 0x5309547b, 0x36b31cf7, 0xa1fecf23, 0xc44487af, +0x1bbc6f82, 0x7e06270e, 0xe94bf4da, 0x8cf1bc56, 0x8fc78520, 0xea7dcdac, 0x7d301e78, 0x188a56f4, 0x0776b022, 0x62ccf8ae, 0xf5812b7a, 0x903b63f6, 0x930d5a80, 0xf6b7120c, 0x61fac1d8, 0x04408954, 0xdbb86179, 0xbe0229f5, 0x294ffa21, 0x4cf5b2ad, +0x4fc38bdb, 0x2a79c357, 0xbd341083, 0xd88e580f, 0x503cacf4, 0x3586e478, 0xa2cb37ac, 0xc7717f20, 0xc4474656, 0xa1fd0eda, 0x36b0dd0e, 0x530a9582, 0x8cf27daf, 0xe9483523, 0x7e05e6f7, 0x1bbfae7b, 0x1889970d, 0x7d33df81, 0xea7e0c55, 0x8fc444d9, +0x974e122d, 0xf2f45aa1, 0x65b98975, 0x0003c1f9, 0x0335f88f, 0x668fb003, 0xf1c263d7, 0x94782b5b, 0x4b80c376, 0x2e3a8bfa, 0xb977582e, 0xdccd10a2, 0xdffb29d4, 0xba416158, 0x2d0cb28c, 0x48b6fa00, 0xc0040efb, 0xa5be4677, 0x32f395a3, 0x5749dd2f, +0x547fe459, 0x31c5acd5, 0xa6887f01, 0xc332378d, 0x1ccadfa0, 0x7970972c, 0xee3d44f8, 0x8b870c74, 0x88b13502, 0xed0b7d8e, 0x7a46ae5a, 0x1ffce6d6, 0xa9344a29, 0xcc8e02a5, 0x5bc3d171, 0x3e7999fd, 0x3d4fa08b, 0x58f5e807, 0xcfb83bd3, 0xaa02735f, +0x75fa9b72, 0x1040d3fe, 0x870d002a, 0xe2b748a6, 0xe18171d0, 0x843b395c, 0x1376ea88, 0x76cca204, 0xfe7e56ff, 0x9bc41e73, 0x0c89cda7, 0x6933852b, 0x6a05bc5d, 0x0fbff4d1, 0x98f22705, 0xfd486f89, 0x22b087a4, 0x470acf28, 0xd0471cfc, 0xb5fd5470, +0xb6cb6d06, 0xd371258a, 0x443cf65e, 0x2186bed2, 0x390ce826, 0x5cb6a0aa, 0xcbfb737e, 0xae413bf2, 0xad770284, 0xc8cd4a08, 0x5f8099dc, 0x3a3ad150, 0xe5c2397d, 0x807871f1, 0x1735a225, 0x728feaa9, 0x71b9d3df, 0x14039b53, 0x834e4887, 0xe6f4000b, +0x6e46f4f0, 0x0bfcbc7c, 0x9cb16fa8, 0xf90b2724, 0xfa3d1e52, 0x9f8756de, 0x08ca850a, 0x6d70cd86, 0xb28825ab, 0xd7326d27, 0x407fbef3, 0x25c5f67f, 0x26f3cf09, 0x43498785, 0xd4045451, 0xb1be1cdd, 0xae42fa0b, 0xcbf8b287, 0x5cb56153, 0x390f29df, +0x3a3910a9, 0x5f835825, 0xc8ce8bf1, 0xad74c37d, 0x728c2b50, 0x173663dc, 0x807bb008, 0xe5c1f884, 0xe6f7c1f2, 0x834d897e, 0x14005aaa, 0x71ba1226, 0xf908e6dd, 0x9cb2ae51, 0x0bff7d85, 0x6e453509, 0x6d730c7f, 0x08c944f3, 0x9f849727, 0xfa3edfab, +0x25c63786, 0x407c7f0a, 0xd731acde, 0xb28be452, 0xb1bddd24, 0xd40795a8, 0x434a467c, 0x26f00ef0, 0x3e7a5804, 0x5bc01088, 0xcc8dc35c, 0xa9378bd0, 0xaa01b2a6, 0xcfbbfa2a, 0x58f629fe, 0x3d4c6172, 0xe2b4895f, 0x870ec1d3, 0x10431207, 0x75f95a8b, +0x76cf63fd, 0x13752b71, 0x8438f8a5, 0xe182b029, 0x693044d2, 0x0c8a0c5e, 0x9bc7df8a, 0xfe7d9706, 0xfd4bae70, 0x98f1e6fc, 0x0fbc3528, 0x6a067da4, 0xb5fe9589, 0xd044dd05, 0x47090ed1, 0x22b3465d, 0x21857f2b, 0x443f37a7, 0xd372e473, 0xb6c8acff, +0x00000000, 0x7d88a849, 0x30151e2e, 0x4d9db667, 0x2db9734c, 0x5031db05, 0x1dac6d62, 0x6024c52b, 0x3ddea9fa, 0x405601b3, 0x0dcbb7d4, 0x70431f9d, 0x1067dab6, 0x6def72ff, 0x2072c498, 0x5dfa6cd1, 0x0a730ac4, 0x77fba28d, 0x3a6614ea, 0x47eebca3, +0x27ca7988, 0x5a42d1c1, 0x17df67a6, 0x6a57cfef, 0x37ada33e, 0x4a250b77, 0x07b8bd10, 0x7a301559, 0x1a14d072, 0x679c783b, 0x2a01ce5c, 0x57896615, 0x8e0076fc, 0xf388deb5, 0xbe1568d2, 0xc39dc09b, 0xa3b905b0, 0xde31adf9, 0x93ac1b9e, 0xee24b3d7, +0xb3dedf06, 0xce56774f, 0x83cbc128, 0xfe436961, 0x9e67ac4a, 0xe3ef0403, 0xae72b264, 0xd3fa1a2d, 0x84737c38, 0xf9fbd471, 0xb4666216, 0xc9eeca5f, 0xa9ca0f74, 0xd442a73d, 0x99df115a, 0xe457b913, 0xb9add5c2, 0xc4257d8b, 0x89b8cbec, 0xf43063a5, +0x9414a68e, 0xe99c0ec7, 0xa401b8a0, 0xd98910e9, 0x7b3c24fb, 0x06b48cb2, 0x4b293ad5, 0x36a1929c, 0x568557b7, 0x2b0dfffe, 0x66904999, 0x1b18e1d0, 0x46e28d01, 0x3b6a2548, 0x76f7932f, 0x0b7f3b66, 0x6b5bfe4d, 0x16d35604, 0x5b4ee063, 0x26c6482a, +0x714f2e3f, 0x0cc78676, 0x415a3011, 0x3cd29858, 0x5cf65d73, 0x217ef53a, 0x6ce3435d, 0x116beb14, 0x4c9187c5, 0x31192f8c, 0x7c8499eb, 0x010c31a2, 0x6128f489, 0x1ca05cc0, 0x513deaa7, 0x2cb542ee, 0xf53c5207, 0x88b4fa4e, 0xc5294c29, 0xb8a1e460, +0xd885214b, 0xa50d8902, 0xe8903f65, 0x9518972c, 0xc8e2fbfd, 0xb56a53b4, 0xf8f7e5d3, 0x857f4d9a, 0xe55b88b1, 0x98d320f8, 0xd54e969f, 0xa8c63ed6, 0xff4f58c3, 0x82c7f08a, 0xcf5a46ed, 0xb2d2eea4, 0xd2f62b8f, 0xaf7e83c6, 0xe2e335a1, 0x9f6b9de8, +0xc291f139, 0xbf195970, 0xf284ef17, 0x8f0c475e, 0xef288275, 0x92a02a3c, 0xdf3d9c5b, 0xa2b53412, 0xd34a0eb7, 0xaec2a6fe, 0xe35f1099, 0x9ed7b8d0, 0xfef37dfb, 0x837bd5b2, 0xcee663d5, 0xb36ecb9c, 0xee94a74d, 0x931c0f04, 0xde81b963, 0xa309112a, +0xc32dd401, 0xbea57c48, 0xf338ca2f, 0x8eb06266, 0xd9390473, 0xa4b1ac3a, 0xe92c1a5d, 0x94a4b214, 0xf480773f, 0x8908df76, 0xc4956911, 0xb91dc158, 0xe4e7ad89, 0x996f05c0, 0xd4f2b3a7, 0xa97a1bee, 0xc95edec5, 0xb4d6768c, 0xf94bc0eb, 0x84c368a2, +0x5d4a784b, 0x20c2d002, 0x6d5f6665, 0x10d7ce2c, 0x70f30b07, 0x0d7ba34e, 0x40e61529, 0x3d6ebd60, 0x6094d1b1, 0x1d1c79f8, 0x5081cf9f, 0x2d0967d6, 0x4d2da2fd, 0x30a50ab4, 0x7d38bcd3, 0x00b0149a, 0x5739728f, 0x2ab1dac6, 0x672c6ca1, 0x1aa4c4e8, +0x7a8001c3, 0x0708a98a, 0x4a951fed, 0x371db7a4, 0x6ae7db75, 0x176f733c, 0x5af2c55b, 0x277a6d12, 0x475ea839, 0x3ad60070, 0x774bb617, 0x0ac31e5e, 0xa8762a4c, 0xd5fe8205, 0x98633462, 0xe5eb9c2b, 0x85cf5900, 0xf847f149, 0xb5da472e, 0xc852ef67, +0x95a883b6, 0xe8202bff, 0xa5bd9d98, 0xd83535d1, 0xb811f0fa, 0xc59958b3, 0x8804eed4, 0xf58c469d, 0xa2052088, 0xdf8d88c1, 0x92103ea6, 0xef9896ef, 0x8fbc53c4, 0xf234fb8d, 0xbfa94dea, 0xc221e5a3, 0x9fdb8972, 0xe253213b, 0xafce975c, 0xd2463f15, +0xb262fa3e, 0xcfea5277, 0x8277e410, 0xffff4c59, 0x26765cb0, 0x5bfef4f9, 0x1663429e, 0x6bebead7, 0x0bcf2ffc, 0x764787b5, 0x3bda31d2, 0x4652999b, 0x1ba8f54a, 0x66205d03, 0x2bbdeb64, 0x5635432d, 0x36118606, 0x4b992e4f, 0x06049828, 0x7b8c3061, +0x2c055674, 0x518dfe3d, 0x1c10485a, 0x6198e013, 0x01bc2538, 0x7c348d71, 0x31a93b16, 0x4c21935f, 0x11dbff8e, 0x6c5357c7, 0x21cee1a0, 0x5c4649e9, 0x3c628cc2, 0x41ea248b, 0x0c7792ec, 0x71ff3aa5, ] + +d0x6a0be4d0=[ 0xd0, 0x9e, 0x48, 0x76, 0x15, 0x07, 0x77, 0x2d, 0x3a, 0xb0, 0xb9, 0x04, 0x22, 0x66, 0x35, 0x80, 0xc5, 0x1e, 0xda, 0xec, 0x32, 0x78, 0x2e, 0xaf, 0x7b, 0x25, 0x3d, 0xee, 0xe5, 0xca, 0x44, 0xc2, 0x12, 0xab, 0x13, 0xa7, 0xfa, 0x08, 0xe1, 0x3b, +0x11, 0x0d, 0x37, 0xc8, 0x42, 0x5b, 0x56, 0x41, 0x91, 0x50, 0x2f, 0x70, 0x3c, 0x14, 0x55, 0xdc, 0x90, 0xd8, 0x94, 0xe7, 0x16, 0xb4, 0xa5, 0x6a, 0x69, 0x20, 0x74, 0x8f, 0xaa, 0xd3, 0x28, 0x53, 0x89, 0xb5, 0xd1, 0xbf, 0xe6, 0x85, 0xa3, 0xff, +0x67, 0xe2, 0x9f, 0xef, 0x49, 0x0c, 0x39, 0x7a, 0xde, 0xd4, 0x4c, 0xf3, 0xb7, 0xf7, 0x57, 0x5a, 0x1b, 0x21, 0x54, 0x9d, 0x51, 0x1c, 0x06, 0xe8, 0x5e, 0xcf, 0x31, 0xdd, 0x43, 0x95, 0xc9, 0xac, 0xe4, 0x1a, 0x30, 0x24, 0x18, 0x71, 0xad, 0x86, +0x2a, 0x0a, 0x58, 0x46, 0x8b, 0xdf, 0x4f, 0x8a, 0x01, 0x26, 0x9b, 0x59, 0x3f, 0x0f, 0x27, 0x88, 0xfc, 0x17, 0x33, 0xb1, 0x2c, 0xcc, 0xf5, 0x93, 0xa8, 0x45, 0xe0, 0x02, 0xb2, 0xd5, 0x3e, 0xfd, 0xa2, 0xa9, 0x29, 0x87, 0x38, 0xa6, 0x61, 0xb3, +0x9a, 0x96, 0xcb, 0x0b, 0xbd, 0xae, 0xc1, 0xfe, 0x83, 0x10, 0x4a, 0xf9, 0xe9, 0xf2, 0xba, 0x97, 0xf1, 0xa1, 0xbc, 0x5d, 0xdb, 0x5f, 0x6b, 0xce, 0xd6, 0x40, 0xf8, 0xb6, 0x1f, 0x4e, 0x7e, 0xeb, 0x8d, 0xf0, 0x23, 0x4b, 0x98, 0x8e, 0x7c, 0x4d, +0xbe, 0x9c, 0xc7, 0xd7, 0x00, 0x52, 0xc6, 0x6e, 0x7f, 0xbb, 0x84, 0x5c, 0xc4, 0x68, 0x63, 0x34, 0x47, 0x62, 0xd9, 0x65, 0xcd, 0x81, 0x1d, 0x6c, 0xe3, 0x79, 0xd2, 0xc3, 0x72, 0x19, 0x82, 0x09, 0x2b, 0xf4, 0x75, 0x60, 0x6d, 0xea, 0xf6, 0xa0, +0xfb, 0x99, 0x7d, 0xed, 0x6f, 0x92, 0x05, 0xa4, 0x0e, 0xc0, 0x73, 0xb8, 0x8c, 0x64, 0x03, 0x36, 0x10, 0xca, 0xd5, 0xef, 0x60, 0x2f, 0xfc, 0xfb, 0x54, 0x2b, 0x89, 0x8d, 0xc2, 0xed, 0x39, 0x86, 0x50, 0xd3, 0x55, 0xa9, 0x87, 0xf6, 0x9b, 0x90, +0x77, 0x1c, 0x3d, 0xfd, 0xd7, 0x43, 0x0b, 0xf3, 0xbb, 0xeb, 0xc5, 0x64, 0x9c, 0xe9, 0xcc, 0x68, 0xf7, 0x22, 0x17, 0xdd, 0x1b, 0x99, 0xe1, 0xb3, 0x11, 0xd6, 0x9a, 0x9f, 0x57, 0x6b, 0x65, 0xd0, 0x94, 0x80, 0xac, 0x84, 0x6d, 0x1a, 0xd1, 0x4e, +0xb1, 0x07, 0x61, 0x23, 0xce, 0xdc, 0xa0, 0x5b, 0xa1, 0x6e, 0x8a, 0xaa, 0x05, 0xa5, 0x36, 0x01, 0x5e, 0xb6, 0x71, 0x8e, 0xf0, 0xc8, 0x4a, 0xc7, 0x25, 0x78, 0x63, 0xc0, 0xdb, 0xea, 0x62, 0x45, 0x98, 0xcb, 0xa8, 0x7f, 0x41, 0xa3, 0xb9, 0x15, +0x4b, 0xd8, 0xa2, 0xf4, 0xbe, 0xc4, 0x28, 0x42, 0x8b, 0x67, 0xb2, 0xab, 0xb7, 0x53, 0x6f, 0x3a, 0x48, 0x7b, 0x1e, 0x47, 0x88, 0x0d, 0x04, 0x85, 0x58, 0x66, 0x7a, 0x03, 0x4d, 0xd4, 0x27, 0x13, 0xd9, 0xf5, 0x3f, 0x16, 0x97, 0xdf, 0x6a, 0xaf, +0x5f, 0x7e, 0x14, 0x70, 0x8f, 0x44, 0x5d, 0x0c, 0xf1, 0x8c, 0x31, 0x9e, 0x3c, 0x0e, 0x82, 0x4f, 0x3b, 0x5c, 0x49, 0x91, 0x73, 0xc3, 0x29, 0xcf, 0x0a, 0x7c, 0x79, 0xe2, 0xd2, 0xff, 0xad, 0x72, 0xc9, 0x19, 0x4c, 0xb8, 0x2e, 0xf8, 0xae, 0x51, +0xa7, 0xe4, 0xc6, 0x1d, 0x30, 0xee, 0xe6, 0xfe, 0xcd, 0xbf, 0x96, 0x2d, 0x95, 0x2c, 0x7d, 0x93, 0x09, 0xda, 0x74, 0x34, 0x0f, 0x21, 0xbd, 0xbc, 0x81, 0xa4, 0x32, 0xe0, 0x35, 0x2a, 0x37, 0xde, 0xc1, 0xb5, 0xb4, 0xec, 0xe3, 0xf2, 0x20, 0x33, +0xa6, 0x9d, 0xf9, 0xfa, 0x26, 0x83, 0x46, 0x24, 0xe8, 0x08, 0x02, 0x12, 0xe7, 0xe5, 0x52, 0x76, 0x5a, 0x06, 0x18, 0x92, 0x38, 0x3e, 0x75, 0x56, 0xba, 0x59, 0xb0, 0x6c, 0x69, 0x00, 0x40, 0x1f, 0x2c, 0xa0, 0x6d, 0x55, 0xfc, 0x8f, 0x79, 0xcc, +0x8b, 0xab, 0x57, 0x34, 0xf5, 0x20, 0xbc, 0x5b, 0xae, 0x0d, 0x4f, 0x89, 0xf7, 0xe3, 0xc5, 0xbe, 0x65, 0xa4, 0xa5, 0xb7, 0x9c, 0x3a, 0x35, 0x91, 0x17, 0xd9, 0x08, 0x5a, 0x5e, 0x56, 0xed, 0x4d, 0x04, 0xc3, 0x88, 0x1a, 0xef, 0xe7, 0xd0, 0xb6, +0x6e, 0x3e, 0x52, 0x62, 0x1d, 0x5f, 0xa7, 0x27, 0x97, 0x0f, 0x9d, 0x02, 0xea, 0x7a, 0x1e, 0x2f, 0x80, 0xd3, 0x7b, 0xaa, 0xcb, 0xf1, 0x44, 0x01, 0x37, 0x83, 0x47, 0xc6, 0x75, 0xdc, 0x07, 0x93, 0x8c, 0xd7, 0x6a, 0x00, 0x2a, 0x36, 0x26, 0x09, +0x54, 0xb8, 0xf2, 0xff, 0x78, 0x84, 0x28, 0x21, 0xbd, 0x7d, 0x2b, 0xe8, 0xda, 0xe9, 0xfe, 0x23, 0x5d, 0xac, 0xce, 0x81, 0x38, 0xa2, 0x63, 0xcf, 0xd8, 0xcd, 0x32, 0x43, 0x8e, 0x24, 0x31, 0x64, 0x9f, 0x9b, 0xb3, 0x3b, 0xd5, 0x46, 0xbb, 0x25, +0x69, 0x99, 0xd1, 0x48, 0xf6, 0xe0, 0x2e, 0x4c, 0x70, 0xdf, 0x05, 0xe4, 0xa9, 0x4a, 0xc1, 0x5c, 0x15, 0x3c, 0xd4, 0xb5, 0x13, 0xf3, 0x51, 0xc7, 0xc8, 0x60, 0x71, 0xba, 0x0e, 0x76, 0xc2, 0xe1, 0x1b, 0x41, 0x1f, 0x40, 0x45, 0x7c, 0x59, 0x6b, +0xa1, 0x9a, 0xc0, 0xe6, 0xb0, 0xc9, 0xf8, 0x06, 0x3d, 0x61, 0x2d, 0x33, 0xf4, 0x90, 0xbf, 0x77, 0x29, 0xfd, 0x95, 0xb1, 0x22, 0x66, 0x58, 0x10, 0x42, 0x92, 0x3f, 0xa3, 0xad, 0x7f, 0x0a, 0xb9, 0x50, 0x1c, 0x94, 0x4b, 0x7e, 0xf0, 0x86, 0xa8, +0xf9, 0x0c, 0xca, 0xd2, 0x4e, 0x19, 0xfa, 0xeb, 0x85, 0xe2, 0x18, 0x14, 0x82, 0x39, 0xdd, 0x11, 0x96, 0xd6, 0xe5, 0x74, 0xc4, 0xb2, 0x03, 0xb4, 0x67, 0x9e, 0x98, 0x87, 0xee, 0x68, 0x72, 0x8d, 0xec, 0xa6, 0x16, 0xaf, 0x49, 0xfb, 0x6c, 0x8a, +0x53, 0x0b, 0xde, 0x6f, 0x30, 0x73, 0x12, 0xdb, 0x61, 0x6b, 0x71, 0x43, 0x2f, 0x80, 0x17, 0x19, 0x47, 0x4a, 0x58, 0x05, 0xd4, 0xf3, 0x82, 0x28, 0x5e, 0x04, 0x0b, 0xe2, 0x9c, 0xb9, 0x4f, 0xd2, 0x20, 0x6e, 0xef, 0x13, 0xdf, 0xae, 0xfc, 0x0a, +0x52, 0x4c, 0x8f, 0xfb, 0x07, 0x14, 0x77, 0x0f, 0xc3, 0x97, 0xe8, 0x7c, 0x7d, 0xbd, 0xe0, 0x5a, 0xa5, 0x57, 0x67, 0x03, 0xd3, 0x18, 0x15, 0x79, 0xf1, 0x45, 0x40, 0xcd, 0xb7, 0x5f, 0x88, 0x55, 0x41, 0x3b, 0xde, 0x1f, 0x2c, 0xac, 0x12, 0x44, +0x8b, 0xfd, 0x51, 0xd8, 0x68, 0xc5, 0x70, 0xaf, 0x85, 0x21, 0x5d, 0x38, 0x60, 0x8a, 0xf4, 0xa4, 0x9a, 0x99, 0xa8, 0x39, 0x3e, 0xb0, 0x9f, 0x3a, 0x54, 0x81, 0xfa, 0xcc, 0x36, 0xa1, 0x3f, 0x6d, 0x8e, 0x8c, 0x46, 0x0c, 0x84, 0x48, 0x11, 0x01, +0xea, 0x3d, 0x78, 0x1b, 0xfe, 0xf6, 0x90, 0x72, 0xb5, 0x53, 0xd0, 0xbe, 0x09, 0x23, 0x95, 0xf2, 0xa9, 0x08, 0xc6, 0x4e, 0x7f, 0x63, 0xd7, 0xa2, 0xdd, 0xbf, 0xc8, 0xf5, 0xcb, 0xdc, 0xa6, 0x9d, 0xba, 0x29, 0x3c, 0xb3, 0xec, 0xc7, 0x06, 0x6c, +0x1e, 0x33, 0x34, 0xc4, 0x65, 0x9b, 0x16, 0x8d, 0xee, 0x42, 0xad, 0xd1, 0x73, 0xce, 0x74, 0x27, 0x64, 0xbc, 0x50, 0x31, 0xff, 0xbb, 0xeb, 0x5b, 0xed, 0x6f, 0x98, 0x69, 0x4b, 0x0e, 0xe4, 0x2e, 0xc2, 0x22, 0x02, 0x62, 0x26, 0x56, 0x96, 0xb2, +0xa3, 0xe5, 0xf9, 0x2b, 0xd6, 0xc9, 0x59, 0x10, 0xaa, 0x32, 0xca, 0xc1, 0x00, 0x83, 0xb4, 0xcf, 0x7b, 0xe7, 0x94, 0xe9, 0xa7, 0x6a, 0xf0, 0x76, 0x30, 0xd5, 0xa0, 0x91, 0x87, 0x24, 0xc0, 0x9e, 0x66, 0x93, 0x1c, 0x4d, 0xf8, 0xd9, 0x2a, 0xe3, +0x1d, 0x5c, 0x89, 0x25, 0x35, 0x0d, 0x37, 0x7a, 0xab, 0xb6, 0xf7, 0xe6, 0x2d, 0x75, 0x1a, 0xb8, 0xdb, 0x49, 0xda, 0xb1, 0x7e, 0x86, 0x92, 0xe1, 0x2a, 0x73, 0x4d, 0x7d, 0x84, 0xef, 0xc4, 0x44, 0x60, 0xb7, 0x46, 0x3d, 0x90, 0x4a, 0xf1, 0x37, +0x39, 0x89, 0x83, 0xd9, 0x65, 0x8b, 0x92, 0xab, 0xed, 0x33, 0xf4, 0xe2, 0x99, 0x8a, 0xf2, 0x02, 0xdb, 0x57, 0x7a, 0xc5, 0xce, 0xbd, 0x01, 0x7b, 0xe9, 0xe1, 0x06, 0x0d, 0x1f, 0xd1, 0xf5, 0x11, 0xd4, 0xb5, 0x48, 0x6d, 0x1b, 0x8d, 0xaa, 0x5e, +0x2b, 0xe3, 0x77, 0xa4, 0x78, 0x66, 0xd7, 0x4c, 0x52, 0x12, 0xf0, 0x29, 0x93, 0xe5, 0x6e, 0xcc, 0xb6, 0x64, 0x42, 0x68, 0xb9, 0x69, 0xcd, 0xf8, 0x8f, 0xfe, 0xdc, 0xa0, 0xe4, 0xb1, 0xe0, 0x75, 0xa8, 0x87, 0x98, 0x82, 0x6f, 0x05, 0x0c, 0x58, +0x6c, 0xae, 0x61, 0x79, 0x25, 0x88, 0xe6, 0xf7, 0xf9, 0xb0, 0x3e, 0xd8, 0x00, 0xa7, 0xa3, 0x1a, 0x2c, 0x62, 0x2f, 0x7c, 0x4b, 0xbc, 0x67, 0x5d, 0xbb, 0xd3, 0x30, 0x03, 0x97, 0x18, 0x80, 0x40, 0x74, 0x8e, 0x14, 0x5c, 0x1c, 0x16, 0x71, 0x55, +0x19, 0x24, 0x27, 0xec, 0x91, 0x3f, 0x81, 0xa2, 0xff, 0x15, 0xda, 0x9a, 0x7e, 0xc2, 0x6a, 0xad, 0x76, 0x85, 0x7f, 0x5f, 0xfb, 0xa5, 0x26, 0xf3, 0xb8, 0x5b, 0x38, 0xb3, 0x59, 0xf6, 0xbe, 0xde, 0x32, 0x09, 0x08, 0xfa, 0x3c, 0x45, 0xaf, 0x04, +0x3b, 0x9f, 0x1e, 0x53, 0xd5, 0xc7, 0x0e, 0x70, 0x4f, 0xd0, 0x96, 0xa9, 0x6b, 0x5a, 0x2d, 0xba, 0xb2, 0x28, 0xd6, 0xa1, 0x23, 0xd2, 0xc0, 0xe7, 0x72, 0xc6, 0xc1, 0xb4, 0x35, 0x9c, 0xfc, 0x07, 0xfd, 0x34, 0xcb, 0xc8, 0xac, 0x1d, 0x10, 0x2e, +0x3a, 0x36, 0x8c, 0x50, 0x22, 0xee, 0xe8, 0x95, 0x49, 0x86, 0xca, 0xc3, 0x17, 0xdd, 0x4e, 0x43, 0xc9, 0x21, 0xeb, 0x63, 0x0f, 0x0a, 0x41, 0xdf, 0xcf, 0x9e, 0x31, 0xbf, 0x9d, 0x9b, 0x0b, 0x47, 0x51, 0x94, 0xea, 0x13, 0x56, 0x54, 0x20, 0xa6, +0xdc, 0xe3, 0x14, 0x0c, 0xc2, 0x15, 0x88, 0x41, 0x25, 0xf9, 0x38, 0x08, 0xc5, 0x8c, 0x4e, 0xea, 0x96, 0x5e, 0x3c, 0xf3, 0x99, 0x52, 0xa9, 0xd5, 0xf2, 0xdd, 0x01, 0xfb, 0x16, 0x9e, 0x3d, 0x18, 0x34, 0xaa, 0x2b, 0xdf, 0x1a, 0x70, 0x63, 0x69, +0xf4, 0xd7, 0x00, 0x95, 0x0d, 0x13, 0xa8, 0x62, 0x75, 0xd2, 0xb2, 0xa0, 0x9d, 0xe0, 0x31, 0xb1, 0xe5, 0x3f, 0x68, 0xd9, 0x58, 0xcf, 0x82, 0x93, 0x94, 0x9c, 0xba, 0xeb, 0x2a, 0x0a, 0x85, 0x5c, 0x11, 0xc3, 0x8a, 0x60, 0x66, 0x9f, 0x0f, 0xb0, +0x8f, 0x7d, 0x5a, 0x09, 0x46, 0x98, 0xc7, 0x5d, 0xc1, 0xb4, 0xf6, 0xac, 0xa6, 0xce, 0xcd, 0x2e, 0xe2, 0x6d, 0x83, 0x2c, 0x89, 0x72, 0xde, 0xe7, 0xec, 0xff, 0xa7, 0x56, 0xda, 0x71, 0x28, 0x12, 0x55, 0xd3, 0x0e, 0x74, 0xcc, 0x1c, 0xb7, 0x0b, +0x53, 0x86, 0xb9, 0x1b, 0x6a, 0xa4, 0xee, 0xe8, 0x44, 0xca, 0x78, 0x73, 0x27, 0x67, 0xf0, 0x03, 0xaf, 0xef, 0x1d, 0x37, 0xae, 0x22, 0xe1, 0x24, 0x59, 0x17, 0x7c, 0x47, 0xa3, 0xd4, 0x97, 0x81, 0x4c, 0xfc, 0xb3, 0x07, 0x4d, 0xc6, 0x76, 0x45, +0xab, 0xcb, 0xf5, 0x35, 0xfe, 0x10, 0x40, 0xe9, 0x92, 0xb5, 0x87, 0x77, 0xc9, 0x3e, 0x49, 0x30, 0xc8, 0xbb, 0x23, 0x21, 0xd8, 0x1f, 0xb8, 0x8d, 0x90, 0xe6, 0x8e, 0xd0, 0x32, 0x7e, 0x80, 0x64, 0x19, 0xdb, 0xa5, 0x3a, 0xbe, 0xbd, 0x48, 0x33, +0x5f, 0x06, 0x43, 0x4f, 0x6b, 0x26, 0xad, 0x4b, 0xbf, 0xb6, 0xd1, 0x02, 0xfa, 0x8b, 0x51, 0x6c, 0x61, 0x29, 0xf7, 0xed, 0xa1, 0xc0, 0x54, 0xbc, 0xf8, 0x6e, 0x7a, 0x7f, 0x20, 0x04, 0x79, 0x2d, 0xc4, 0x91, 0xe4, 0x4a, 0x36, 0x3b, 0xa2, 0x39, +0x05, 0x7b, 0xd6, 0x6f, 0x9a, 0xf1, 0x57, 0x9b, 0x5b, 0x65, 0x84, 0x42, 0xfd, 0x50, 0x1e, 0x2f, 0x77, 0xa1, 0xb3, 0x4d, 0xbd, 0xe9, 0x94, 0xae, 0xb9, 0xe3, 0x14, 0xc7, 0xb2, 0x33, 0xc3, 0x7e, 0xe8, 0x9a, 0xce, 0xb6, 0x50, 0xdf, 0x49, 0x1c, +0x24, 0x45, 0x90, 0x4e, 0xd9, 0xdd, 0xdb, 0x2d, 0x6d, 0x0d, 0xac, 0x8f, 0x2b, 0x9d, 0xc2, 0x68, 0x01, 0x28, 0xb0, 0xdc, 0x71, 0xf9, 0xbe, 0xc9, 0x37, 0x3d, 0x5b, 0x22, 0xd3, 0xef, 0x81, 0xc4, 0x15, 0x4a, 0x7d, 0x6a, 0xda, 0x6e, 0x0a, 0xc5, +0x9e, 0x38, 0x21, 0xa2, 0x60, 0x86, 0x59, 0x80, 0xec, 0x96, 0xcd, 0x0b, 0x19, 0x52, 0x5c, 0x04, 0x56, 0x30, 0x75, 0x97, 0x79, 0xab, 0x46, 0x84, 0xd4, 0xbf, 0x47, 0x89, 0x13, 0xee, 0x55, 0x8a, 0x12, 0xd7, 0xa6, 0x99, 0x62, 0xd1, 0x02, 0xa7, +0x8b, 0x4f, 0xa5, 0xf7, 0xe1, 0x9c, 0x65, 0x29, 0x3b, 0x9f, 0xa0, 0x53, 0x6c, 0xde, 0x17, 0x36, 0x23, 0x2c, 0x1f, 0xbc, 0x05, 0x07, 0xb7, 0x06, 0x18, 0x8c, 0x6f, 0x00, 0x42, 0x7b, 0x0e, 0x95, 0xfd, 0xe7, 0x25, 0x76, 0x31, 0xd8, 0xa3, 0x85, +0x1d, 0x8e, 0xa4, 0x20, 0xf1, 0x67, 0xeb, 0xf8, 0xe0, 0x88, 0x43, 0x32, 0x40, 0x98, 0x57, 0xff, 0xe6, 0x78, 0xb5, 0x92, 0xb4, 0x54, 0x16, 0xfb, 0xf0, 0x51, 0xaf, 0xba, 0x0c, 0x87, 0x03, 0xc8, 0x44, 0xed, 0x39, 0xf3, 0x48, 0x7a, 0xc0, 0xad, +0xcc, 0x41, 0xcb, 0x1a, 0xf5, 0x0f, 0x5d, 0x66, 0xc6, 0xa8, 0xa9, 0xea, 0x4b, 0xf4, 0x08, 0x73, 0x69, 0xd0, 0x63, 0xc1, 0x3f, 0xfe, 0x9b, 0x82, 0x61, 0x27, 0xd2, 0xfc, 0xca, 0x93, 0x7c, 0x74, 0x34, 0xe4, 0x3c, 0x91, 0xf6, 0x64, 0xe5, 0xe2, +0xf2, 0x2e, 0x58, 0xd6, 0x5f, 0x1e, 0xfa, 0x5a, 0x8d, 0x11, 0x1b, 0x2f, 0x7f, 0xb8, 0x26, 0xb1, 0xd5, 0x10, 0xbb, 0x72, 0xaa, 0xcf, 0x3e, 0x2a, 0x70, 0x3a, 0x83, 0x09, 0x4c, 0x5e, 0x35, 0x6b, 0x98, 0xe6, 0xe5, 0xae, 0xeb, 0xac, 0xfd, 0x0e, +0xdc, 0x4a, 0x43, 0x80, 0x6f, 0x7a, 0xe0, 0xf6, 0xf4, 0x04, 0xda, 0x70, 0x22, 0xff, 0x2c, 0x4d, 0xf1, 0xaf, 0xa7, 0x2e, 0x19, 0x77, 0x0c, 0x41, 0xb9, 0x25, 0x1f, 0x9f, 0x1b, 0x13, 0x46, 0xb3, 0x3f, 0x14, 0xb6, 0xbc, 0x24, 0xd6, 0x7b, 0xc6, +0x78, 0x17, 0x26, 0x8d, 0x94, 0x6e, 0xbb, 0x05, 0x07, 0x50, 0xfe, 0x30, 0xcc, 0xfc, 0x57, 0xe4, 0x06, 0xe8, 0x09, 0x35, 0x9d, 0xb5, 0x61, 0xb2, 0x87, 0x40, 0x16, 0xad, 0xb0, 0x9e, 0x66, 0xf9, 0x1c, 0x2d, 0x67, 0xb8, 0xfb, 0x9c, 0x00, 0x15, +0x7c, 0xe7, 0xdb, 0x86, 0xf2, 0x7f, 0xc9, 0x79, 0x31, 0xa2, 0xe3, 0x4c, 0x5b, 0x90, 0xf5, 0x59, 0x23, 0xee, 0xc7, 0xbd, 0x0a, 0xdd, 0x82, 0xa3, 0x7d, 0xf7, 0x49, 0x93, 0x36, 0x89, 0xab, 0xc2, 0x3b, 0x74, 0x6b, 0x48, 0xd1, 0x32, 0x55, 0x51, +0x9a, 0x12, 0x71, 0xec, 0xde, 0xa6, 0x3e, 0xcf, 0xca, 0x83, 0x58, 0x3d, 0x54, 0x62, 0x63, 0xc1, 0x5d, 0x84, 0x91, 0x7e, 0xe2, 0xed, 0x3c, 0x9b, 0xfa, 0x60, 0xc5, 0x6d, 0xea, 0x0b, 0x2a, 0xb4, 0x18, 0xa0, 0xcd, 0xd7, 0xa5, 0x52, 0xbf, 0xd2, +0xd8, 0xbe, 0x1d, 0x11, 0x76, 0x3a, 0x68, 0xf8, 0xcb, 0x53, 0x4e, 0xc0, 0x8b, 0x47, 0xce, 0x5c, 0x73, 0x64, 0x2b, 0x65, 0x21, 0x75, 0x99, 0xe9, 0x02, 0xd0, 0xd5, 0x85, 0x81, 0xd3, 0x28, 0x39, 0xb1, 0xc4, 0x08, 0xe1, 0xb7, 0xc3, 0x45, 0x8f, +0x5a, 0x95, 0xef, 0x34, 0x92, 0x44, 0x2f, 0xd4, 0x20, 0x38, 0x01, 0xa1, 0x8a, 0xc8, 0x5e, 0x8e, 0x88, 0x0d, 0xdf, 0x1a, 0x97, 0xa9, 0x4f, 0x56, 0x1e, 0x37, 0x5f, 0x6c, 0xd9, 0x8c, 0x96, 0x0f, 0x29, 0x4b, 0x03, 0x72, 0x33, 0xf3, 0x10, 0xf0, +0xa4, 0x27, 0x6a, 0x69, 0xaa, 0xa8, 0x42, 0xba, 0xd9, 0x06, 0xbb, 0x09, 0x4a, 0x15, 0xdb, 0xa3, 0xe5, 0x58, 0xff, 0x49, 0xb8, 0x7c, 0xe1, 0x62, 0x46, 0xda, 0xd1, 0x92, 0xaf, 0x89, 0x65, 0x85, 0x7b, 0xf6, 0x84, 0x00, 0x19, 0x1e, 0xf8, 0x9d, +0x90, 0x6b, 0xab, 0xd7, 0xcb, 0xc0, 0x45, 0x3b, 0x20, 0x2c, 0x02, 0x74, 0xa4, 0xba, 0x21, 0xc2, 0xea, 0x1d, 0xdc, 0x34, 0x6d, 0x87, 0xef, 0x35, 0x6e, 0x76, 0xbe, 0x38, 0x48, 0x6c, 0x71, 0x67, 0xb6, 0xfa, 0xf0, 0x16, 0x59, 0x03, 0xb0, 0x93, +0x07, 0xc8, 0x27, 0xa8, 0x61, 0x0a, 0xfb, 0x08, 0xa9, 0x79, 0x69, 0xa0, 0xfe, 0xc5, 0x8d, 0x1b, 0xf9, 0xe3, 0x94, 0xb3, 0xb2, 0x25, 0x86, 0x39, 0xf5, 0xde, 0xbc, 0x8b, 0x17, 0x0c, 0x32, 0xca, 0x96, 0xf1, 0x36, 0x81, 0xae, 0xf2, 0x7f, 0xe2, +0xc1, 0x9c, 0x55, 0x77, 0x99, 0xe6, 0x0b, 0x3d, 0x11, 0xe4, 0xbf, 0x40, 0x01, 0xd5, 0x3f, 0x5d, 0x8a, 0x78, 0x37, 0xc3, 0xad, 0x98, 0x4f, 0x4c, 0x1f, 0x2e, 0xfc, 0x70, 0x75, 0x5a, 0x8c, 0x7d, 0x9a, 0x2a, 0xec, 0x42, 0xa1, 0xa7, 0x51, 0x18, +0x73, 0xf3, 0xb7, 0x97, 0x56, 0x5f, 0x6a, 0xaa, 0x91, 0xf7, 0xed, 0x4e, 0x66, 0x23, 0xb1, 0xb5, 0xfd, 0x2b, 0xa2, 0xce, 0x63, 0xc6, 0xd0, 0x9b, 0xd2, 0x72, 0x0d, 0xcc, 0xc4, 0x50, 0x3a, 0x2f, 0x29, 0x44, 0x57, 0x8f, 0xd3, 0x95, 0xd6, 0x5c, +0xdf, 0x04, 0xe7, 0xe9, 0x53, 0x43, 0x8e, 0xc9, 0x64, 0xf4, 0xa6, 0x9e, 0x5b, 0x47, 0x88, 0xc7, 0x05, 0xbd, 0x0f, 0x22, 0x30, 0x2d, 0x4d, 0x24, 0x7e, 0x3c, 0x31, 0x52, 0xcf, 0x33, 0x28, 0xeb, 0x6f, 0x4b, 0x26, 0xe0, 0xd4, 0xee, 0x60, 0xe8, +0x54, 0x5e, 0x13, 0xcd, 0x83, 0x41, 0x82, 0x80, 0x12, 0x1a, 0x1c, 0x0e, 0x10, 0xb9, 0xdd, 0xac, 0xa5, 0x3e, 0x9f, 0x14, 0xb4, 0x68, 0x7a, 0xd8, 0xe5, 0x2d, 0xcb, 0xa4, 0xde, 0x71, 0xd2, 0x73, 0xe9, 0xed, 0xbf, 0x4b, 0xca, 0x8f, 0x5d, 0xaf, +0x02, 0x94, 0xc0, 0xe2, 0x20, 0x1b, 0x0c, 0x51, 0x04, 0xe8, 0x84, 0x57, 0x2f, 0xf2, 0x7d, 0x1d, 0xda, 0x0a, 0xfe, 0x81, 0x3c, 0xf5, 0xc2, 0xf4, 0x50, 0xb7, 0x9f, 0x46, 0x80, 0xd0, 0x3e, 0x43, 0x8d, 0xcd, 0xfd, 0xe4, 0x96, 0x5a, 0x0d, 0x4c, +0x3f, 0x59, 0xee, 0xdb, 0x09, 0xaa, 0x26, 0x25, 0x41, 0xdd, 0x16, 0xfc, 0x5c, 0x1f, 0x8c, 0x56, 0xd6, 0x03, 0x97, 0xb6, 0x91, 0xa1, 0x9a, 0x67, 0xf1, 0x60, 0xf7, 0xa9, 0xe3, 0x58, 0x1e, 0x47, 0xd3, 0xf6, 0x98, 0x88, 0x72, 0xb4, 0xea, 0xad, +0xbb, 0xdf, 0xe1, 0x2b, 0xb5, 0x54, 0xd1, 0xb9, 0x83, 0x0b, 0x74, 0x7a, 0x3b, 0x01, 0x07, 0xdc, 0x53, 0xb3, 0xba, 0x52, 0x69, 0x4f, 0x9b, 0x6c, 0x65, 0x68, 0x89, 0x9e, 0x14, 0x27, 0xbd, 0xcf, 0x62, 0x24, 0x31, 0xb1, 0xbe, 0x34, 0xa2, 0x82, +0xa7, 0x70, 0x49, 0x11, 0xa5, 0x19, 0xc8, 0x7b, 0x21, 0xa8, 0x9c, 0xe7, 0x42, 0x6e, 0x37, 0xf0, 0x90, 0xfb, 0x44, 0x23, 0x00, 0xf3, 0x79, 0xce, 0xc4, 0xb0, 0x86, 0xd5, 0x1a, 0x9d, 0xd4, 0x4a, 0x93, 0x1c, 0x36, 0xab, 0x08, 0xc7, 0x22, 0x7e, +0x64, 0xbc, 0xd8, 0x18, 0x78, 0x15, 0x7f, 0x76, 0x48, 0x06, 0xc6, 0x38, 0x8b, 0x8e, 0xec, 0xc5, 0xe6, 0x4d, 0xeb, 0x3a, 0x32, 0x17, 0xa6, 0x35, 0x33, 0x85, 0xc9, 0x2a, 0xae, 0x13, 0x75, 0x6b, 0xb2, 0x39, 0xef, 0x2c, 0x95, 0x0e, 0xc1, 0x3d, +0xff, 0xd7, 0xa0, 0xd9, 0x30, 0x8a, 0xf8, 0x99, 0x4e, 0x92, 0x28, 0x6a, 0xf9, 0x5b, 0x66, 0x05, 0x0f, 0xe0, 0x12, 0xa3, 0xfa, 0xac, 0x87, 0x55, 0x2e, 0x10, 0x77, 0x63, 0x45, 0x6f, 0x5e, 0xcc, 0x7c, 0xb8, 0x6d, 0x61, 0xc3, 0x40, 0x5f, 0x29, +0xf3, 0x17, 0x2c, 0x43, 0xee, 0xe7, 0xcf, 0x6f, 0x60, 0x90, 0x62, 0x3a, 0xea, 0xe9, 0x38, 0x54, 0xfa, 0x0f, 0xcd, 0xf6, 0xe1, 0x95, 0x0d, 0xa0, 0xd8, 0xef, 0xf7, 0x04, 0x5b, 0xbc, 0x5e, 0x0b, 0xd2, 0x83, 0xb1, 0xa6, 0x69, 0x77, 0x8c, 0x53, +0xfc, 0x66, 0x16, 0x02, 0xb6, 0x6c, 0xc5, 0x41, 0x2f, 0xbf, 0x42, 0x78, 0x7f, 0x57, 0xd7, 0xe8, 0x32, 0x1f, 0xa4, 0x06, 0x94, 0x05, 0x6e, 0xa5, 0x72, 0x1b, 0x13, 0x98, 0xa7, 0x46, 0xad, 0x14, 0x31, 0x2d, 0x26, 0x55, 0xff, 0xa9, 0x87, 0xd3, +0x12, 0x61, 0xae, 0x3d, 0x52, 0xba, 0xde, 0xbb, 0x9b, 0x75, 0x7c, 0x81, 0x15, 0x19, 0x0e, 0x51, 0x23, 0xdb, 0x49, 0xc6, 0x5d, 0x80, 0xb5, 0x11, 0xb7, 0x63, 0x35, 0xe5, 0xdc, 0xf0, 0x20, 0xda, 0x40, 0xb9, 0x85, 0xac, 0x09, 0xfd, 0xd9, 0x92, +0xfe, 0x8b, 0xd0, 0x91, 0x22, 0xa2, 0xa8, 0x3c, 0x9f, 0x29, 0x3b, 0x45, 0x68, 0xce, 0x03, 0x30, 0x37, 0xab, 0xd5, 0xf1, 0x10, 0xf9, 0xb3, 0x99, 0xbe, 0xdf, 0x50, 0x4f, 0x4c, 0x4e, 0xaf, 0xa1, 0x93, 0xca, 0x0a, 0xb4, 0x4d, 0xe4, 0x96, 0xd4, +0x44, 0x9c, 0x88, 0xc1, 0x2e, 0x64, 0x67, 0xc8, 0xd6, 0xb0, 0x5f, 0x70, 0x48, 0x74, 0xbd, 0x01, 0x84, 0x1a, 0xec, 0x59, 0xcc, 0x73, 0x65, 0x47, 0xfb, 0x86, 0x2a, 0x5a, 0x9a, 0xc0, 0x1e, 0x79, 0x33, 0xe0, 0x76, 0x9d, 0xaa, 0xe6, 0x5c, 0x00, +0xf2, 0x89, 0x7d, 0xd1, 0x0c, 0x2b, 0xb8, 0x8e, 0x71, 0x34, 0x36, 0x07, 0xdd, 0x3f, 0x8a, 0xc4, 0xf4, 0x7e, 0xf8, 0x56, 0x25, 0x8d, 0x82, 0xc2, 0xed, 0x27, 0x8f, 0x6a, 0xe3, 0xeb, 0x97, 0x6b, 0xcb, 0x7a, 0x7b, 0xe2, 0x1d, 0xc3, 0xb2, 0xf5, +0x3e, 0x18, 0x39, 0x21, 0x1c, 0x28, 0x08, 0xa3, 0x4a, 0xc9, 0x58, 0x24, 0xc7, 0x6d, 0x9e, 0x4b, 0x44, 0x08, 0x26, 0xfa, 0xed, 0x1d, 0x14, 0x31, 0x68, 0x54, 0x7b, 0xaa, 0x22, 0xda, 0x69, 0x0a, 0xff, 0xba, 0xf0, 0x7d, 0x09, 0xee, 0x2e, 0xab, +0xac, 0xd1, 0x20, 0xae, 0x6e, 0x9a, 0xc2, 0xd4, 0xef, 0x94, 0x23, 0x59, 0xa8, 0xa1, 0xf4, 0x0f, 0xc6, 0x1e, 0x80, 0xf8, 0x88, 0xa4, 0x5b, 0x0c, 0x5a, 0xf2, 0x95, 0xe7, 0x96, 0x63, 0xd7, 0xc7, 0x8d, 0x32, 0x61, 0xa7, 0x4e, 0x3b, 0xce, 0xc3, +0xc5, 0xca, 0x4a, 0x5e, 0x38, 0x13, 0x21, 0xdd, 0x06, 0x25, 0xdb, 0x50, 0x89, 0x98, 0xa9, 0x83, 0xd3, 0xb3, 0x93, 0x58, 0x1a, 0x2f, 0x87, 0x9f, 0x71, 0xd2, 0xfb, 0x9e, 0xa0, 0x4c, 0xc0, 0x7e, 0x56, 0x10, 0xb4, 0x6b, 0xcc, 0x4b, 0xd6, 0x4f, +0x92, 0xc1, 0xa3, 0xf7, 0x67, 0x47, 0x3c, 0x42, 0x5f, 0x45, 0x8b, 0xb1, 0x74, 0x39, 0x65, 0xb0, 0x41, 0x6f, 0xbb, 0x46, 0xe6, 0x84, 0x43, 0x4d, 0x28, 0x6c, 0xcd, 0xb9, 0x7a, 0xc8, 0x81, 0x0b, 0xbe, 0xb5, 0xb6, 0x36, 0x9d, 0xea, 0x1c, 0x82, +0xe8, 0xd8, 0xb7, 0x53, 0x57, 0xdf, 0xd9, 0xfe, 0xde, 0x05, 0x30, 0xe4, 0x37, 0x16, 0x2a, 0x60, 0xc4, 0x07, 0x2c, 0x1b, 0xe1, 0x73, 0x0e, 0xec, 0xf1, 0xcf, 0x62, 0x9b, 0x8e, 0x15, 0x48, 0x12, 0xe0, 0x66, 0x51, 0x52, 0xbc, 0x85, 0x5c, 0x8f, +0xa5, 0x27, 0xe2, 0x3f, 0x70, 0x77, 0x55, 0x33, 0x6d, 0x11, 0xbf, 0x7f, 0xf6, 0xc9, 0xd0, 0x17, 0x34, 0x2b, 0x24, 0xad, 0x2d, 0x72, 0x86, 0xeb, 0xf5, 0xb2, 0x02, 0xfd, 0xdc, 0xcb, 0x8a, 0xb8, 0x91, 0xa2, 0x40, 0xd5, 0xf9, 0x01, 0xf3, 0x64, +0x0d, 0xa6, 0x75, 0x3d, 0x35, 0x97, 0x8c, 0x6a, 0x3e, 0x7c, 0x03, 0x18, 0x76, 0xe5, 0x1f, 0xe9, 0x9c, 0x79, 0x19, 0x49, 0x78, 0xfc, 0x04, 0x00, 0xbd, 0x99, 0xaf, 0x5d, 0x90, 0x29, 0x3a, 0xe3, 0xf0, 0xc3, 0xae, 0x46, 0xd3, 0x02, 0x57, 0xea, +0xcd, 0x30, 0xad, 0x31, 0x7f, 0x41, 0x34, 0x42, 0x47, 0x1e, 0xd7, 0xe0, 0xfc, 0x13, 0xf1, 0x92, 0x4b, 0xaa, 0x9f, 0x91, 0x83, 0xfa, 0x4f, 0xd4, 0x7a, 0xa1, 0x1f, 0x7b, 0xfd, 0x76, 0x95, 0xf4, 0xd0, 0x16, 0xbc, 0xe2, 0xee, 0xac, 0x37, 0x61, +0x1c, 0x5f, 0x2c, 0x0d, 0xde, 0xd2, 0xc2, 0xe8, 0xd8, 0x2f, 0x10, 0x1d, 0x0e, 0xb8, 0xfb, 0x68, 0xa3, 0x50, 0x7e, 0x05, 0x2a, 0x55, 0xa6, 0xf6, 0xbf, 0xe3, 0x2e, 0x5a, 0x9a, 0x0c, 0x8c, 0xec, 0x6e, 0x67, 0x74, 0x3a, 0x64, 0x60, 0x25, 0x84, +0x81, 0x0b, 0x43, 0x1b, 0x24, 0x11, 0x33, 0xff, 0xb4, 0x07, 0x45, 0x03, 0x52, 0x12, 0xb5, 0xb6, 0xbe, 0xbb, 0x38, 0xf8, 0xc6, 0xa9, 0x27, 0x62, 0x56, 0xd1, 0x39, 0xa4, 0x32, 0xe1, 0xa5, 0x9e, 0xe7, 0x20, 0x1a, 0x71, 0x2b, 0xcc, 0x21, 0x17, +0x3c, 0x82, 0x8f, 0x93, 0x73, 0x04, 0x29, 0x58, 0x3e, 0x87, 0xef, 0xed, 0xb2, 0xe5, 0xba, 0xa7, 0x8e, 0x28, 0xc7, 0xa2, 0x49, 0xd6, 0xce, 0xc5, 0xf7, 0x19, 0x8b, 0xaf, 0x26, 0xcb, 0xc9, 0xb1, 0x4a, 0x5c, 0x06, 0x3b, 0x22, 0x7d, 0xdc, 0x35, +0x72, 0x75, 0xdb, 0x89, 0x6b, 0x15, 0xf9, 0x8a, 0xda, 0x18, 0x53, 0xdd, 0xc1, 0xa8, 0x6f, 0x70, 0xf2, 0xbd, 0x48, 0xca, 0x09, 0xa0, 0x77, 0x23, 0x96, 0x36, 0x3d, 0xdf, 0xc8, 0x44, 0xd5, 0x98, 0xc4, 0x6a, 0x78, 0x88, 0x65, 0xb3, 0x4e, 0x7c, +0xb7, 0x80, 0xcf, 0x63, 0x9c, 0x86, 0x2d, 0x99, 0x01, 0x4d, 0xc0, 0x6d, 0x0a, 0xf5, 0x94, 0x59, 0x5e, 0x9b, 0xe6, 0x00, 0x66, 0x8d, 0x4c, 0xb9, 0x0f, 0x54, 0x14, 0x3f, 0xfe, 0xab, 0xb0, 0x97, 0x08, 0x40, 0x69, 0xd9, 0x5b, 0xf3, 0xe9, 0x85, +0xeb, 0xe4, 0x90, 0x51, 0x79, 0x9d, 0x6c, 0x5d, 0xb4, 0xe9, 0xe2, 0x68, 0xce, 0x2b, 0x7a, 0x97, 0x59, 0xf9, 0x48, 0x2a, 0xc4, 0x15, 0xd3, 0x42, 0x61, 0x54, 0x1d, 0x92, 0x14, 0xfa, 0xb7, 0xcd, 0x13, 0x49, 0x8e, 0x02, 0x8f, 0x5d, 0x8d, 0xbe, +0x80, 0x34, 0xab, 0x52, 0x3e, 0x85, 0x9d, 0x7e, 0x94, 0x28, 0x8a, 0xea, 0xe4, 0x1f, 0x41, 0x43, 0xd9, 0xf7, 0x0e, 0xa2, 0x19, 0x3f, 0xb3, 0xd0, 0x7f, 0x0b, 0x60, 0x79, 0x11, 0x0c, 0x71, 0xf5, 0xf1, 0x4a, 0x88, 0x1b, 0xa6, 0x72, 0x4d, 0x8c, +0xfe, 0x17, 0xc2, 0x47, 0x31, 0x77, 0x01, 0x23, 0x2c, 0x21, 0x9e, 0x2f, 0x84, 0xb5, 0x70, 0x53, 0x35, 0x0a, 0xc6, 0xfb, 0xef, 0x20, 0xa0, 0xa3, 0x99, 0x5b, 0xd5, 0xa9, 0xde, 0x0d, 0x05, 0xd2, 0xb0, 0xae, 0x74, 0xb2, 0xe5, 0xf4, 0xca, 0x9f, +0xf6, 0x7b, 0xdf, 0xb6, 0x9b, 0xda, 0x3c, 0xbb, 0x5e, 0x1c, 0x29, 0xc9, 0xc1, 0x9a, 0x26, 0x6c, 0x46, 0xa4, 0x64, 0x65, 0x00, 0xbd, 0x12, 0x55, 0x86, 0x6a, 0x90, 0xc8, 0xec, 0x7c, 0x66, 0x1e, 0x78, 0x82, 0x9c, 0xd1, 0x76, 0xaa, 0xa7, 0x4f, +0x89, 0x45, 0x32, 0xac, 0x2d, 0x09, 0xd7, 0xc5, 0x6e, 0xee, 0xeb, 0x7d, 0x24, 0x4e, 0xba, 0x03, 0x27, 0x3d, 0x67, 0x2e, 0xcf, 0x96, 0x22, 0x07, 0xbc, 0xe0, 0x4b, 0xe8, 0xf8, 0xaf, 0x58, 0xf2, 0xbf, 0x1a, 0x6b, 0x5c, 0xd4, 0xc3, 0x08, 0xe7, +0x36, 0x69, 0xff, 0xc7, 0x16, 0xa5, 0x3b, 0xe6, 0x40, 0x50, 0x25, 0x93, 0xad, 0xdd, 0x6d, 0x62, 0xb1, 0xb9, 0x83, 0x95, 0x8b, 0xd8, 0xa1, 0xe1, 0x37, 0xc0, 0xfd, 0x5f, 0xdc, 0x38, 0x44, 0x57, 0x91, 0x3a, 0x5a, 0x04, 0x75, 0x73, 0xfc, 0xdb, +0xed, 0x63, 0x4c, 0xd6, 0xcb, 0xf0, 0xb8, 0x98, 0x6f, 0x39, 0xf3, 0x81, 0x18, 0x33, 0xa8, 0xe3, 0x87, 0x06, 0x10, 0x0f, 0x30, 0x56, 0xcc, 0x51, 0xc7, 0x01, 0x8f, 0x70, 0x4c, 0xa0, 0x65, 0x5c, 0x2c, 0x6c, 0x2e, 0x88, 0x1d, 0x3b, 0x0d, 0x22, +0x7c, 0x08, 0xf9, 0xad, 0x1c, 0xbe, 0x45, 0xbd, 0xd6, 0x6b, 0x42, 0xf2, 0x49, 0x9e, 0x89, 0xe7, 0x26, 0xaa, 0x7a, 0x39, 0x29, 0xa8, 0x0a, 0xc2, 0x2a, 0x93, 0x0b, 0xec, 0x4e, 0x9a, 0x1f, 0x25, 0xbc, 0x55, 0x66, 0x28, 0xd9, 0x90, 0xde, 0x5d, +0x33, 0x18, 0x60, 0xfb, 0x6f, 0x15, 0xc3, 0x4a, 0xb1, 0x37, 0x06, 0xa5, 0xd7, 0xe5, 0x9b, 0x96, 0xcd, 0x69, 0xda, 0x4b, 0xe0, 0xfc, 0xdd, 0xe6, 0xa3, 0x9f, 0x54, 0xff, 0x31, 0x4f, 0xb5, 0x3f, 0xef, 0x57, 0x94, 0x5b, 0xee, 0x2b, 0x76, 0x99, +0x79, 0xb0, 0x80, 0xb8, 0x40, 0x24, 0xf3, 0x47, 0xa4, 0x71, 0xae, 0xe4, 0x73, 0x36, 0x7d, 0x59, 0x5f, 0x77, 0xe1, 0x1b, 0x05, 0xf6, 0x6d, 0x04, 0xa2, 0xcf, 0x63, 0x98, 0x78, 0x46, 0xf8, 0xf7, 0xac, 0x02, 0x0f, 0xb9, 0x09, 0x3d, 0x38, 0x84, +0xe2, 0x95, 0xca, 0x4d, 0x21, 0x3a, 0x56, 0x8a, 0xc5, 0x97, 0x5e, 0x92, 0xf1, 0x00, 0xdc, 0x3c, 0x74, 0x81, 0x34, 0xf0, 0xa9, 0x62, 0x87, 0x5a, 0xf4, 0x7f, 0x50, 0x67, 0x3e, 0x12, 0x6e, 0x51, 0xe8, 0xed, 0x13, 0xfe, 0x11, 0xd5, 0xa7, 0xa1, +0x03, 0x53, 0xea, 0x64, 0xcc, 0x44, 0xe9, 0x8b, 0x48, 0xd4, 0xb7, 0x86, 0xce, 0x61, 0x1e, 0xb4, 0xba, 0x35, 0x0e, 0x23, 0xcb, 0x9d, 0x16, 0xbb, 0xfd, 0xd8, 0x83, 0x75, 0xc8, 0x8e, 0x0c, 0x07, 0xe3, 0x58, 0x8d, 0x43, 0xb6, 0x20, 0x9c, 0xd3, +0xa6, 0xc0, 0x72, 0x6a, 0x8c, 0xbf, 0x1a, 0xb2, 0x68, 0x14, 0x2d, 0xf5, 0x30, 0xd2, 0xc1, 0xeb, 0x91, 0x82, 0x7e, 0xc4, 0x2f, 0x32, 0x10, 0x7b, 0x85, 0xab, 0x27, 0x17, 0xc6, 0xd0, 0xdb, 0xdf, 0xd1, 0x41, 0x19, 0xc9, 0xfa, 0xaf, 0x52, 0xb3, +0x9a, 0x88, 0x07, 0x41, 0xa6, 0x75, 0x38, 0x92, 0xbf, 0x4e, 0x99, 0x42, 0x1c, 0x36, 0x11, 0xa4, 0x3a, 0xd4, 0xcd, 0x10, 0xc1, 0xe1, 0xd6, 0xcb, 0x7e, 0xd3, 0xf1, 0xe5, 0xab, 0x23, 0x2c, 0xfa, 0xbc, 0xfd, 0xc6, 0x7f, 0xe3, 0x9b, 0x8a, 0x45, +0xf9, 0xd1, 0x1d, 0xed, 0xd8, 0x27, 0x7d, 0x97, 0xbb, 0x26, 0x95, 0x6e, 0xf3, 0x16, 0xc2, 0x82, 0x9c, 0xdf, 0x83, 0x14, 0x9f, 0xa3, 0x8d, 0xec, 0x52, 0x03, 0x80, 0x67, 0xb7, 0x77, 0xf5, 0x4d, 0xc9, 0x33, 0x89, 0x1a, 0x0a, 0xcc, 0xa9, 0x0c, +0xaa, 0xdb, 0xb3, 0xde, 0x3d, 0x40, 0x3e, 0x98, 0xd2, 0x5e, 0x84, 0x94, 0x4c, 0xe7, 0x90, 0x3c, 0x58, 0xef, 0x73, 0x78, 0xad, 0x13, 0x57, 0xf8, 0x85, 0x65, 0x01, 0x1b, 0x02, 0xe0, 0x3f, 0x8e, 0x60, 0x0f, 0x76, 0xbd, 0xee, 0x5c, 0x44, 0x2f, +0x15, 0x43, 0x4f, 0xb6, 0x9e, 0xfc, 0xc5, 0x32, 0xce, 0x06, 0x69, 0xeb, 0xca, 0xb4, 0xaf, 0xc8, 0xc0, 0x12, 0x6d, 0x62, 0x22, 0x05, 0x39, 0x1f, 0x5f, 0xac, 0xc7, 0x18, 0x6c, 0x55, 0x20, 0x81, 0x7b, 0x93, 0xdd, 0x09, 0x70, 0x61, 0xf6, 0x19, +0x29, 0x04, 0x2d, 0x24, 0x5b, 0x0b, 0xf4, 0x53, 0x7a, 0x31, 0x86, 0x37, 0xa5, 0x74, 0xdc, 0xcf, 0xa0, 0xf2, 0x3b, 0xe2, 0x54, 0x8c, 0x7c, 0xd5, 0x56, 0x0d, 0xa2, 0x87, 0x47, 0x00, 0xe6, 0xd7, 0xa7, 0x28, 0x71, 0x2e, 0xc4, 0x4a, 0xb1, 0xa8, +0xb0, 0x6a, 0x9d, 0x68, 0x0e, 0x46, 0x79, 0xc3, 0x5a, 0x96, 0x2b, 0xae, 0x21, 0x5d, 0xb8, 0xe4, 0x91, 0xe8, 0xbe, 0x48, 0x8b, 0x34, 0xb9, 0x25, 0xea, 0x6b, 0xda, 0xba, 0x63, 0xe9, 0xff, 0xf7, 0x2a, 0xb2, 0x51, 0x6f, 0xfe, 0xf0, 0x49, 0x66, +0x59, 0x30, 0xd0, 0x50, 0xfb, 0x17, 0x08, 0x35, 0x72, 0x1e, 0x8f, 0xb5, 0x4b, 0xd9, 0xa1, 0x64, ] +d0x6a0ca1a8=[ 0x00000000, 0x6dfd02e8, 0xbc3d81e3, 0xd1c0830b, 0x9bd0a7ab, 0xf62da543, 0x27ed2648, 0x4a1024a0, 0x9dd11781, 0xf02c1569, 0x21ec9662, 0x4c11948a, 0x0601b02a, 0x6bfcb2c2, 0xba3c31c9, 0xd7c13321, 0x957e9dbd, 0xf8839f55, 0x29431c5e, 0x44be1eb6, +0x0eae3a16, 0x635338fe, 0xb293bbf5, 0xdf6eb91d, 0x08af8a3c, 0x655288d4, 0xb4920bdf, 0xd96f0937, 0x937f2d97, 0xfe822f7f, 0x2f42ac74, 0x42bfae9c, 0xfc056486, 0x91f8666e, 0x4038e565, 0x2dc5e78d, 0x67d5c32d, 0x0a28c1c5, 0xdbe842ce, 0xb6154026, +0x61d47307, 0x0c2971ef, 0xdde9f2e4, 0xb014f00c, 0xfa04d4ac, 0x97f9d644, 0x4639554f, 0x2bc457a7, 0x697bf93b, 0x0486fbd3, 0xd54678d8, 0xb8bb7a30, 0xf2ab5e90, 0x9f565c78, 0x4e96df73, 0x236bdd9b, 0xf4aaeeba, 0x9957ec52, 0x48976f59, 0x256a6db1, +0x6f7a4911, 0x02874bf9, 0xd347c8f2, 0xbebaca1a, 0x1e706b4a, 0x738d69a2, 0xa24deaa9, 0xcfb0e841, 0x85a0cce1, 0xe85dce09, 0x399d4d02, 0x54604fea, 0x83a17ccb, 0xee5c7e23, 0x3f9cfd28, 0x5261ffc0, 0x1871db60, 0x758cd988, 0xa44c5a83, 0xc9b1586b, +0x8b0ef6f7, 0xe6f3f41f, 0x37337714, 0x5ace75fc, 0x10de515c, 0x7d2353b4, 0xace3d0bf, 0xc11ed257, 0x16dfe176, 0x7b22e39e, 0xaae26095, 0xc71f627d, 0x8d0f46dd, 0xe0f24435, 0x3132c73e, 0x5ccfc5d6, 0xe2750fcc, 0x8f880d24, 0x5e488e2f, 0x33b58cc7, +0x79a5a867, 0x1458aa8f, 0xc5982984, 0xa8652b6c, 0x7fa4184d, 0x12591aa5, 0xc39999ae, 0xae649b46, 0xe474bfe6, 0x8989bd0e, 0x58493e05, 0x35b43ced, 0x770b9271, 0x1af69099, 0xcb361392, 0xa6cb117a, 0xecdb35da, 0x81263732, 0x50e6b439, 0x3d1bb6d1, +0xeada85f0, 0x87278718, 0x56e70413, 0x3b1a06fb, 0x710a225b, 0x1cf720b3, 0xcd37a3b8, 0xa0caa150, 0xccc88681, 0xa1358469, 0x70f50762, 0x1d08058a, 0x5718212a, 0x3ae523c2, 0xeb25a0c9, 0x86d8a221, 0x51199100, 0x3ce493e8, 0xed2410e3, 0x80d9120b, +0xcac936ab, 0xa7343443, 0x76f4b748, 0x1b09b5a0, 0x59b61b3c, 0x344b19d4, 0xe58b9adf, 0x88769837, 0xc266bc97, 0xaf9bbe7f, 0x7e5b3d74, 0x13a63f9c, 0xc4670cbd, 0xa99a0e55, 0x785a8d5e, 0x15a78fb6, 0x5fb7ab16, 0x324aa9fe, 0xe38a2af5, 0x8e77281d, +0x30cde207, 0x5d30e0ef, 0x8cf063e4, 0xe10d610c, 0xab1d45ac, 0xc6e04744, 0x1720c44f, 0x7addc6a7, 0xad1cf586, 0xc0e1f76e, 0x11217465, 0x7cdc768d, 0x36cc522d, 0x5b3150c5, 0x8af1d3ce, 0xe70cd126, 0xa5b37fba, 0xc84e7d52, 0x198efe59, 0x7473fcb1, +0x3e63d811, 0x539edaf9, 0x825e59f2, 0xefa35b1a, 0x3862683b, 0x559f6ad3, 0x845fe9d8, 0xe9a2eb30, 0xa3b2cf90, 0xce4fcd78, 0x1f8f4e73, 0x72724c9b, 0xd2b8edcb, 0xbf45ef23, 0x6e856c28, 0x03786ec0, 0x49684a60, 0x24954888, 0xf555cb83, 0x98a8c96b, +0x4f69fa4a, 0x2294f8a2, 0xf3547ba9, 0x9ea97941, 0xd4b95de1, 0xb9445f09, 0x6884dc02, 0x0579deea, 0x47c67076, 0x2a3b729e, 0xfbfbf195, 0x9606f37d, 0xdc16d7dd, 0xb1ebd535, 0x602b563e, 0x0dd654d6, 0xda1767f7, 0xb7ea651f, 0x662ae614, 0x0bd7e4fc, +0x41c7c05c, 0x2c3ac2b4, 0xfdfa41bf, 0x90074357, 0x2ebd894d, 0x43408ba5, 0x928008ae, 0xff7d0a46, 0xb56d2ee6, 0xd8902c0e, 0x0950af05, 0x64adaded, 0xb36c9ecc, 0xde919c24, 0x0f511f2f, 0x62ac1dc7, 0x28bc3967, 0x45413b8f, 0x9481b884, 0xf97cba6c, +0xbbc314f0, 0xd63e1618, 0x07fe9513, 0x6a0397fb, 0x2013b35b, 0x4deeb1b3, 0x9c2e32b8, 0xf1d33050, 0x26120371, 0x4bef0199, 0x9a2f8292, 0xf7d2807a, 0xbdc2a4da, 0xd03fa632, 0x01ff2539, 0x6c0227d1, 0x00000000, 0x9fc3d513, 0xdfd971e4, 0x401aa4f7, +0x2bad98c0, 0xb46e4dd3, 0xf474e924, 0x6bb73c37, 0xebb181c6, 0x747254d5, 0x3468f022, 0xabab2531, 0xc01c1906, 0x5fdfcc15, 0x1fc568e2, 0x8006bdf1, 0x837ab5c3, 0x1cb960d0, 0x5ca3c427, 0xc3601134, 0xa8d72d03, 0x3714f810, 0x770e5ce7, 0xe8cd89f4, +0x68cb3405, 0xf708e116, 0xb71245e1, 0x28d190f2, 0x4366acc5, 0xdca579d6, 0x9cbfdd21, 0x037c0832, 0xa1192b5a, 0x3edafe49, 0x7ec05abe, 0xe1038fad, 0x8ab4b39a, 0x15776689, 0x556dc27e, 0xcaae176d, 0x4aa8aa9c, 0xd56b7f8f, 0x9571db78, 0x0ab20e6b, +0x6105325c, 0xfec6e74f, 0xbedc43b8, 0x211f96ab, 0x22639e99, 0xbda04b8a, 0xfdbaef7d, 0x62793a6e, 0x09ce0659, 0x960dd34a, 0xd61777bd, 0x49d4a2ae, 0xc9d21f5f, 0x5611ca4c, 0x160b6ebb, 0x89c8bba8, 0xe27f879f, 0x7dbc528c, 0x3da6f67b, 0xa2652368, +0xcf193f63, 0x50daea70, 0x10c04e87, 0x8f039b94, 0xe4b4a7a3, 0x7b7772b0, 0x3b6dd647, 0xa4ae0354, 0x24a8bea5, 0xbb6b6bb6, 0xfb71cf41, 0x64b21a52, 0x0f052665, 0x90c6f376, 0xd0dc5781, 0x4f1f8292, 0x4c638aa0, 0xd3a05fb3, 0x93bafb44, 0x0c792e57, +0x67ce1260, 0xf80dc773, 0xb8176384, 0x27d4b697, 0xa7d20b66, 0x3811de75, 0x780b7a82, 0xe7c8af91, 0x8c7f93a6, 0x13bc46b5, 0x53a6e242, 0xcc653751, 0x6e001439, 0xf1c3c12a, 0xb1d965dd, 0x2e1ab0ce, 0x45ad8cf9, 0xda6e59ea, 0x9a74fd1d, 0x05b7280e, +0x85b195ff, 0x1a7240ec, 0x5a68e41b, 0xc5ab3108, 0xae1c0d3f, 0x31dfd82c, 0x71c57cdb, 0xee06a9c8, 0xed7aa1fa, 0x72b974e9, 0x32a3d01e, 0xad60050d, 0xc6d7393a, 0x5914ec29, 0x190e48de, 0x86cd9dcd, 0x06cb203c, 0x9908f52f, 0xd91251d8, 0x46d184cb, +0x2d66b8fc, 0xb2a56def, 0xf2bfc918, 0x6d7c1c0b, 0xf774785b, 0x68b7ad48, 0x28ad09bf, 0xb76edcac, 0xdcd9e09b, 0x431a3588, 0x0300917f, 0x9cc3446c, 0x1cc5f99d, 0x83062c8e, 0xc31c8879, 0x5cdf5d6a, 0x3768615d, 0xa8abb44e, 0xe8b110b9, 0x7772c5aa, +0x740ecd98, 0xebcd188b, 0xabd7bc7c, 0x3414696f, 0x5fa35558, 0xc060804b, 0x807a24bc, 0x1fb9f1af, 0x9fbf4c5e, 0x007c994d, 0x40663dba, 0xdfa5e8a9, 0xb412d49e, 0x2bd1018d, 0x6bcba57a, 0xf4087069, 0x566d5301, 0xc9ae8612, 0x89b422e5, 0x1677f7f6, +0x7dc0cbc1, 0xe2031ed2, 0xa219ba25, 0x3dda6f36, 0xbddcd2c7, 0x221f07d4, 0x6205a323, 0xfdc67630, 0x96714a07, 0x09b29f14, 0x49a83be3, 0xd66beef0, 0xd517e6c2, 0x4ad433d1, 0x0ace9726, 0x950d4235, 0xfeba7e02, 0x6179ab11, 0x21630fe6, 0xbea0daf5, +0x3ea66704, 0xa165b217, 0xe17f16e0, 0x7ebcc3f3, 0x150bffc4, 0x8ac82ad7, 0xcad28e20, 0x55115b33, 0x386d4738, 0xa7ae922b, 0xe7b436dc, 0x7877e3cf, 0x13c0dff8, 0x8c030aeb, 0xcc19ae1c, 0x53da7b0f, 0xd3dcc6fe, 0x4c1f13ed, 0x0c05b71a, 0x93c66209, +0xf8715e3e, 0x67b28b2d, 0x27a82fda, 0xb86bfac9, 0xbb17f2fb, 0x24d427e8, 0x64ce831f, 0xfb0d560c, 0x90ba6a3b, 0x0f79bf28, 0x4f631bdf, 0xd0a0cecc, 0x50a6733d, 0xcf65a62e, 0x8f7f02d9, 0x10bcd7ca, 0x7b0bebfd, 0xe4c83eee, 0xa4d29a19, 0x3b114f0a, +0x99746c62, 0x06b7b971, 0x46ad1d86, 0xd96ec895, 0xb2d9f4a2, 0x2d1a21b1, 0x6d008546, 0xf2c35055, 0x72c5eda4, 0xed0638b7, 0xad1c9c40, 0x32df4953, 0x59687564, 0xc6aba077, 0x86b10480, 0x1972d193, 0x1a0ed9a1, 0x85cd0cb2, 0xc5d7a845, 0x5a147d56, +0x31a34161, 0xae609472, 0xee7a3085, 0x71b9e596, 0xf1bf5867, 0x6e7c8d74, 0x2e662983, 0xb1a5fc90, 0xda12c0a7, 0x45d115b4, 0x05cbb143, 0x9a086450, 0x00000000, 0x7a7fc14b, 0x892056e4, 0xf35f97af, 0x6b9cbc12, 0x11e37d59, 0xe2bceaf6, 0x98c32bbd, +0x3c9eadee, 0x46e16ca5, 0xb5befb0a, 0xcfc13a41, 0x570211fc, 0x2d7dd0b7, 0xde224718, 0xa45d8653, 0x52dd1e8a, 0x28a2dfc1, 0xdbfd486e, 0xa1828925, 0x3941a298, 0x433e63d3, 0xb061f47c, 0xca1e3537, 0x6e43b364, 0x143c722f, 0xe763e580, 0x9d1c24cb, +0x05df0f76, 0x7fa0ce3d, 0x8cff5992, 0xf68098d9, 0xa15d5ab4, 0xdb229bff, 0x287d0c50, 0x5202cd1b, 0xcac1e6a6, 0xb0be27ed, 0x43e1b042, 0x399e7109, 0x9dc3f75a, 0xe7bc3611, 0x14e3a1be, 0x6e9c60f5, 0xf65f4b48, 0x8c208a03, 0x7f7f1dac, 0x0500dce7, +0xf380443e, 0x89ff8575, 0x7aa012da, 0x00dfd391, 0x981cf82c, 0xe2633967, 0x113caec8, 0x6b436f83, 0xcf1ee9d0, 0xb561289b, 0x463ebf34, 0x3c417e7f, 0xa48255c2, 0xdefd9489, 0x2da20326, 0x57ddc26d, 0x4fb10b81, 0x35cecaca, 0xc6915d65, 0xbcee9c2e, +0x242db793, 0x5e5276d8, 0xad0de177, 0xd772203c, 0x732fa66f, 0x09506724, 0xfa0ff08b, 0x807031c0, 0x18b31a7d, 0x62ccdb36, 0x91934c99, 0xebec8dd2, 0x1d6c150b, 0x6713d440, 0x944c43ef, 0xee3382a4, 0x76f0a919, 0x0c8f6852, 0xffd0fffd, 0x85af3eb6, +0x21f2b8e5, 0x5b8d79ae, 0xa8d2ee01, 0xd2ad2f4a, 0x4a6e04f7, 0x3011c5bc, 0xc34e5213, 0xb9319358, 0xeeec5135, 0x9493907e, 0x67cc07d1, 0x1db3c69a, 0x8570ed27, 0xff0f2c6c, 0x0c50bbc3, 0x762f7a88, 0xd272fcdb, 0xa80d3d90, 0x5b52aa3f, 0x212d6b74, +0xb9ee40c9, 0xc3918182, 0x30ce162d, 0x4ab1d766, 0xbc314fbf, 0xc64e8ef4, 0x3511195b, 0x4f6ed810, 0xd7adf3ad, 0xadd232e6, 0x5e8da549, 0x24f26402, 0x80afe251, 0xfad0231a, 0x098fb4b5, 0x73f075fe, 0xeb335e43, 0x914c9f08, 0x621308a7, 0x186cc9ec, +0xc57904c2, 0xbf06c589, 0x4c595226, 0x3626936d, 0xaee5b8d0, 0xd49a799b, 0x27c5ee34, 0x5dba2f7f, 0xf9e7a92c, 0x83986867, 0x70c7ffc8, 0x0ab83e83, 0x927b153e, 0xe804d475, 0x1b5b43da, 0x61248291, 0x97a41a48, 0xeddbdb03, 0x1e844cac, 0x64fb8de7, +0xfc38a65a, 0x86476711, 0x7518f0be, 0x0f6731f5, 0xab3ab7a6, 0xd14576ed, 0x221ae142, 0x58652009, 0xc0a60bb4, 0xbad9caff, 0x49865d50, 0x33f99c1b, 0x64245e76, 0x1e5b9f3d, 0xed040892, 0x977bc9d9, 0x0fb8e264, 0x75c7232f, 0x8698b480, 0xfce775cb, +0x58baf398, 0x22c532d3, 0xd19aa57c, 0xabe56437, 0x33264f8a, 0x49598ec1, 0xba06196e, 0xc079d825, 0x36f940fc, 0x4c8681b7, 0xbfd91618, 0xc5a6d753, 0x5d65fcee, 0x271a3da5, 0xd445aa0a, 0xae3a6b41, 0x0a67ed12, 0x70182c59, 0x8347bbf6, 0xf9387abd, +0x61fb5100, 0x1b84904b, 0xe8db07e4, 0x92a4c6af, 0x8ac80f43, 0xf0b7ce08, 0x03e859a7, 0x799798ec, 0xe154b351, 0x9b2b721a, 0x6874e5b5, 0x120b24fe, 0xb656a2ad, 0xcc2963e6, 0x3f76f449, 0x45093502, 0xddca1ebf, 0xa7b5dff4, 0x54ea485b, 0x2e958910, +0xd81511c9, 0xa26ad082, 0x5135472d, 0x2b4a8666, 0xb389addb, 0xc9f66c90, 0x3aa9fb3f, 0x40d63a74, 0xe48bbc27, 0x9ef47d6c, 0x6dabeac3, 0x17d42b88, 0x8f170035, 0xf568c17e, 0x063756d1, 0x7c48979a, 0x2b9555f7, 0x51ea94bc, 0xa2b50313, 0xd8cac258, +0x4009e9e5, 0x3a7628ae, 0xc929bf01, 0xb3567e4a, 0x170bf819, 0x6d743952, 0x9e2baefd, 0xe4546fb6, 0x7c97440b, 0x06e88540, 0xf5b712ef, 0x8fc8d3a4, 0x79484b7d, 0x03378a36, 0xf0681d99, 0x8a17dcd2, 0x12d4f76f, 0x68ab3624, 0x9bf4a18b, 0xe18b60c0, +0x45d6e693, 0x3fa927d8, 0xccf6b077, 0xb689713c, 0x2e4a5a81, 0x54359bca, 0xa76a0c65, 0xdd15cd2e, 0x00000000, 0xc8a865e0, 0xaa263aa4, 0x628e5f44, 0x0e37e8cb, 0xc69f8d2b, 0xa411d26f, 0x6cb9b78f, 0xc52a2237, 0x0d8247d7, 0x6f0c1893, 0xa7a47d73, +0xcb1dcafc, 0x03b5af1c, 0x613bf058, 0xa99395b8, 0xe73c3448, 0x2f9451a8, 0x4d1a0eec, 0x85b26b0c, 0xe90bdc83, 0x21a3b963, 0x432de627, 0x8b8583c7, 0x2216167f, 0xeabe739f, 0x88302cdb, 0x4098493b, 0x2c21feb4, 0xe4899b54, 0x8607c410, 0x4eafa1f0, +0x1378a56f, 0xdbd0c08f, 0xb95e9fcb, 0x71f6fa2b, 0x1d4f4da4, 0xd5e72844, 0xb7697700, 0x7fc112e0, 0xd6528758, 0x1efae2b8, 0x7c74bdfc, 0xb4dcd81c, 0xd8656f93, 0x10cd0a73, 0x72435537, 0xbaeb30d7, 0xf4449127, 0x3cecf4c7, 0x5e62ab83, 0x96cace63, +0xfa7379ec, 0x32db1c0c, 0x50554348, 0x98fd26a8, 0x316eb310, 0xf9c6d6f0, 0x9b4889b4, 0x53e0ec54, 0x3f595bdb, 0xf7f13e3b, 0x957f617f, 0x5dd7049f, 0x95d8e526, 0x5d7080c6, 0x3ffedf82, 0xf756ba62, 0x9bef0ded, 0x5347680d, 0x31c93749, 0xf96152a9, +0x50f2c711, 0x985aa2f1, 0xfad4fdb5, 0x327c9855, 0x5ec52fda, 0x966d4a3a, 0xf4e3157e, 0x3c4b709e, 0x72e4d16e, 0xba4cb48e, 0xd8c2ebca, 0x106a8e2a, 0x7cd339a5, 0xb47b5c45, 0xd6f50301, 0x1e5d66e1, 0xb7cef359, 0x7f6696b9, 0x1de8c9fd, 0xd540ac1d, +0xb9f91b92, 0x71517e72, 0x13df2136, 0xdb7744d6, 0x86a04049, 0x4e0825a9, 0x2c867aed, 0xe42e1f0d, 0x8897a882, 0x403fcd62, 0x22b19226, 0xea19f7c6, 0x438a627e, 0x8b22079e, 0xe9ac58da, 0x21043d3a, 0x4dbd8ab5, 0x8515ef55, 0xe79bb011, 0x2f33d5f1, +0x619c7401, 0xa93411e1, 0xcbba4ea5, 0x03122b45, 0x6fab9cca, 0xa703f92a, 0xc58da66e, 0x0d25c38e, 0xa4b65636, 0x6c1e33d6, 0x0e906c92, 0xc6380972, 0xaa81befd, 0x6229db1d, 0x00a78459, 0xc80fe1b9, 0x2a494798, 0xe2e12278, 0x806f7d3c, 0x48c718dc, +0x247eaf53, 0xecd6cab3, 0x8e5895f7, 0x46f0f017, 0xef6365af, 0x27cb004f, 0x45455f0b, 0x8ded3aeb, 0xe1548d64, 0x29fce884, 0x4b72b7c0, 0x83dad220, 0xcd7573d0, 0x05dd1630, 0x67534974, 0xaffb2c94, 0xc3429b1b, 0x0beafefb, 0x6964a1bf, 0xa1ccc45f, +0x085f51e7, 0xc0f73407, 0xa2796b43, 0x6ad10ea3, 0x0668b92c, 0xcec0dccc, 0xac4e8388, 0x64e6e668, 0x3931e2f7, 0xf1998717, 0x9317d853, 0x5bbfbdb3, 0x37060a3c, 0xffae6fdc, 0x9d203098, 0x55885578, 0xfc1bc0c0, 0x34b3a520, 0x563dfa64, 0x9e959f84, +0xf22c280b, 0x3a844deb, 0x580a12af, 0x90a2774f, 0xde0dd6bf, 0x16a5b35f, 0x742bec1b, 0xbc8389fb, 0xd03a3e74, 0x18925b94, 0x7a1c04d0, 0xb2b46130, 0x1b27f488, 0xd38f9168, 0xb101ce2c, 0x79a9abcc, 0x15101c43, 0xddb879a3, 0xbf3626e7, 0x779e4307, +0xbf91a2be, 0x7739c75e, 0x15b7981a, 0xdd1ffdfa, 0xb1a64a75, 0x790e2f95, 0x1b8070d1, 0xd3281531, 0x7abb8089, 0xb213e569, 0xd09dba2d, 0x1835dfcd, 0x748c6842, 0xbc240da2, 0xdeaa52e6, 0x16023706, 0x58ad96f6, 0x9005f316, 0xf28bac52, 0x3a23c9b2, +0x569a7e3d, 0x9e321bdd, 0xfcbc4499, 0x34142179, 0x9d87b4c1, 0x552fd121, 0x37a18e65, 0xff09eb85, 0x93b05c0a, 0x5b1839ea, 0x399666ae, 0xf13e034e, 0xace907d1, 0x64416231, 0x06cf3d75, 0xce675895, 0xa2deef1a, 0x6a768afa, 0x08f8d5be, 0xc050b05e, +0x69c325e6, 0xa16b4006, 0xc3e51f42, 0x0b4d7aa2, 0x67f4cd2d, 0xaf5ca8cd, 0xcdd2f789, 0x057a9269, 0x4bd53399, 0x837d5679, 0xe1f3093d, 0x295b6cdd, 0x45e2db52, 0x8d4abeb2, 0xefc4e1f6, 0x276c8416, 0x8eff11ae, 0x4657744e, 0x24d92b0a, 0xec714eea, +0x80c8f965, 0x48609c85, 0x2aeec3c1, 0xe246a621, 0x00000000, 0xe6ae3d40, 0x2ba98696, 0xcd07bbd6, 0xc8571d42, 0x2ef92002, 0xe3fe9bd4, 0x0550a694, 0xc42acfeb, 0x2284f2ab, 0xef83497d, 0x092d743d, 0x0c7dd2a9, 0xead3efe9, 0x27d4543f, 0xc17a697f, +0x9c10fc86, 0x7abec1c6, 0xb7b97a10, 0x51174750, 0x5447e1c4, 0xb2e9dc84, 0x7fee6752, 0x99405a12, 0x583a336d, 0xbe940e2d, 0x7393b5fb, 0x953d88bb, 0x906d2e2f, 0x76c3136f, 0xbbc4a8b9, 0x5d6a95f9, 0x2edaf230, 0xc874cf70, 0x057374a6, 0xe3dd49e6, +0xe68def72, 0x0023d232, 0xcd2469e4, 0x2b8a54a4, 0xeaf03ddb, 0x0c5e009b, 0xc159bb4d, 0x27f7860d, 0x22a72099, 0xc4091dd9, 0x090ea60f, 0xefa09b4f, 0xb2ca0eb6, 0x546433f6, 0x99638820, 0x7fcdb560, 0x7a9d13f4, 0x9c332eb4, 0x51349562, 0xb79aa822, +0x76e0c15d, 0x904efc1d, 0x5d4947cb, 0xbbe77a8b, 0xbeb7dc1f, 0x5819e15f, 0x951e5a89, 0x73b067c9, 0x05482262, 0xe3e61f22, 0x2ee1a4f4, 0xc84f99b4, 0xcd1f3f20, 0x2bb10260, 0xe6b6b9b6, 0x001884f6, 0xc162ed89, 0x27ccd0c9, 0xeacb6b1f, 0x0c65565f, +0x0935f0cb, 0xef9bcd8b, 0x229c765d, 0xc4324b1d, 0x9958dee4, 0x7ff6e3a4, 0xb2f15872, 0x545f6532, 0x510fc3a6, 0xb7a1fee6, 0x7aa64530, 0x9c087870, 0x5d72110f, 0xbbdc2c4f, 0x76db9799, 0x9075aad9, 0x95250c4d, 0x738b310d, 0xbe8c8adb, 0x5822b79b, +0x2b92d052, 0xcd3ced12, 0x003b56c4, 0xe6956b84, 0xe3c5cd10, 0x056bf050, 0xc86c4b86, 0x2ec276c6, 0xefb81fb9, 0x091622f9, 0xc411992f, 0x22bfa46f, 0x27ef02fb, 0xc1413fbb, 0x0c46846d, 0xeae8b92d, 0xb7822cd4, 0x512c1194, 0x9c2baa42, 0x7a859702, +0x7fd53196, 0x997b0cd6, 0x547cb700, 0xb2d28a40, 0x73a8e33f, 0x9506de7f, 0x580165a9, 0xbeaf58e9, 0xbbfffe7d, 0x5d51c33d, 0x905678eb, 0x76f845ab, 0xa7f9e125, 0x4157dc65, 0x8c5067b3, 0x6afe5af3, 0x6faefc67, 0x8900c127, 0x44077af1, 0xa2a947b1, +0x63d32ece, 0x857d138e, 0x487aa858, 0xaed49518, 0xab84338c, 0x4d2a0ecc, 0x802db51a, 0x6683885a, 0x3be91da3, 0xdd4720e3, 0x10409b35, 0xf6eea675, 0xf3be00e1, 0x15103da1, 0xd8178677, 0x3eb9bb37, 0xffc3d248, 0x196def08, 0xd46a54de, 0x32c4699e, +0x3794cf0a, 0xd13af24a, 0x1c3d499c, 0xfa9374dc, 0x89231315, 0x6f8d2e55, 0xa28a9583, 0x4424a8c3, 0x41740e57, 0xa7da3317, 0x6add88c1, 0x8c73b581, 0x4d09dcfe, 0xaba7e1be, 0x66a05a68, 0x800e6728, 0x855ec1bc, 0x63f0fcfc, 0xaef7472a, 0x48597a6a, +0x1533ef93, 0xf39dd2d3, 0x3e9a6905, 0xd8345445, 0xdd64f2d1, 0x3bcacf91, 0xf6cd7447, 0x10634907, 0xd1192078, 0x37b71d38, 0xfab0a6ee, 0x1c1e9bae, 0x194e3d3a, 0xffe0007a, 0x32e7bbac, 0xd44986ec, 0xa2b1c347, 0x441ffe07, 0x891845d1, 0x6fb67891, +0x6ae6de05, 0x8c48e345, 0x414f5893, 0xa7e165d3, 0x669b0cac, 0x803531ec, 0x4d328a3a, 0xab9cb77a, 0xaecc11ee, 0x48622cae, 0x85659778, 0x63cbaa38, 0x3ea13fc1, 0xd80f0281, 0x1508b957, 0xf3a68417, 0xf6f62283, 0x10581fc3, 0xdd5fa415, 0x3bf19955, +0xfa8bf02a, 0x1c25cd6a, 0xd12276bc, 0x378c4bfc, 0x32dced68, 0xd472d028, 0x19756bfe, 0xffdb56be, 0x8c6b3177, 0x6ac50c37, 0xa7c2b7e1, 0x416c8aa1, 0x443c2c35, 0xa2921175, 0x6f95aaa3, 0x893b97e3, 0x4841fe9c, 0xaeefc3dc, 0x63e8780a, 0x8546454a, +0x8016e3de, 0x66b8de9e, 0xabbf6548, 0x4d115808, 0x107bcdf1, 0xf6d5f0b1, 0x3bd24b67, 0xdd7c7627, 0xd82cd0b3, 0x3e82edf3, 0xf3855625, 0x152b6b65, 0xd451021a, 0x32ff3f5a, 0xfff8848c, 0x1956b9cc, 0x1c061f58, 0xfaa82218, 0x37af99ce, 0xd101a48e, +0x00000000, 0x110d82c8, 0xdc189383, 0xcd15114b, 0xe8499559, 0xf9441791, 0x345106da, 0x255c8412, 0x22bf2510, 0x33b2a7d8, 0xfea7b693, 0xefaa345b, 0xcaf6b049, 0xdbfb3281, 0x16ee23ca, 0x07e3a102, 0x5f3f4455, 0x4e32c69d, 0x8327d7d6, 0x922a551e, +0xb776d10c, 0xa67b53c4, 0x6b6e428f, 0x7a63c047, 0x7d806145, 0x6c8de38d, 0xa198f2c6, 0xb095700e, 0x95c9f41c, 0x84c476d4, 0x49d1679f, 0x58dce557, 0x7626ea4d, 0x672b6885, 0xaa3e79ce, 0xbb33fb06, 0x9e6f7f14, 0x8f62fddc, 0x4277ec97, 0x537a6e5f, +0x5499cf5d, 0x45944d95, 0x88815cde, 0x998cde16, 0xbcd05a04, 0xadddd8cc, 0x60c8c987, 0x71c54b4f, 0x2919ae18, 0x38142cd0, 0xf5013d9b, 0xe40cbf53, 0xc1503b41, 0xd05db989, 0x1d48a8c2, 0x0c452a0a, 0x0ba68b08, 0x1aab09c0, 0xd7be188b, 0xc6b39a43, +0xe3ef1e51, 0xf2e29c99, 0x3ff78dd2, 0x2efa0f1a, 0x85c9fe74, 0x94c47cbc, 0x59d16df7, 0x48dcef3f, 0x6d806b2d, 0x7c8de9e5, 0xb198f8ae, 0xa0957a66, 0xa776db64, 0xb67b59ac, 0x7b6e48e7, 0x6a63ca2f, 0x4f3f4e3d, 0x5e32ccf5, 0x9327ddbe, 0x822a5f76, +0xdaf6ba21, 0xcbfb38e9, 0x06ee29a2, 0x17e3ab6a, 0x32bf2f78, 0x23b2adb0, 0xeea7bcfb, 0xffaa3e33, 0xf8499f31, 0xe9441df9, 0x24510cb2, 0x355c8e7a, 0x10000a68, 0x010d88a0, 0xcc1899eb, 0xdd151b23, 0xf3ef1439, 0xe2e296f1, 0x2ff787ba, 0x3efa0572, +0x1ba68160, 0x0aab03a8, 0xc7be12e3, 0xd6b3902b, 0xd1503129, 0xc05db3e1, 0x0d48a2aa, 0x1c452062, 0x3919a470, 0x281426b8, 0xe50137f3, 0xf40cb53b, 0xacd0506c, 0xbdddd2a4, 0x70c8c3ef, 0x61c54127, 0x4499c535, 0x559447fd, 0x988156b6, 0x898cd47e, +0x8e6f757c, 0x9f62f7b4, 0x5277e6ff, 0x437a6437, 0x6626e025, 0x772b62ed, 0xba3e73a6, 0xab33f16e, 0x4b3c8ca1, 0x5a310e69, 0x97241f22, 0x86299dea, 0xa37519f8, 0xb2789b30, 0x7f6d8a7b, 0x6e6008b3, 0x6983a9b1, 0x788e2b79, 0xb59b3a32, 0xa496b8fa, +0x81ca3ce8, 0x90c7be20, 0x5dd2af6b, 0x4cdf2da3, 0x1403c8f4, 0x050e4a3c, 0xc81b5b77, 0xd916d9bf, 0xfc4a5dad, 0xed47df65, 0x2052ce2e, 0x315f4ce6, 0x36bcede4, 0x27b16f2c, 0xeaa47e67, 0xfba9fcaf, 0xdef578bd, 0xcff8fa75, 0x02edeb3e, 0x13e069f6, +0x3d1a66ec, 0x2c17e424, 0xe102f56f, 0xf00f77a7, 0xd553f3b5, 0xc45e717d, 0x094b6036, 0x1846e2fe, 0x1fa543fc, 0x0ea8c134, 0xc3bdd07f, 0xd2b052b7, 0xf7ecd6a5, 0xe6e1546d, 0x2bf44526, 0x3af9c7ee, 0x622522b9, 0x7328a071, 0xbe3db13a, 0xaf3033f2, +0x8a6cb7e0, 0x9b613528, 0x56742463, 0x4779a6ab, 0x409a07a9, 0x51978561, 0x9c82942a, 0x8d8f16e2, 0xa8d392f0, 0xb9de1038, 0x74cb0173, 0x65c683bb, 0xcef572d5, 0xdff8f01d, 0x12ede156, 0x03e0639e, 0x26bce78c, 0x37b16544, 0xfaa4740f, 0xeba9f6c7, +0xec4a57c5, 0xfd47d50d, 0x3052c446, 0x215f468e, 0x0403c29c, 0x150e4054, 0xd81b511f, 0xc916d3d7, 0x91ca3680, 0x80c7b448, 0x4dd2a503, 0x5cdf27cb, 0x7983a3d9, 0x688e2111, 0xa59b305a, 0xb496b292, 0xb3751390, 0xa2789158, 0x6f6d8013, 0x7e6002db, +0x5b3c86c9, 0x4a310401, 0x8724154a, 0x96299782, 0xb8d39898, 0xa9de1a50, 0x64cb0b1b, 0x75c689d3, 0x509a0dc1, 0x41978f09, 0x8c829e42, 0x9d8f1c8a, 0x9a6cbd88, 0x8b613f40, 0x46742e0b, 0x5779acc3, 0x722528d1, 0x6328aa19, 0xae3dbb52, 0xbf30399a, +0xe7ecdccd, 0xf6e15e05, 0x3bf44f4e, 0x2af9cd86, 0x0fa54994, 0x1ea8cb5c, 0xd3bdda17, 0xc2b058df, 0xc553f9dd, 0xd45e7b15, 0x194b6a5e, 0x0846e896, 0x2d1a6c84, 0x3c17ee4c, 0xf102ff07, 0xe00f7dcf, 0x00000000, 0xa223dfa3, 0x4f4e5e8c, 0xed6d812f, +0x54f4dbfd, 0xf6d7045e, 0x1bba8571, 0xb9995ad2, 0x0fd3a1f7, 0xadf07e54, 0x409dff7b, 0xe2be20d8, 0x5b277a0a, 0xf904a5a9, 0x14692486, 0xb64afb25, 0x31f113eb, 0x93d2cc48, 0x7ebf4d67, 0xdc9c92c4, 0x6505c816, 0xc72617b5, 0x2a4b969a, 0x88684939, +0x3e22b21c, 0x9c016dbf, 0x716cec90, 0xd34f3333, 0x6ad669e1, 0xc8f5b642, 0x2598376d, 0x87bbe8ce, 0x806af28e, 0x22492d2d, 0xcf24ac02, 0x6d0773a1, 0xd49e2973, 0x76bdf6d0, 0x9bd077ff, 0x39f3a85c, 0x8fb95379, 0x2d9a8cda, 0xc0f70df5, 0x62d4d256, +0xdb4d8884, 0x796e5727, 0x9403d608, 0x362009ab, 0xb19be165, 0x13b83ec6, 0xfed5bfe9, 0x5cf6604a, 0xe56f3a98, 0x474ce53b, 0xaa216414, 0x0802bbb7, 0xbe484092, 0x1c6b9f31, 0xf1061e1e, 0x5325c1bd, 0xeabc9b6f, 0x489f44cc, 0xa5f2c5e3, 0x07d11a40, +0xd27e9db4, 0x705d4217, 0x9d30c338, 0x3f131c9b, 0x868a4649, 0x24a999ea, 0xc9c418c5, 0x6be7c766, 0xddad3c43, 0x7f8ee3e0, 0x92e362cf, 0x30c0bd6c, 0x8959e7be, 0x2b7a381d, 0xc617b932, 0x64346691, 0xe38f8e5f, 0x41ac51fc, 0xacc1d0d3, 0x0ee20f70, +0xb77b55a2, 0x15588a01, 0xf8350b2e, 0x5a16d48d, 0xec5c2fa8, 0x4e7ff00b, 0xa3127124, 0x0131ae87, 0xb8a8f455, 0x1a8b2bf6, 0xf7e6aad9, 0x55c5757a, 0x52146f3a, 0xf037b099, 0x1d5a31b6, 0xbf79ee15, 0x06e0b4c7, 0xa4c36b64, 0x49aeea4b, 0xeb8d35e8, +0x5dc7cecd, 0xffe4116e, 0x12899041, 0xb0aa4fe2, 0x09331530, 0xab10ca93, 0x467d4bbc, 0xe45e941f, 0x63e57cd1, 0xc1c6a372, 0x2cab225d, 0x8e88fdfe, 0x3711a72c, 0x9532788f, 0x785ff9a0, 0xda7c2603, 0x6c36dd26, 0xce150285, 0x237883aa, 0x815b5c09, +0x38c206db, 0x9ae1d978, 0x778c5857, 0xd5af87f4, 0xed628504, 0x4f415aa7, 0xa22cdb88, 0x000f042b, 0xb9965ef9, 0x1bb5815a, 0xf6d80075, 0x54fbdfd6, 0xe2b124f3, 0x4092fb50, 0xadff7a7f, 0x0fdca5dc, 0xb645ff0e, 0x146620ad, 0xf90ba182, 0x5b287e21, +0xdc9396ef, 0x7eb0494c, 0x93ddc863, 0x31fe17c0, 0x88674d12, 0x2a4492b1, 0xc729139e, 0x650acc3d, 0xd3403718, 0x7163e8bb, 0x9c0e6994, 0x3e2db637, 0x87b4ece5, 0x25973346, 0xc8fab269, 0x6ad96dca, 0x6d08778a, 0xcf2ba829, 0x22462906, 0x8065f6a5, +0x39fcac77, 0x9bdf73d4, 0x76b2f2fb, 0xd4912d58, 0x62dbd67d, 0xc0f809de, 0x2d9588f1, 0x8fb65752, 0x362f0d80, 0x940cd223, 0x7961530c, 0xdb428caf, 0x5cf96461, 0xfedabbc2, 0x13b73aed, 0xb194e54e, 0x080dbf9c, 0xaa2e603f, 0x4743e110, 0xe5603eb3, +0x532ac596, 0xf1091a35, 0x1c649b1a, 0xbe4744b9, 0x07de1e6b, 0xa5fdc1c8, 0x489040e7, 0xeab39f44, 0x3f1c18b0, 0x9d3fc713, 0x7052463c, 0xd271999f, 0x6be8c34d, 0xc9cb1cee, 0x24a69dc1, 0x86854262, 0x30cfb947, 0x92ec66e4, 0x7f81e7cb, 0xdda23868, +0x643b62ba, 0xc618bd19, 0x2b753c36, 0x8956e395, 0x0eed0b5b, 0xacced4f8, 0x41a355d7, 0xe3808a74, 0x5a19d0a6, 0xf83a0f05, 0x15578e2a, 0xb7745189, 0x013eaaac, 0xa31d750f, 0x4e70f420, 0xec532b83, 0x55ca7151, 0xf7e9aef2, 0x1a842fdd, 0xb8a7f07e, +0xbf76ea3e, 0x1d55359d, 0xf038b4b2, 0x521b6b11, 0xeb8231c3, 0x49a1ee60, 0xa4cc6f4f, 0x06efb0ec, 0xb0a54bc9, 0x1286946a, 0xffeb1545, 0x5dc8cae6, 0xe4519034, 0x46724f97, 0xab1fceb8, 0x093c111b, 0x8e87f9d5, 0x2ca42676, 0xc1c9a759, 0x63ea78fa, +0xda732228, 0x7850fd8b, 0x953d7ca4, 0x371ea307, 0x81545822, 0x23778781, 0xce1a06ae, 0x6c39d90d, 0xd5a083df, 0x77835c7c, 0x9aeedd53, 0x38cd02f0, 0x00000000, 0xe94aa9c7, 0xf336d0ca, 0x1a7c790d, 0x2555db1b, 0xcc1f72dc, 0xd6630bd1, 0x3f29a216, +0x7121b2fb, 0x986b1b3c, 0x82176231, 0x6b5dcbf6, 0x547469e0, 0xbd3ec027, 0xa742b92a, 0x4e0810ed, 0xb1f28757, 0x58b82e90, 0x42c4579d, 0xab8efe5a, 0x94a75c4c, 0x7dedf58b, 0x67918c86, 0x8edb2541, 0xc0d335ac, 0x29999c6b, 0x33e5e566, 0xdaaf4ca1, +0xe586eeb7, 0x0ccc4770, 0x16b03e7d, 0xfffa97ba, 0x4650ac61, 0xaf1a05a6, 0xb5667cab, 0x5c2cd56c, 0x6305777a, 0x8a4fdebd, 0x9033a7b0, 0x79790e77, 0x37711e9a, 0xde3bb75d, 0xc447ce50, 0x2d0d6797, 0x1224c581, 0xfb6e6c46, 0xe112154b, 0x0858bc8c, +0xf7a22b36, 0x1ee882f1, 0x0494fbfc, 0xedde523b, 0xd2f7f02d, 0x3bbd59ea, 0x21c120e7, 0xc88b8920, 0x868399cd, 0x6fc9300a, 0x75b54907, 0x9cffe0c0, 0xa3d642d6, 0x4a9ceb11, 0x50e0921c, 0xb9aa3bdb, 0xafd125eb, 0x469b8c2c, 0x5ce7f521, 0xb5ad5ce6, +0x8a84fef0, 0x63ce5737, 0x79b22e3a, 0x90f887fd, 0xdef09710, 0x37ba3ed7, 0x2dc647da, 0xc48cee1d, 0xfba54c0b, 0x12efe5cc, 0x08939cc1, 0xe1d93506, 0x1e23a2bc, 0xf7690b7b, 0xed157276, 0x045fdbb1, 0x3b7679a7, 0xd23cd060, 0xc840a96d, 0x210a00aa, +0x6f021047, 0x8648b980, 0x9c34c08d, 0x757e694a, 0x4a57cb5c, 0xa31d629b, 0xb9611b96, 0x502bb251, 0xe981898a, 0x00cb204d, 0x1ab75940, 0xf3fdf087, 0xccd45291, 0x259efb56, 0x3fe2825b, 0xd6a82b9c, 0x98a03b71, 0x71ea92b6, 0x6b96ebbb, 0x82dc427c, +0xbdf5e06a, 0x54bf49ad, 0x4ec330a0, 0xa7899967, 0x58730edd, 0xb139a71a, 0xab45de17, 0x420f77d0, 0x7d26d5c6, 0x946c7c01, 0x8e10050c, 0x675aaccb, 0x2952bc26, 0xc01815e1, 0xda646cec, 0x332ec52b, 0x0c07673d, 0xe54dcefa, 0xff31b7f7, 0x167b1e30, +0x8db8bcbd, 0x64f2157a, 0x7e8e6c77, 0x97c4c5b0, 0xa8ed67a6, 0x41a7ce61, 0x5bdbb76c, 0xb2911eab, 0xfc990e46, 0x15d3a781, 0x0fafde8c, 0xe6e5774b, 0xd9ccd55d, 0x30867c9a, 0x2afa0597, 0xc3b0ac50, 0x3c4a3bea, 0xd500922d, 0xcf7ceb20, 0x263642e7, +0x191fe0f1, 0xf0554936, 0xea29303b, 0x036399fc, 0x4d6b8911, 0xa42120d6, 0xbe5d59db, 0x5717f01c, 0x683e520a, 0x8174fbcd, 0x9b0882c0, 0x72422b07, 0xcbe810dc, 0x22a2b91b, 0x38dec016, 0xd19469d1, 0xeebdcbc7, 0x07f76200, 0x1d8b1b0d, 0xf4c1b2ca, +0xbac9a227, 0x53830be0, 0x49ff72ed, 0xa0b5db2a, 0x9f9c793c, 0x76d6d0fb, 0x6caaa9f6, 0x85e00031, 0x7a1a978b, 0x93503e4c, 0x892c4741, 0x6066ee86, 0x5f4f4c90, 0xb605e557, 0xac799c5a, 0x4533359d, 0x0b3b2570, 0xe2718cb7, 0xf80df5ba, 0x11475c7d, +0x2e6efe6b, 0xc72457ac, 0xdd582ea1, 0x34128766, 0x22699956, 0xcb233091, 0xd15f499c, 0x3815e05b, 0x073c424d, 0xee76eb8a, 0xf40a9287, 0x1d403b40, 0x53482bad, 0xba02826a, 0xa07efb67, 0x493452a0, 0x761df0b6, 0x9f575971, 0x852b207c, 0x6c6189bb, +0x939b1e01, 0x7ad1b7c6, 0x60adcecb, 0x89e7670c, 0xb6cec51a, 0x5f846cdd, 0x45f815d0, 0xacb2bc17, 0xe2baacfa, 0x0bf0053d, 0x118c7c30, 0xf8c6d5f7, 0xc7ef77e1, 0x2ea5de26, 0x34d9a72b, 0xdd930eec, 0x64393537, 0x8d739cf0, 0x970fe5fd, 0x7e454c3a, +0x416cee2c, 0xa82647eb, 0xb25a3ee6, 0x5b109721, 0x151887cc, 0xfc522e0b, 0xe62e5706, 0x0f64fec1, 0x304d5cd7, 0xd907f510, 0xc37b8c1d, 0x2a3125da, 0xd5cbb260, 0x3c811ba7, 0x26fd62aa, 0xcfb7cb6d, 0xf09e697b, 0x19d4c0bc, 0x03a8b9b1, 0xeae21076, +0xa4ea009b, 0x4da0a95c, 0x57dcd051, 0xbe967996, 0x81bfdb80, 0x68f57247, 0x72890b4a, 0x9bc3a28d, 0x00000000, 0xa8acc2af, 0x2dcdb7d6, 0x85617579, 0x0470395b, 0xacdcfbf4, 0x29bd8e8d, 0x81114c22, 0x92d5a3d1, 0x3a79617e, 0xbf181407, 0x17b4d6a8, +0x96a59a8a, 0x3e095825, 0xbb682d5c, 0x13c4eff3, 0x3a272437, 0x928be698, 0x17ea93e1, 0xbf46514e, 0x3e571d6c, 0x96fbdfc3, 0x139aaaba, 0xbb366815, 0xa8f287e6, 0x005e4549, 0x853f3030, 0x2d93f29f, 0xac82bebd, 0x042e7c12, 0x814f096b, 0x29e3cbc4, +0xecba4898, 0x44168a37, 0xc177ff4e, 0x69db3de1, 0xe8ca71c3, 0x4066b36c, 0xc507c615, 0x6dab04ba, 0x7e6feb49, 0xd6c329e6, 0x53a25c9f, 0xfb0e9e30, 0x7a1fd212, 0xd2b310bd, 0x57d265c4, 0xff7ea76b, 0xd69d6caf, 0x7e31ae00, 0xfb50db79, 0x53fc19d6, +0xd2ed55f4, 0x7a41975b, 0xff20e222, 0x578c208d, 0x4448cf7e, 0xece40dd1, 0x698578a8, 0xc129ba07, 0x4038f625, 0xe894348a, 0x6df541f3, 0xc559835c, 0xfa437e14, 0x52efbcbb, 0xd78ec9c2, 0x7f220b6d, 0xfe33474f, 0x569f85e0, 0xd3fef099, 0x7b523236, +0x6896ddc5, 0xc03a1f6a, 0x455b6a13, 0xedf7a8bc, 0x6ce6e49e, 0xc44a2631, 0x412b5348, 0xe98791e7, 0xc0645a23, 0x68c8988c, 0xeda9edf5, 0x45052f5a, 0xc4146378, 0x6cb8a1d7, 0xe9d9d4ae, 0x41751601, 0x52b1f9f2, 0xfa1d3b5d, 0x7f7c4e24, 0xd7d08c8b, +0x56c1c0a9, 0xfe6d0206, 0x7b0c777f, 0xd3a0b5d0, 0x16f9368c, 0xbe55f423, 0x3b34815a, 0x939843f5, 0x12890fd7, 0xba25cd78, 0x3f44b801, 0x97e87aae, 0x842c955d, 0x2c8057f2, 0xa9e1228b, 0x014de024, 0x805cac06, 0x28f06ea9, 0xad911bd0, 0x053dd97f, +0x2cde12bb, 0x8472d014, 0x0113a56d, 0xa9bf67c2, 0x28ae2be0, 0x8002e94f, 0x05639c36, 0xadcf5e99, 0xbe0bb16a, 0x16a773c5, 0x93c606bc, 0x3b6ac413, 0xba7b8831, 0x12d74a9e, 0x97b63fe7, 0x3f1afd48, 0xcde6cf23, 0x654a0d8c, 0xe02b78f5, 0x4887ba5a, +0xc996f678, 0x613a34d7, 0xe45b41ae, 0x4cf78301, 0x5f336cf2, 0xf79fae5d, 0x72fedb24, 0xda52198b, 0x5b4355a9, 0xf3ef9706, 0x768ee27f, 0xde2220d0, 0xf7c1eb14, 0x5f6d29bb, 0xda0c5cc2, 0x72a09e6d, 0xf3b1d24f, 0x5b1d10e0, 0xde7c6599, 0x76d0a736, +0x651448c5, 0xcdb88a6a, 0x48d9ff13, 0xe0753dbc, 0x6164719e, 0xc9c8b331, 0x4ca9c648, 0xe40504e7, 0x215c87bb, 0x89f04514, 0x0c91306d, 0xa43df2c2, 0x252cbee0, 0x8d807c4f, 0x08e10936, 0xa04dcb99, 0xb389246a, 0x1b25e6c5, 0x9e4493bc, 0x36e85113, +0xb7f91d31, 0x1f55df9e, 0x9a34aae7, 0x32986848, 0x1b7ba38c, 0xb3d76123, 0x36b6145a, 0x9e1ad6f5, 0x1f0b9ad7, 0xb7a75878, 0x32c62d01, 0x9a6aefae, 0x89ae005d, 0x2102c2f2, 0xa463b78b, 0x0ccf7524, 0x8dde3906, 0x2572fba9, 0xa0138ed0, 0x08bf4c7f, +0x37a5b137, 0x9f097398, 0x1a6806e1, 0xb2c4c44e, 0x33d5886c, 0x9b794ac3, 0x1e183fba, 0xb6b4fd15, 0xa57012e6, 0x0ddcd049, 0x88bda530, 0x2011679f, 0xa1002bbd, 0x09ace912, 0x8ccd9c6b, 0x24615ec4, 0x0d829500, 0xa52e57af, 0x204f22d6, 0x88e3e079, +0x09f2ac5b, 0xa15e6ef4, 0x243f1b8d, 0x8c93d922, 0x9f5736d1, 0x37fbf47e, 0xb29a8107, 0x1a3643a8, 0x9b270f8a, 0x338bcd25, 0xb6eab85c, 0x1e467af3, 0xdb1ff9af, 0x73b33b00, 0xf6d24e79, 0x5e7e8cd6, 0xdf6fc0f4, 0x77c3025b, 0xf2a27722, 0x5a0eb58d, +0x49ca5a7e, 0xe16698d1, 0x6407eda8, 0xccab2f07, 0x4dba6325, 0xe516a18a, 0x6077d4f3, 0xc8db165c, 0xe138dd98, 0x49941f37, 0xccf56a4e, 0x6459a8e1, 0xe548e4c3, 0x4de4266c, 0xc8855315, 0x602991ba, 0x73ed7e49, 0xdb41bce6, 0x5e20c99f, 0xf68c0b30, +0x779d4712, 0xdf3185bd, 0x5a50f0c4, 0xf2fc326b, 0x00000000, 0xc2e3130f, 0xa659fb07, 0x64bae808, 0xb048ca58, 0x72abd957, 0x1611315f, 0xd4f22250, 0xf145dcc6, 0x33a6cfc9, 0x571c27c1, 0x95ff34ce, 0x410d169e, 0x83ee0591, 0xe754ed99, 0x25b7fe96, +0x50ac8644, 0x924f954b, 0xf6f57d43, 0x34166e4c, 0xe0e44c1c, 0x22075f13, 0x46bdb71b, 0x845ea414, 0xa1e95a82, 0x630a498d, 0x07b0a185, 0xc553b28a, 0x11a190da, 0xd34283d5, 0xb7f86bdd, 0x751b78d2, 0xeb8fc3a6, 0x296cd0a9, 0x4dd638a1, 0x8f352bae, +0x5bc709fe, 0x99241af1, 0xfd9ef2f9, 0x3f7de1f6, 0x1aca1f60, 0xd8290c6f, 0xbc93e467, 0x7e70f768, 0xaa82d538, 0x6861c637, 0x0cdb2e3f, 0xce383d30, 0xbb2345e2, 0x79c056ed, 0x1d7abee5, 0xdf99adea, 0x0b6b8fba, 0xc9889cb5, 0xad3274bd, 0x6fd167b2, +0x4a669924, 0x88858a2b, 0xec3f6223, 0x2edc712c, 0xfa2e537c, 0x38cd4073, 0x5c77a87b, 0x9e94bb74, 0x037f4bb8, 0xc19c58b7, 0xa526b0bf, 0x67c5a3b0, 0xb33781e0, 0x71d492ef, 0x156e7ae7, 0xd78d69e8, 0xf23a977e, 0x30d98471, 0x54636c79, 0x96807f76, +0x42725d26, 0x80914e29, 0xe42ba621, 0x26c8b52e, 0x53d3cdfc, 0x9130def3, 0xf58a36fb, 0x376925f4, 0xe39b07a4, 0x217814ab, 0x45c2fca3, 0x8721efac, 0xa296113a, 0x60750235, 0x04cfea3d, 0xc62cf932, 0x12dedb62, 0xd03dc86d, 0xb4872065, 0x7664336a, +0xe8f0881e, 0x2a139b11, 0x4ea97319, 0x8c4a6016, 0x58b84246, 0x9a5b5149, 0xfee1b941, 0x3c02aa4e, 0x19b554d8, 0xdb5647d7, 0xbfecafdf, 0x7d0fbcd0, 0xa9fd9e80, 0x6b1e8d8f, 0x0fa46587, 0xcd477688, 0xb85c0e5a, 0x7abf1d55, 0x1e05f55d, 0xdce6e652, +0x0814c402, 0xcaf7d70d, 0xae4d3f05, 0x6cae2c0a, 0x4919d29c, 0x8bfac193, 0xef40299b, 0x2da33a94, 0xf95118c4, 0x3bb20bcb, 0x5f08e3c3, 0x9debf0cc, 0xa7fee26f, 0x651df160, 0x01a71968, 0xc3440a67, 0x17b62837, 0xd5553b38, 0xb1efd330, 0x730cc03f, +0x56bb3ea9, 0x94582da6, 0xf0e2c5ae, 0x3201d6a1, 0xe6f3f4f1, 0x2410e7fe, 0x40aa0ff6, 0x82491cf9, 0xf752642b, 0x35b17724, 0x510b9f2c, 0x93e88c23, 0x471aae73, 0x85f9bd7c, 0xe1435574, 0x23a0467b, 0x0617b8ed, 0xc4f4abe2, 0xa04e43ea, 0x62ad50e5, +0xb65f72b5, 0x74bc61ba, 0x100689b2, 0xd2e59abd, 0x4c7121c9, 0x8e9232c6, 0xea28dace, 0x28cbc9c1, 0xfc39eb91, 0x3edaf89e, 0x5a601096, 0x98830399, 0xbd34fd0f, 0x7fd7ee00, 0x1b6d0608, 0xd98e1507, 0x0d7c3757, 0xcf9f2458, 0xab25cc50, 0x69c6df5f, +0x1cdda78d, 0xde3eb482, 0xba845c8a, 0x78674f85, 0xac956dd5, 0x6e767eda, 0x0acc96d2, 0xc82f85dd, 0xed987b4b, 0x2f7b6844, 0x4bc1804c, 0x89229343, 0x5dd0b113, 0x9f33a21c, 0xfb894a14, 0x396a591b, 0xa481a9d7, 0x6662bad8, 0x02d852d0, 0xc03b41df, +0x14c9638f, 0xd62a7080, 0xb2909888, 0x70738b87, 0x55c47511, 0x9727661e, 0xf39d8e16, 0x317e9d19, 0xe58cbf49, 0x276fac46, 0x43d5444e, 0x81365741, 0xf42d2f93, 0x36ce3c9c, 0x5274d494, 0x9097c79b, 0x4465e5cb, 0x8686f6c4, 0xe23c1ecc, 0x20df0dc3, +0x0568f355, 0xc78be05a, 0xa3310852, 0x61d21b5d, 0xb520390d, 0x77c32a02, 0x1379c20a, 0xd19ad105, 0x4f0e6a71, 0x8ded797e, 0xe9579176, 0x2bb48279, 0xff46a029, 0x3da5b326, 0x591f5b2e, 0x9bfc4821, 0xbe4bb6b7, 0x7ca8a5b8, 0x18124db0, 0xdaf15ebf, +0x0e037cef, 0xcce06fe0, 0xa85a87e8, 0x6ab994e7, 0x1fa2ec35, 0xdd41ff3a, 0xb9fb1732, 0x7b18043d, 0xafea266d, 0x6d093562, 0x09b3dd6a, 0xcb50ce65, 0xeee730f3, 0x2c0423fc, 0x48becbf4, 0x8a5dd8fb, 0x5eaffaab, 0x9c4ce9a4, 0xf8f601ac, 0x3a1512a3, +0x00000000, 0xb9d53205, 0x6ffae0e9, 0xd62fd2ec, 0xa81fabb9, 0x11ca99bc, 0xc7e54b50, 0x7e307955, 0x3ff89630, 0x862da435, 0x500276d9, 0xe9d744dc, 0x97e73d89, 0x2e320f8c, 0xf81ddd60, 0x41c8ef65, 0x1c2ab890, 0xa5ff8a95, 0x73d05879, 0xca056a7c, +0xb4351329, 0x0de0212c, 0xdbcff3c0, 0x621ac1c5, 0x23d22ea0, 0x9a071ca5, 0x4c28ce49, 0xf5fdfc4c, 0x8bcd8519, 0x3218b71c, 0xe43765f0, 0x5de257f5, 0xa6c5a610, 0x1f109415, 0xc93f46f9, 0x70ea74fc, 0x0eda0da9, 0xb70f3fac, 0x6120ed40, 0xd8f5df45, +0x993d3020, 0x20e80225, 0xf6c7d0c9, 0x4f12e2cc, 0x31229b99, 0x88f7a99c, 0x5ed87b70, 0xe70d4975, 0xbaef1e80, 0x033a2c85, 0xd515fe69, 0x6cc0cc6c, 0x12f0b539, 0xab25873c, 0x7d0a55d0, 0xc4df67d5, 0x851788b0, 0x3cc2bab5, 0xeaed6859, 0x53385a5c, +0x2d082309, 0x94dd110c, 0x42f2c3e0, 0xfb27f1e5, 0x8a4779aa, 0x33924baf, 0xe5bd9943, 0x5c68ab46, 0x2258d213, 0x9b8de016, 0x4da232fa, 0xf47700ff, 0xb5bfef9a, 0x0c6add9f, 0xda450f73, 0x63903d76, 0x1da04423, 0xa4757626, 0x725aa4ca, 0xcb8f96cf, +0x966dc13a, 0x2fb8f33f, 0xf99721d3, 0x404213d6, 0x3e726a83, 0x87a75886, 0x51888a6a, 0xe85db86f, 0xa995570a, 0x1040650f, 0xc66fb7e3, 0x7fba85e6, 0x018afcb3, 0xb85fceb6, 0x6e701c5a, 0xd7a52e5f, 0x2c82dfba, 0x9557edbf, 0x43783f53, 0xfaad0d56, +0x849d7403, 0x3d484606, 0xeb6794ea, 0x52b2a6ef, 0x137a498a, 0xaaaf7b8f, 0x7c80a963, 0xc5559b66, 0xbb65e233, 0x02b0d036, 0xd49f02da, 0x6d4a30df, 0x30a8672a, 0x897d552f, 0x5f5287c3, 0xe687b5c6, 0x98b7cc93, 0x2162fe96, 0xf74d2c7a, 0x4e981e7f, +0x0f50f11a, 0xb685c31f, 0x60aa11f3, 0xd97f23f6, 0xa74f5aa3, 0x1e9a68a6, 0xc8b5ba4a, 0x7160884f, 0xdd24256a, 0x64f1176f, 0xb2dec583, 0x0b0bf786, 0x753b8ed3, 0xcceebcd6, 0x1ac16e3a, 0xa3145c3f, 0xe2dcb35a, 0x5b09815f, 0x8d2653b3, 0x34f361b6, +0x4ac318e3, 0xf3162ae6, 0x2539f80a, 0x9cecca0f, 0xc10e9dfa, 0x78dbafff, 0xaef47d13, 0x17214f16, 0x69113643, 0xd0c40446, 0x06ebd6aa, 0xbf3ee4af, 0xfef60bca, 0x472339cf, 0x910ceb23, 0x28d9d926, 0x56e9a073, 0xef3c9276, 0x3913409a, 0x80c6729f, +0x7be1837a, 0xc234b17f, 0x141b6393, 0xadce5196, 0xd3fe28c3, 0x6a2b1ac6, 0xbc04c82a, 0x05d1fa2f, 0x4419154a, 0xfdcc274f, 0x2be3f5a3, 0x9236c7a6, 0xec06bef3, 0x55d38cf6, 0x83fc5e1a, 0x3a296c1f, 0x67cb3bea, 0xde1e09ef, 0x0831db03, 0xb1e4e906, +0xcfd49053, 0x7601a256, 0xa02e70ba, 0x19fb42bf, 0x5833adda, 0xe1e69fdf, 0x37c94d33, 0x8e1c7f36, 0xf02c0663, 0x49f93466, 0x9fd6e68a, 0x2603d48f, 0x57635cc0, 0xeeb66ec5, 0x3899bc29, 0x814c8e2c, 0xff7cf779, 0x46a9c57c, 0x90861790, 0x29532595, +0x689bcaf0, 0xd14ef8f5, 0x07612a19, 0xbeb4181c, 0xc0846149, 0x7951534c, 0xaf7e81a0, 0x16abb3a5, 0x4b49e450, 0xf29cd655, 0x24b304b9, 0x9d6636bc, 0xe3564fe9, 0x5a837dec, 0x8cacaf00, 0x35799d05, 0x74b17260, 0xcd644065, 0x1b4b9289, 0xa29ea08c, +0xdcaed9d9, 0x657bebdc, 0xb3543930, 0x0a810b35, 0xf1a6fad0, 0x4873c8d5, 0x9e5c1a39, 0x2789283c, 0x59b95169, 0xe06c636c, 0x3643b180, 0x8f968385, 0xce5e6ce0, 0x778b5ee5, 0xa1a48c09, 0x1871be0c, 0x6641c759, 0xdf94f55c, 0x09bb27b0, 0xb06e15b5, +0xed8c4240, 0x54597045, 0x8276a2a9, 0x3ba390ac, 0x4593e9f9, 0xfc46dbfc, 0x2a690910, 0x93bc3b15, 0xd274d470, 0x6ba1e675, 0xbd8e3499, 0x045b069c, 0x7a6b7fc9, 0xc3be4dcc, 0x15919f20, 0xac44ad25, 0x00000000, 0x33229509, 0x036648f3, 0x3044ddfa, +0x530b1d8d, 0x60298884, 0x506d557e, 0x634fc077, 0xb29679ac, 0x81b4eca5, 0xb1f0315f, 0x82d2a456, 0xe19d6421, 0xd2bff128, 0xe2fb2cd2, 0xd1d9b9db, 0xa7c9f321, 0x94eb6628, 0xa4afbbd2, 0x978d2edb, 0xf4c2eeac, 0xc7e07ba5, 0xf7a4a65f, 0xc4863356, +0x155f8a8d, 0x267d1f84, 0x1639c27e, 0x251b5777, 0x46549700, 0x75760209, 0x4532dff3, 0x76104afa, 0x25d646ed, 0x16f4d3e4, 0x26b00e1e, 0x15929b17, 0x76dd5b60, 0x45ffce69, 0x75bb1393, 0x4699869a, 0x97403f41, 0xa462aa48, 0x942677b2, 0xa704e2bb, +0xc44b22cc, 0xf769b7c5, 0xc72d6a3f, 0xf40fff36, 0x821fb5cc, 0xb13d20c5, 0x8179fd3f, 0xb25b6836, 0xd114a841, 0xe2363d48, 0xd272e0b2, 0xe15075bb, 0x3089cc60, 0x03ab5969, 0x33ef8493, 0x00cd119a, 0x6382d1ed, 0x50a044e4, 0x60e4991e, 0x53c60c17, +0xacd414cb, 0x9ff681c2, 0xafb25c38, 0x9c90c931, 0xffdf0946, 0xccfd9c4f, 0xfcb941b5, 0xcf9bd4bc, 0x1e426d67, 0x2d60f86e, 0x1d242594, 0x2e06b09d, 0x4d4970ea, 0x7e6be5e3, 0x4e2f3819, 0x7d0dad10, 0x0b1de7ea, 0x383f72e3, 0x087baf19, 0x3b593a10, +0x5816fa67, 0x6b346f6e, 0x5b70b294, 0x6852279d, 0xb98b9e46, 0x8aa90b4f, 0xbaedd6b5, 0x89cf43bc, 0xea8083cb, 0xd9a216c2, 0xe9e6cb38, 0xdac45e31, 0x89025226, 0xba20c72f, 0x8a641ad5, 0xb9468fdc, 0xda094fab, 0xe92bdaa2, 0xd96f0758, 0xea4d9251, +0x3b942b8a, 0x08b6be83, 0x38f26379, 0x0bd0f670, 0x689f3607, 0x5bbda30e, 0x6bf97ef4, 0x58dbebfd, 0x2ecba107, 0x1de9340e, 0x2dade9f4, 0x1e8f7cfd, 0x7dc0bc8a, 0x4ee22983, 0x7ea6f479, 0x4d846170, 0x9c5dd8ab, 0xaf7f4da2, 0x9f3b9058, 0xac190551, +0xcf56c526, 0xfc74502f, 0xcc308dd5, 0xff1218dc, 0x8614351f, 0xb536a016, 0x85727dec, 0xb650e8e5, 0xd51f2892, 0xe63dbd9b, 0xd6796061, 0xe55bf568, 0x34824cb3, 0x07a0d9ba, 0x37e40440, 0x04c69149, 0x6789513e, 0x54abc437, 0x64ef19cd, 0x57cd8cc4, +0x21ddc63e, 0x12ff5337, 0x22bb8ecd, 0x11991bc4, 0x72d6dbb3, 0x41f44eba, 0x71b09340, 0x42920649, 0x934bbf92, 0xa0692a9b, 0x902df761, 0xa30f6268, 0xc040a21f, 0xf3623716, 0xc326eaec, 0xf0047fe5, 0xa3c273f2, 0x90e0e6fb, 0xa0a43b01, 0x9386ae08, +0xf0c96e7f, 0xc3ebfb76, 0xf3af268c, 0xc08db385, 0x11540a5e, 0x22769f57, 0x123242ad, 0x2110d7a4, 0x425f17d3, 0x717d82da, 0x41395f20, 0x721bca29, 0x040b80d3, 0x372915da, 0x076dc820, 0x344f5d29, 0x57009d5e, 0x64220857, 0x5466d5ad, 0x674440a4, +0xb69df97f, 0x85bf6c76, 0xb5fbb18c, 0x86d92485, 0xe596e4f2, 0xd6b471fb, 0xe6f0ac01, 0xd5d23908, 0x2ac021d4, 0x19e2b4dd, 0x29a66927, 0x1a84fc2e, 0x79cb3c59, 0x4ae9a950, 0x7aad74aa, 0x498fe1a3, 0x98565878, 0xab74cd71, 0x9b30108b, 0xa8128582, +0xcb5d45f5, 0xf87fd0fc, 0xc83b0d06, 0xfb19980f, 0x8d09d2f5, 0xbe2b47fc, 0x8e6f9a06, 0xbd4d0f0f, 0xde02cf78, 0xed205a71, 0xdd64878b, 0xee461282, 0x3f9fab59, 0x0cbd3e50, 0x3cf9e3aa, 0x0fdb76a3, 0x6c94b6d4, 0x5fb623dd, 0x6ff2fe27, 0x5cd06b2e, +0x0f166739, 0x3c34f230, 0x0c702fca, 0x3f52bac3, 0x5c1d7ab4, 0x6f3fefbd, 0x5f7b3247, 0x6c59a74e, 0xbd801e95, 0x8ea28b9c, 0xbee65666, 0x8dc4c36f, 0xee8b0318, 0xdda99611, 0xeded4beb, 0xdecfdee2, 0xa8df9418, 0x9bfd0111, 0xabb9dceb, 0x989b49e2, +0xfbd48995, 0xc8f61c9c, 0xf8b2c166, 0xcb90546f, 0x1a49edb4, 0x296b78bd, 0x192fa547, 0x2a0d304e, 0x4942f039, 0x7a606530, 0x4a24b8ca, 0x79062dc3, 0x00000000, 0x4437e932, 0xec7880b0, 0xa84f6982, 0x0f6d3921, 0x4b5ad013, 0xe315b991, 0xa72250a3, +0x10201846, 0x5417f174, 0xfc5898f6, 0xb86f71c4, 0x1f4d2167, 0x5b7ac855, 0xf335a1d7, 0xb70248e5, 0x6ddadd5c, 0x29ed346e, 0x81a25dec, 0xc595b4de, 0x62b7e47d, 0x26800d4f, 0x8ecf64cd, 0xcaf88dff, 0x7dfac51a, 0x39cd2c28, 0x918245aa, 0xd5b5ac98, +0x7297fc3b, 0x36a01509, 0x9eef7c8b, 0xdad895b9, 0xc9aeda7f, 0x8d99334d, 0x25d65acf, 0x61e1b3fd, 0xc6c3e35e, 0x82f40a6c, 0x2abb63ee, 0x6e8c8adc, 0xd98ec239, 0x9db92b0b, 0x35f64289, 0x71c1abbb, 0xd6e3fb18, 0x92d4122a, 0x3a9b7ba8, 0x7eac929a, +0xa4740723, 0xe043ee11, 0x480c8793, 0x0c3b6ea1, 0xab193e02, 0xef2ed730, 0x4761beb2, 0x03565780, 0xb4541f65, 0xf063f657, 0x582c9fd5, 0x1c1b76e7, 0xbb392644, 0xff0ecf76, 0x5741a6f4, 0x13764fc6, 0x3fd7fcaa, 0x7be01598, 0xd3af7c1a, 0x97989528, +0x30bac58b, 0x748d2cb9, 0xdcc2453b, 0x98f5ac09, 0x2ff7e4ec, 0x6bc00dde, 0xc38f645c, 0x87b88d6e, 0x209addcd, 0x64ad34ff, 0xcce25d7d, 0x88d5b44f, 0x520d21f6, 0x163ac8c4, 0xbe75a146, 0xfa424874, 0x5d6018d7, 0x1957f1e5, 0xb1189867, 0xf52f7155, +0x422d39b0, 0x061ad082, 0xae55b900, 0xea625032, 0x4d400091, 0x0977e9a3, 0xa1388021, 0xe50f6913, 0xf67926d5, 0xb24ecfe7, 0x1a01a665, 0x5e364f57, 0xf9141ff4, 0xbd23f6c6, 0x156c9f44, 0x515b7676, 0xe6593e93, 0xa26ed7a1, 0x0a21be23, 0x4e165711, +0xe93407b2, 0xad03ee80, 0x054c8702, 0x417b6e30, 0x9ba3fb89, 0xdf9412bb, 0x77db7b39, 0x33ec920b, 0x94cec2a8, 0xd0f92b9a, 0x78b64218, 0x3c81ab2a, 0x8b83e3cf, 0xcfb40afd, 0x67fb637f, 0x23cc8a4d, 0x84eedaee, 0xc0d933dc, 0x68965a5e, 0x2ca1b36c, +0xae1f71f2, 0xea2898c0, 0x4267f142, 0x06501870, 0xa17248d3, 0xe545a1e1, 0x4d0ac863, 0x093d2151, 0xbe3f69b4, 0xfa088086, 0x5247e904, 0x16700036, 0xb1525095, 0xf565b9a7, 0x5d2ad025, 0x191d3917, 0xc3c5acae, 0x87f2459c, 0x2fbd2c1e, 0x6b8ac52c, +0xcca8958f, 0x889f7cbd, 0x20d0153f, 0x64e7fc0d, 0xd3e5b4e8, 0x97d25dda, 0x3f9d3458, 0x7baadd6a, 0xdc888dc9, 0x98bf64fb, 0x30f00d79, 0x74c7e44b, 0x67b1ab8d, 0x238642bf, 0x8bc92b3d, 0xcffec20f, 0x68dc92ac, 0x2ceb7b9e, 0x84a4121c, 0xc093fb2e, +0x7791b3cb, 0x33a65af9, 0x9be9337b, 0xdfdeda49, 0x78fc8aea, 0x3ccb63d8, 0x94840a5a, 0xd0b3e368, 0x0a6b76d1, 0x4e5c9fe3, 0xe613f661, 0xa2241f53, 0x05064ff0, 0x4131a6c2, 0xe97ecf40, 0xad492672, 0x1a4b6e97, 0x5e7c87a5, 0xf633ee27, 0xb2040715, +0x152657b6, 0x5111be84, 0xf95ed706, 0xbd693e34, 0x91c88d58, 0xd5ff646a, 0x7db00de8, 0x3987e4da, 0x9ea5b479, 0xda925d4b, 0x72dd34c9, 0x36eaddfb, 0x81e8951e, 0xc5df7c2c, 0x6d9015ae, 0x29a7fc9c, 0x8e85ac3f, 0xcab2450d, 0x62fd2c8f, 0x26cac5bd, +0xfc125004, 0xb825b936, 0x106ad0b4, 0x545d3986, 0xf37f6925, 0xb7488017, 0x1f07e995, 0x5b3000a7, 0xec324842, 0xa805a170, 0x004ac8f2, 0x447d21c0, 0xe35f7163, 0xa7689851, 0x0f27f1d3, 0x4b1018e1, 0x58665727, 0x1c51be15, 0xb41ed797, 0xf0293ea5, +0x570b6e06, 0x133c8734, 0xbb73eeb6, 0xff440784, 0x48464f61, 0x0c71a653, 0xa43ecfd1, 0xe00926e3, 0x472b7640, 0x031c9f72, 0xab53f6f0, 0xef641fc2, 0x35bc8a7b, 0x718b6349, 0xd9c40acb, 0x9df3e3f9, 0x3ad1b35a, 0x7ee65a68, 0xd6a933ea, 0x929edad8, +0x259c923d, 0x61ab7b0f, 0xc9e4128d, 0x8dd3fbbf, 0x2af1ab1c, 0x6ec6422e, 0xc6892bac, 0x82bec29e, 0x00000000, 0xf716e32e, 0xa7b83d9d, 0x50aedeb3, 0xdb1a97c1, 0x2c0c74ef, 0x7ca2aa5c, 0x8bb44972, 0xb4a8ecf3, 0x43be0fdd, 0x1310d16e, 0xe4063240, +0x6fb27b32, 0x98a4981c, 0xc80a46af, 0x3f1ca581, 0x91d12233, 0x66c7c11d, 0x36691fae, 0xc17ffc80, 0x4acbb5f2, 0xbddd56dc, 0xed73886f, 0x1a656b41, 0x2579cec0, 0xd26f2dee, 0x82c1f35d, 0x75d71073, 0xfe635901, 0x0975ba2f, 0x59db649c, 0xaecd87b2, +0xd4c3ad71, 0x23d54e5f, 0x737b90ec, 0x846d73c2, 0x0fd93ab0, 0xf8cfd99e, 0xa861072d, 0x5f77e403, 0x606b4182, 0x977da2ac, 0xc7d37c1f, 0x30c59f31, 0xbb71d643, 0x4c67356d, 0x1cc9ebde, 0xebdf08f0, 0x45128f42, 0xb2046c6c, 0xe2aab2df, 0x15bc51f1, +0x9e081883, 0x691efbad, 0x39b0251e, 0xcea6c630, 0xf1ba63b1, 0x06ac809f, 0x56025e2c, 0xa114bd02, 0x2aa0f470, 0xddb6175e, 0x8d18c9ed, 0x7a0e2ac3, 0x1c626f09, 0xeb748c27, 0xbbda5294, 0x4cccb1ba, 0xc778f8c8, 0x306e1be6, 0x60c0c555, 0x97d6267b, +0xa8ca83fa, 0x5fdc60d4, 0x0f72be67, 0xf8645d49, 0x73d0143b, 0x84c6f715, 0xd46829a6, 0x237eca88, 0x8db34d3a, 0x7aa5ae14, 0x2a0b70a7, 0xdd1d9389, 0x56a9dafb, 0xa1bf39d5, 0xf111e766, 0x06070448, 0x391ba1c9, 0xce0d42e7, 0x9ea39c54, 0x69b57f7a, +0xe2013608, 0x1517d526, 0x45b90b95, 0xb2afe8bb, 0xc8a1c278, 0x3fb72156, 0x6f19ffe5, 0x980f1ccb, 0x13bb55b9, 0xe4adb697, 0xb4036824, 0x43158b0a, 0x7c092e8b, 0x8b1fcda5, 0xdbb11316, 0x2ca7f038, 0xa713b94a, 0x50055a64, 0x00ab84d7, 0xf7bd67f9, +0x5970e04b, 0xae660365, 0xfec8ddd6, 0x09de3ef8, 0x826a778a, 0x757c94a4, 0x25d24a17, 0xd2c4a939, 0xedd80cb8, 0x1aceef96, 0x4a603125, 0xbd76d20b, 0x36c29b79, 0xc1d47857, 0x917aa6e4, 0x666c45ca, 0xb5cc3aa9, 0x42dad987, 0x12740734, 0xe562e41a, +0x6ed6ad68, 0x99c04e46, 0xc96e90f5, 0x3e7873db, 0x0164d65a, 0xf6723574, 0xa6dcebc7, 0x51ca08e9, 0xda7e419b, 0x2d68a2b5, 0x7dc67c06, 0x8ad09f28, 0x241d189a, 0xd30bfbb4, 0x83a52507, 0x74b3c629, 0xff078f5b, 0x08116c75, 0x58bfb2c6, 0xafa951e8, +0x90b5f469, 0x67a31747, 0x370dc9f4, 0xc01b2ada, 0x4baf63a8, 0xbcb98086, 0xec175e35, 0x1b01bd1b, 0x610f97d8, 0x961974f6, 0xc6b7aa45, 0x31a1496b, 0xba150019, 0x4d03e337, 0x1dad3d84, 0xeabbdeaa, 0xd5a77b2b, 0x22b19805, 0x721f46b6, 0x8509a598, +0x0ebdecea, 0xf9ab0fc4, 0xa905d177, 0x5e133259, 0xf0deb5eb, 0x07c856c5, 0x57668876, 0xa0706b58, 0x2bc4222a, 0xdcd2c104, 0x8c7c1fb7, 0x7b6afc99, 0x44765918, 0xb360ba36, 0xe3ce6485, 0x14d887ab, 0x9f6cced9, 0x687a2df7, 0x38d4f344, 0xcfc2106a, +0xa9ae55a0, 0x5eb8b68e, 0x0e16683d, 0xf9008b13, 0x72b4c261, 0x85a2214f, 0xd50cfffc, 0x221a1cd2, 0x1d06b953, 0xea105a7d, 0xbabe84ce, 0x4da867e0, 0xc61c2e92, 0x310acdbc, 0x61a4130f, 0x96b2f021, 0x387f7793, 0xcf6994bd, 0x9fc74a0e, 0x68d1a920, +0xe365e052, 0x1473037c, 0x44ddddcf, 0xb3cb3ee1, 0x8cd79b60, 0x7bc1784e, 0x2b6fa6fd, 0xdc7945d3, 0x57cd0ca1, 0xa0dbef8f, 0xf075313c, 0x0763d212, 0x7d6df8d1, 0x8a7b1bff, 0xdad5c54c, 0x2dc32662, 0xa6776f10, 0x51618c3e, 0x01cf528d, 0xf6d9b1a3, +0xc9c51422, 0x3ed3f70c, 0x6e7d29bf, 0x996bca91, 0x12df83e3, 0xe5c960cd, 0xb567be7e, 0x42715d50, 0xecbcdae2, 0x1baa39cc, 0x4b04e77f, 0xbc120451, 0x37a64d23, 0xc0b0ae0d, 0x901e70be, 0x67089390, 0x58143611, 0xaf02d53f, 0xffac0b8c, 0x08bae8a2, +0x830ea1d0, 0x741842fe, 0x24b69c4d, 0xd3a07f63, 0x00000000, 0x1b52886d, 0x4bc51e24, 0x50979649, 0x8871fb9a, 0x932373f7, 0xc3b4e5be, 0xd8e66dd3, 0xcd7452d8, 0xd626dab5, 0x86b14cfc, 0x9de3c491, 0x4505a942, 0x5e57212f, 0x0ec0b766, 0x15923f0b, +0xe34b1719, 0xf8199f74, 0xa88e093d, 0xb3dc8150, 0x6b3aec83, 0x706864ee, 0x20fff2a7, 0x3bad7aca, 0x2e3f45c1, 0x356dcdac, 0x65fa5be5, 0x7ea8d388, 0xa64ebe5b, 0xbd1c3636, 0xed8ba07f, 0xf6d92812, 0x6e13e1b8, 0x754169d5, 0x25d6ff9c, 0x3e8477f1, +0xe6621a22, 0xfd30924f, 0xada70406, 0xb6f58c6b, 0xa367b360, 0xb8353b0d, 0xe8a2ad44, 0xf3f02529, 0x2b1648fa, 0x3044c097, 0x60d356de, 0x7b81deb3, 0x8d58f6a1, 0x960a7ecc, 0xc69de885, 0xddcf60e8, 0x05290d3b, 0x1e7b8556, 0x4eec131f, 0x55be9b72, +0x402ca479, 0x5b7e2c14, 0x0be9ba5d, 0x10bb3230, 0xc85d5fe3, 0xd30fd78e, 0x839841c7, 0x98cac9aa, 0x67a80631, 0x7cfa8e5c, 0x2c6d1815, 0x373f9078, 0xefd9fdab, 0xf48b75c6, 0xa41ce38f, 0xbf4e6be2, 0xaadc54e9, 0xb18edc84, 0xe1194acd, 0xfa4bc2a0, +0x22adaf73, 0x39ff271e, 0x6968b157, 0x723a393a, 0x84e31128, 0x9fb19945, 0xcf260f0c, 0xd4748761, 0x0c92eab2, 0x17c062df, 0x4757f496, 0x5c057cfb, 0x499743f0, 0x52c5cb9d, 0x02525dd4, 0x1900d5b9, 0xc1e6b86a, 0xdab43007, 0x8a23a64e, 0x91712e23, +0x09bbe789, 0x12e96fe4, 0x427ef9ad, 0x592c71c0, 0x81ca1c13, 0x9a98947e, 0xca0f0237, 0xd15d8a5a, 0xc4cfb551, 0xdf9d3d3c, 0x8f0aab75, 0x94582318, 0x4cbe4ecb, 0x57ecc6a6, 0x077b50ef, 0x1c29d882, 0xeaf0f090, 0xf1a278fd, 0xa135eeb4, 0xba6766d9, +0x62810b0a, 0x79d38367, 0x2944152e, 0x32169d43, 0x2784a248, 0x3cd62a25, 0x6c41bc6c, 0x77133401, 0xaff559d2, 0xb4a7d1bf, 0xe43047f6, 0xff62cf9b, 0x1db50bb2, 0x06e783df, 0x56701596, 0x4d229dfb, 0x95c4f028, 0x8e967845, 0xde01ee0c, 0xc5536661, +0xd0c1596a, 0xcb93d107, 0x9b04474e, 0x8056cf23, 0x58b0a2f0, 0x43e22a9d, 0x1375bcd4, 0x082734b9, 0xfefe1cab, 0xe5ac94c6, 0xb53b028f, 0xae698ae2, 0x768fe731, 0x6ddd6f5c, 0x3d4af915, 0x26187178, 0x338a4e73, 0x28d8c61e, 0x784f5057, 0x631dd83a, +0xbbfbb5e9, 0xa0a93d84, 0xf03eabcd, 0xeb6c23a0, 0x73a6ea0a, 0x68f46267, 0x3863f42e, 0x23317c43, 0xfbd71190, 0xe08599fd, 0xb0120fb4, 0xab4087d9, 0xbed2b8d2, 0xa58030bf, 0xf517a6f6, 0xee452e9b, 0x36a34348, 0x2df1cb25, 0x7d665d6c, 0x6634d501, +0x90edfd13, 0x8bbf757e, 0xdb28e337, 0xc07a6b5a, 0x189c0689, 0x03ce8ee4, 0x535918ad, 0x480b90c0, 0x5d99afcb, 0x46cb27a6, 0x165cb1ef, 0x0d0e3982, 0xd5e85451, 0xcebadc3c, 0x9e2d4a75, 0x857fc218, 0x7a1d0d83, 0x614f85ee, 0x31d813a7, 0x2a8a9bca, +0xf26cf619, 0xe93e7e74, 0xb9a9e83d, 0xa2fb6050, 0xb7695f5b, 0xac3bd736, 0xfcac417f, 0xe7fec912, 0x3f18a4c1, 0x244a2cac, 0x74ddbae5, 0x6f8f3288, 0x99561a9a, 0x820492f7, 0xd29304be, 0xc9c18cd3, 0x1127e100, 0x0a75696d, 0x5ae2ff24, 0x41b07749, +0x54224842, 0x4f70c02f, 0x1fe75666, 0x04b5de0b, 0xdc53b3d8, 0xc7013bb5, 0x9796adfc, 0x8cc42591, 0x140eec3b, 0x0f5c6456, 0x5fcbf21f, 0x44997a72, 0x9c7f17a1, 0x872d9fcc, 0xd7ba0985, 0xcce881e8, 0xd97abee3, 0xc228368e, 0x92bfa0c7, 0x89ed28aa, +0x510b4579, 0x4a59cd14, 0x1ace5b5d, 0x019cd330, 0xf745fb22, 0xec17734f, 0xbc80e506, 0xa7d26d6b, 0x7f3400b8, 0x646688d5, 0x34f11e9c, 0x2fa396f1, 0x3a31a9fa, 0x21632197, 0x71f4b7de, 0x6aa63fb3, 0xb2405260, 0xa912da0d, 0xf9854c44, 0xe2d7c429, +0x00000000, 0x45af562f, 0x045c552a, 0x41f30305, 0xa190e774, 0xe43fb15b, 0xa5ccb25e, 0xe063e471, 0x605152dc, 0x25fe04f3, 0x640d07f6, 0x21a251d9, 0xc1c1b5a8, 0x846ee387, 0xc59de082, 0x8032b6ad, 0x578ae198, 0x1225b7b7, 0x53d6b4b2, 0x1679e29d, +0xf61a06ec, 0xb3b550c3, 0xf24653c6, 0xb7e905e9, 0x37dbb344, 0x7274e56b, 0x3387e66e, 0x7628b041, 0x964b5430, 0xd3e4021f, 0x9217011a, 0xd7b85735, 0x537b479d, 0x16d411b2, 0x572712b7, 0x12884498, 0xf2eba0e9, 0xb744f6c6, 0xf6b7f5c3, 0xb318a3ec, +0x332a1541, 0x7685436e, 0x3776406b, 0x72d91644, 0x92baf235, 0xd715a41a, 0x96e6a71f, 0xd349f130, 0x04f1a605, 0x415ef02a, 0x00adf32f, 0x4502a500, 0xa5614171, 0xe0ce175e, 0xa13d145b, 0xe4924274, 0x64a0f4d9, 0x210fa2f6, 0x60fca1f3, 0x2553f7dc, +0xc53013ad, 0x809f4582, 0xc16c4687, 0x84c310a8, 0x7d5c4bc8, 0x38f31de7, 0x79001ee2, 0x3caf48cd, 0xdcccacbc, 0x9963fa93, 0xd890f996, 0x9d3fafb9, 0x1d0d1914, 0x58a24f3b, 0x19514c3e, 0x5cfe1a11, 0xbc9dfe60, 0xf932a84f, 0xb8c1ab4a, 0xfd6efd65, +0x2ad6aa50, 0x6f79fc7f, 0x2e8aff7a, 0x6b25a955, 0x8b464d24, 0xcee91b0b, 0x8f1a180e, 0xcab54e21, 0x4a87f88c, 0x0f28aea3, 0x4edbada6, 0x0b74fb89, 0xeb171ff8, 0xaeb849d7, 0xef4b4ad2, 0xaae41cfd, 0x2e270c55, 0x6b885a7a, 0x2a7b597f, 0x6fd40f50, +0x8fb7eb21, 0xca18bd0e, 0x8bebbe0b, 0xce44e824, 0x4e765e89, 0x0bd908a6, 0x4a2a0ba3, 0x0f855d8c, 0xefe6b9fd, 0xaa49efd2, 0xebbaecd7, 0xae15baf8, 0x79adedcd, 0x3c02bbe2, 0x7df1b8e7, 0x385eeec8, 0xd83d0ab9, 0x9d925c96, 0xdc615f93, 0x99ce09bc, +0x19fcbf11, 0x5c53e93e, 0x1da0ea3b, 0x580fbc14, 0xb86c5865, 0xfdc30e4a, 0xbc300d4f, 0xf99f5b60, 0x89abd0f3, 0xcc0486dc, 0x8df785d9, 0xc858d3f6, 0x283b3787, 0x6d9461a8, 0x2c6762ad, 0x69c83482, 0xe9fa822f, 0xac55d400, 0xeda6d705, 0xa809812a, +0x486a655b, 0x0dc53374, 0x4c363071, 0x0999665e, 0xde21316b, 0x9b8e6744, 0xda7d6441, 0x9fd2326e, 0x7fb1d61f, 0x3a1e8030, 0x7bed8335, 0x3e42d51a, 0xbe7063b7, 0xfbdf3598, 0xba2c369d, 0xff8360b2, 0x1fe084c3, 0x5a4fd2ec, 0x1bbcd1e9, 0x5e1387c6, +0xdad0976e, 0x9f7fc141, 0xde8cc244, 0x9b23946b, 0x7b40701a, 0x3eef2635, 0x7f1c2530, 0x3ab3731f, 0xba81c5b2, 0xff2e939d, 0xbedd9098, 0xfb72c6b7, 0x1b1122c6, 0x5ebe74e9, 0x1f4d77ec, 0x5ae221c3, 0x8d5a76f6, 0xc8f520d9, 0x890623dc, 0xcca975f3, +0x2cca9182, 0x6965c7ad, 0x2896c4a8, 0x6d399287, 0xed0b242a, 0xa8a47205, 0xe9577100, 0xacf8272f, 0x4c9bc35e, 0x09349571, 0x48c79674, 0x0d68c05b, 0xf4f79b3b, 0xb158cd14, 0xf0abce11, 0xb504983e, 0x55677c4f, 0x10c82a60, 0x513b2965, 0x14947f4a, +0x94a6c9e7, 0xd1099fc8, 0x90fa9ccd, 0xd555cae2, 0x35362e93, 0x709978bc, 0x316a7bb9, 0x74c52d96, 0xa37d7aa3, 0xe6d22c8c, 0xa7212f89, 0xe28e79a6, 0x02ed9dd7, 0x4742cbf8, 0x06b1c8fd, 0x431e9ed2, 0xc32c287f, 0x86837e50, 0xc7707d55, 0x82df2b7a, +0x62bccf0b, 0x27139924, 0x66e09a21, 0x234fcc0e, 0xa78cdca6, 0xe2238a89, 0xa3d0898c, 0xe67fdfa3, 0x061c3bd2, 0x43b36dfd, 0x02406ef8, 0x47ef38d7, 0xc7dd8e7a, 0x8272d855, 0xc381db50, 0x862e8d7f, 0x664d690e, 0x23e23f21, 0x62113c24, 0x27be6a0b, +0xf0063d3e, 0xb5a96b11, 0xf45a6814, 0xb1f53e3b, 0x5196da4a, 0x14398c65, 0x55ca8f60, 0x1065d94f, 0x90576fe2, 0xd5f839cd, 0x940b3ac8, 0xd1a46ce7, 0x31c78896, 0x7468deb9, 0x359bddbc, 0x70348b93, ] + +d0x6a0c51a8=[ 0x16176a34, 0xdc0247cf, 0x726b34d1, 0xa5a9384c, 0x3274641d, 0x4a59d7b2, 0xdc060a3e, 0xd7c20c9d, 0xe86d81f2, 0x86531598, 0x0c5d255e, 0x25e5c205, 0x63e57d18, 0x7fb49052, 0x68217bbb, 0x24630e29, 0x0bc04b52, 0x29b8e75b, 0xc64c4554, 0xe3a98751, +0xd1dde34c, 0xb23cd3a5, 0x346fc63d, 0x6267fcc5, 0xf3a54f45, 0xcb97ac26, 0xcd8843f7, 0x4bdf1b9e, 0x118e49c9, 0x804cfa49, 0x4c427592, 0x0a42ca8f, 0xe5b66880, 0xf5beed65, 0x75f2172c, 0xb4233c74, 0x6825364a, 0x4604f2ec, 0x2278ac09, 0xf43c6cb8, +0xc053aa85, 0x87d5d9b4, 0x283e2b77, 0xa8769ccf, 0x4a5d9a43, 0x25e18ff4, 0x0ddbe972, 0x8048b7b8, 0xda1da81e, 0xf5baa094, 0x2fa3457b, 0xa42ff460, 0xcd8c0e06, 0x2e21c4a6, 0xa9f41d12, 0x5dcc3c5b, 0xb3ba1f89, 0xb9fc98f7, 0x4600bf1d, 0xc1d12b58, +0x65fedf38, 0xf4382149, 0x283a6686, 0x33f6e5c0, 0xdd848be3, 0x401b1d3d, 0x23fa2dd4, 0x3e2d0cb2, 0x39b062be, 0xc057e774, 0xa3b29a6c, 0x6e3ad99b, 0xa42bb991, 0xd644c0b1, 0x965fdd8c, 0x79af3272, 0xf2238369, 0x69a7b797, 0x1c55a0bb, 0xbe65bb0a, +0x401f50cc, 0xf8650417, 0x2fa7088a, 0x91c6fe71, 0x061fefd1, 0x3836ae92, 0x9040325d, 0x647c5ee5, 0xdd80c612, 0x782db3af, 0x501398d8, 0xae6d3eef, 0x1bc8ceb7, 0x7fb0dda3, 0x91c2b380, 0xe869cc03, 0xf86149e6, 0x246743d8, 0xb5a1bda9, 0x8d97133b, +0x161327c5, 0x29bcaaaa, 0x97dd5c51, 0x9a02f8d2, 0xb2389e54, 0x87d19445, 0x8b88fcea, 0x965b907d, 0xcc0e8fdb, 0x64781314, 0x63e130e9, 0x0bc406a3, 0x1795ebe9, 0x56083af8, 0xd6408d40, 0x33f2a831, 0xa9f050e3, 0xe430a4ac, 0x1dd72166, 0x419dd111, +0xbe61f6fb, 0xcc0ac22a, 0x7474db00, 0x1791a618, 0x8c11df17, 0x81ca3665, 0xee726e23, 0xc7cec489, 0xc7ca8978, 0x4dc0f44f, 0x6fbc15b7, 0x7e36118f, 0x100885e5, 0x9a06b523, 0x3832e363, 0xd05f6291, 0xe3adcaa0, 0x5c4af077, 0x5c4ebd86, 0xe9eb4dde, +0x079d6e0c, 0x100cc814, 0x47823ec0, 0xf3a102b4, 0x23fe6025, 0xafefbf32, 0x3fabc09e, 0x39b42f4f, 0x578ef6d4, 0x00000000, 0xcb93e1d7, 0x9d9f96de, 0xc64808a5, 0xe5b22571, 0xfe7aebc6, 0x4bdb566f, 0xeff0effe, 0xca11600a, 0xdb9b6432, 0x726f7920, +0x8d935eca, 0xf9e3c83b, 0x90447fac, 0x9b8434fe, 0xe434e95d, 0xd1d9aebd, 0xfffc27ea, 0xa5ad75bd, 0x79ab7f83, 0x9d9bdb2f, 0x9c1d1703, 0x5bd3d38a, 0x079923fd, 0xa872d13e, 0x4c463863, 0x2e258957, 0xeff4a20f, 0x81ce7b94, 0x35e90a11, 0x5017d529, +0x9b80790f, 0x5dc871aa, 0x0186cc2c, 0x35ed47e0, 0x0ddfa483, 0x5a551fa6, 0xf9e785ca, 0x061ba220, 0x578abb25, 0xb3be5278, 0x747096f1, 0x6263b134, 0xd05b2f60, 0x018281dd, 0x1c51ed4a, 0x346b8bcc, 0x1a4a4f6a, 0xb9f8d506, 0xc1d566a9, 0xa2301bb1, +0xd7c6416c, 0xbfe73ad7, 0x7e325c7e, 0x97d911a0, 0x41999ce0, 0xbfe37726, 0x6e3e946a, 0x3faf8d6f, 0x9c195af2, 0x86575869, 0x8b8cb11b, 0x8a0a7d37, 0xafebf2c3, 0x73e9b50c, 0x560c7709, 0xb5a5f058, 0xa3b6d79d, 0xca152dfb, 0xda19e5ef, 0x5bd79e7b, +0xa2345640, 0x6fb85846, 0xb87e192a, 0x0a46877e, 0x00044df1, 0x47867331, 0x5a515257, 0x8a0e30c6, 0x8c1592e6, 0x3e294143, 0x519554f4, 0x1a4e029b, 0x75f65add, 0x51911905, 0x1bcc8346, 0x0c5968af, 0xf227ce98, 0xe9ef002f, 0xb4277185, 0x227ce1f8, +0xee7623d2, 0x73edf8fd, 0x4dc4b9be, 0xb87a54db, 0x65fa92c9, 0xfff86a1b, 0x7829fe5e, 0x1dd36c97, 0x118a0438, 0x69a3fa66, 0xe22b068c, 0xe22f4b7d, 0x327029ec, 0xfe7ea637, 0xae69731e, 0xdb9f29c3, 0x368b4d56, 0x94649b2f, 0x390ab835, 0xad98edd7, +0x0727ea7b, 0x3b87cb87, 0x6ac00a0a, 0xb046414b, 0x59171058, 0x91ce02e6, 0x961f2650, 0x7fb8b98e, 0x93437154, 0xb761ab30, 0x4e141ea3, 0xf9837b5e, 0xa21918b4, 0x4933f4d8, 0xb51a164f, 0x4c996d11, 0x5c4b475c, 0xeb2aec6c, 0xda864b41, 0xc8d912be, +0x56602bf6, 0x5ec634ee, 0xc5235aa2, 0x31aca72d, 0x8c10ae7a, 0x83915b19, 0x2422da64, 0x9b13a081, 0x028d73b2, 0x8ce660b7, 0xfe525fe8, 0x17030efb, 0xb2cb32f9, 0x2e09b6ce, 0x3e2d524e, 0x4c6fa3dc, 0x2b55e1ca, 0x811c28ab, 0xba6d2de1, 0x93b5bf99, +0x1882fb98, 0xa7454fb0, 0x0850d1d5, 0x6d112ebc, 0x2c720bb1, 0x0f81f563, 0x9e4ff785, 0x6290dbdf, 0xdda1a13a, 0x4b4849a7, 0x684d79b8, 0xf4793342, 0x292e5cb5, 0x367d839b, 0xf6028e3d, 0x5696e53b, 0x00000000, 0xfea49125, 0x2305301f, 0x533c7cf2, +0x5e30fa23, 0x53cab23f, 0xd2205459, 0x5b6cad27, 0xebdc22a1, 0xa53ef2cf, 0xb8e05e53, 0x67cc8cdb, 0x59e1de95, 0x158e7d49, 0xbfc7b428, 0xb79765fd, 0xd80b38f3, 0x0adda267, 0xd5f170ef, 0x4bbe876a, 0x3321d49f, 0x29d89278, 0x027bbd7f, 0x17f5c036, +0x771ea696, 0x0a2b6caa, 0xe1f74e0b, 0xb23dfc34, 0xe6d0a470, 0xd05be926, 0xa062a5cb, 0x3edb9c83, 0xec0d0617, 0xe10180c6, 0xfbf8c621, 0x1af946e7, 0x8e6b1305, 0x33d71a52, 0x51b10f40, 0xafe350a8, 0x9be56e4c, 0xf975b593, 0x43189872, 0x1d286251, +0x8e9dddc8, 0x1ddeac9c, 0xbf317ae5, 0x75651be9, 0x2eff7803, 0xc07f0da6, 0x601da86d, 0x218843ad, 0xc82fdc73, 0xfb0e08ec, 0x2c84c57c, 0x7ae4ee8a, 0x863bc2d0, 0x7593d524, 0x72b43f5f, 0xb5ecd882, 0x6de7e071, 0xb816909e, 0xaa49c961, 0x315a69e0, +0xf35ed939, 0x3ca021fc, 0xe9515113, 0x70394ced, 0xe37a3db9, 0xba9be32c, 0x12a99732, 0xdfda1c45, 0x96e9e89d, 0x055c5704, 0xcd738b77, 0x5cbd8991, 0x9eb93948, 0x39fc76f8, 0x7242f192, 0x4644cf76, 0xd77c035d, 0xa832741e, 0x1024e480, 0xad6e231a, +0x3b71054a, 0x49c53a15, 0x34063ee4, 0xc2f27e14, 0x05aa99c9, 0xf48ffd8f, 0x9138cc2b, 0xca54610c, 0x8b374401, 0x6f6a93c3, 0xc089c36b, 0xf1d3aa8b, 0x7f4e7743, 0xf3a817f4, 0x999ed333, 0x9c344afa, 0x78699d38, 0x6541ff69, 0x836795d4, 0xc7ae2910, +0x34f0f029, 0x4195ebc0, 0x18743555, 0xbdbc0957, 0xcffef8c5, 0x07d124b6, 0x5b9a63ea, 0x7dc304f1, 0x10d22a4d, 0x1fa511e3, 0x2659671b, 0xda70858c, 0x46b201bb, 0x2ba32f07, 0x8bc18acc, 0xe6266abd, 0xd8fdf63e, 0x3c56ef31, 0x673a4216, 0xa5c83c02, +0x44c9bcc4, 0xe9a79fde, 0x99681dfe, 0x1a0f882a, 0xd2d69a94, 0x86cd0c1d, 0xcf083608, 0xaabf07ac, 0xf6f440f0, 0xc758e7dd, 0xdf2cd288, 0x24d414a9, 0x6f9c5d0e, 0x7d35ca3c, 0xfc29e297, 0x541b9689, 0x0dfa481c, 0xd78acd90, 0x84407faf, 0xfcdf2c5a, +0x5147c18d, 0x125f59ff, 0x0d0c86d1, 0x443f7209, 0x68bbb775, 0x1578b384, 0x9cc28437, 0xdd576ff7, 0x43ee56bf, 0x1f53df2e, 0x949255e2, 0xc5d5946f, 0x65b731a4, 0x894cf97e, 0x84b6b162, 0xa8c4bad3, 0xa2efd679, 0x89ba37b3, 0xecfbc8da, 0xee76bb68, +0xbd4ac79a, 0xd507be22, 0x81eae666, 0xcaa2afc1, 0x26afa9d6, 0xb0b08f86, 0x00f6cecd, 0x60eb66a0, 0x77e8685b, 0x54ed5844, 0xcd8545ba, 0x23f3fed2, 0xaf159e65, 0xe38cf374, 0x08a61f18, 0xee8075a5, 0x0f773bae, 0x4163250d, 0xa7b3817d, 0xd0ad27eb, +0x217e8d60, 0x4ee2d06e, 0x70cf8220, 0xe4ab190f, 0xc204b0d9, 0x62661512, 0xf1256446, 0xe45dd7c2, 0x789f53f5, 0xa0946b06, 0x7a122047, 0x6a36c4c7, 0xfe79a9ee, 0x760a658c, 0xb9cb992f, 0xa904e4a6, 0x3ce1feeb, 0x3e07f5a6, 0x64231348, 0x88c2e178, +0x86754183, 0xd3ee0786, 0x7904e87d, 0xcec9fcb3, 0xfc9fa2a3, 0x97b23c1a, 0x8b9dc73f, 0x97031100, 0x76bb4896, 0xb67439c4, 0x0de886bc, 0xe25652cb, 0xbb2d9262, 0xdeb7ac20, 0xdd59a77d, 0x3f0ff5b6, 0x5b2ce6fe, 0xfd97a2b3, 0xb4923289, 0xcd96daf4, +0x677c350f, 0xcfc1fca3, 0xd2e60796, 0xece1f230, 0x58c2eda3, 0x035f2647, 0xede9f220, 0xff71a9fe, 0xc2985705, 0xe0b05986, 0xf177241f, 0x1e78dd72, 0x945c3747, 0x12985bde, 0xcc2ff7fe, 0x84934ace, 0x577d4d48, 0x4aeb9b67, 0xb7cd14ce, 0x8a24ea35, +0x67cd1815, 0x64923e52, 0x02e60b4d, 0xc1c77142, 0x94ed1a5d, 0x33ef731a, 0xe001749c, 0x6a259ea9, 0x652b1358, 0x3fbed8ac, 0xf3912f52, 0x00b12d1a, 0x780ce86d, 0xeeb6d467, 0x1f70dd62, 0x1fc1f078, 0x1c2ffb25, 0xb872b425, 0xa7b3445d, 0x6674351f, +0xabe2efeb, 0xc07e5c48, 0x22280e83, 0x86c46c99, 0x9be397ac, 0x2ec8882f, 0x559b4605, 0xb4231f93, 0x2c9fae78, 0xc0cf7152, 0xdfbfac30, 0xd0b121c1, 0x99059ce1, 0xab53c2f1, 0xf07f240f, 0x7be2e330, 0xffc084e4, 0x78bdc577, 0xf0ce0915, 0x7702659c, +0xdde88a67, 0x95e51a4d, 0x75e46ed1, 0x77b34886, 0xcd27f7ee, 0xc3217a0f, 0xbb9cbf78, 0x32e7730a, 0x3eb6d8bc, 0xb59a3299, 0x87cc6c89, 0x59caedb3, 0x4905903a, 0x10cf7d89, 0x107e5093, 0x57cc6052, 0x01080010, 0xf2992f42, 0x7b53ce2a, 0x960b1110, +0xa4ec621a, 0x79b5c567, 0xc1765c58, 0x9a5abaa6, 0x6872b8fe, 0xed58df3a, 0x49b4bd20, 0x697ab8ee, 0x132176d4, 0x1ec9f068, 0x980d9cf1, 0x207f28d4, 0xaaeaeffb, 0xb52b1f83, 0x8873cc62, 0xefbed477, 0xa5554f10, 0x3de9fefb, 0x3c50d3f1, 0x68c395e4, +0x31b8554d, 0x00000000, 0x44ed1686, 0x877d4193, 0x23912389, 0x22992399, 0x56754d58, 0x4a5ab67d, 0x897bcc72, 0xb6c514de, 0xe3ef7fc1, 0x0e068de1, 0xb77c39d4, 0x47b230c1, 0xdc51a76d, 0x445c3b9c, 0xa7026947, 0xba259272, 0x6b2d9eb9, 0x0c51abb6, +0x45543b8c, 0x8b2cea25, 0x5a95cbf4, 0x0fbfa0eb, 0xee07f97d, 0x745d43db, 0x45e51696, 0x2fc0883f, 0x5b9dcbe4, 0xde06813a, 0x0d59aba6, 0x460b1dcb, 0x9b52bab6, 0x2c2e8362, 0x217728c4, 0x4be39b77, 0x5a24e6ee, 0x21c605de, 0x98bcb1eb, 0x0ce086ac, +0xe2e77fd1, 0x842267d4, 0x122976c4, 0x7a5bce3a, 0x20ce05ce, 0xc2297a1f, 0x32565e10, 0xcf70d1b9, 0x66c51805, 0x2d268372, 0xfd268fa9, 0xec50df2a, 0xf3200248, 0xe109748c, 0x74ec6ec1, 0x480d902a, 0x3d58d3e1, 0xcc9edae4, 0xaa5bc2e1, 0xd0000cdb, +0xe1b85996, 0x54226b0f, 0x755543cb, 0xe35e52db, 0xf1c60905, 0x2f71a525, 0xc3905715, 0x4b52b66d, 0xa60a6957, 0x1c9ed63f, 0xef0ff96d, 0xce78d1a9, 0xd1080ccb, 0x89cae168, 0xb8c3993f, 0x1d96d62f, 0x23200e93, 0x659a3e42, 0x11c77d99, 0x30017847, +0x69cb95f4, 0x99b4b1fb, 0x597bc0a9, 0x02572657, 0xdf0e812a, 0xf2280258, 0xa6bb444d, 0x6a94b3b3, 0x8a95c72f, 0x56c46042, 0xa8bdc9ac, 0x852a67c4, 0x31097857, 0x859b4ade, 0xdce08a77, 0x9aeb97bc, 0x47031ddb, 0x2e79a535, 0x13905bce, 0x54934615, +0xa80ce4b6, 0xfc2e8fb9, 0x5873c0b9, 0x6b9cb3a3, 0xa5e4620a, 0x0f0e8df1, 0x03ee0b5d, 0x30b0555d, 0x552a6b1f, 0x46ba30d1, 0x7aeae320, 0xa9b5c9bc, 0xd2572a8c, 0xa45d4f00, 0xfec884f4, 0xba94bf68, 0xd35f2a9c, 0x96ba3c0a, 0x11765083, 0x1d27fb35, +0x0eb7a0fb, 0x95543757, 0xb97ab435, 0xd1b921d1, 0x335e5e00, 0x2d97ae68, 0x48bcbd30, 0x01b92d0a, 0xf0d72237, 0x1676a148, 0x337c67ed, 0x34abf968, 0xeeb94f3f, 0x03ede04a, 0x566c01d3, 0x612a18f1, 0x9cb014b1, 0x2130b86a, 0x14f4ddfa, 0x72095b8e, +0x75dec50b, 0x9ddf8849, 0xb4f7fc63, 0xc7913b15, 0x647ffac6, 0xe54c6335, 0x1f01f1f0, 0xfcf590b8, 0xcf89f755, 0x7893eb7c, 0x9b678a34, 0x043a7ecf, 0x39e6d71f, 0x57039d2b, 0x82de79b9, 0xd08806a5, 0xe0198102, 0xbf02d069, 0xb67580d1, 0xf4ed5cf8, +0xd63004d8, 0x50d403ae, 0xb598609b, 0xa7d4bf1c, 0x5d992dd9, 0xe3f46148, 0xf66f204a, 0x1cec11ba, 0xd75f9820, 0xac219316, 0x17193db0, 0xe8014d42, 0x4c381214, 0x59a35316, 0x6adf34fb, 0x0818cc40, 0xad4e0fee, 0x5581e199, 0x9a0816cc, 0xb1a21e54, +0x3a0b3755, 0xc47cdb5f, 0xfe77ec0a, 0x47cd3e1e, 0x83b1e541, 0x362985da, 0x685d4849, 0x52567f1c, 0xafcc735c, 0xb8d54eec, 0xb0cd82ac, 0xc6fea7ed, 0x41753c63, 0x2928742a, 0xfd9a0c40, 0x18d66f75, 0xba57325e, 0x86e40776, 0x5cf6b121, 0x0c22b28f, +0xc51347a7, 0xbd80acdb, 0x02827cb2, 0x708b273c, 0x124cdf87, 0xebecad08, 0x2788ba17, 0xe96ed1ba, 0x2847e8d2, 0x3b64abad, 0x6d08aa7e, 0x2effeaaf, 0x51bb9f56, 0x9e326803, 0xfb220e3d, 0x00000000, 0x7366c776, 0xbe6d4c91, 0xc931f528, 0x11a13fcd, +0x0d4d2e77, 0x8509e73c, 0x1b3b8f3f, 0x6510663e, 0x06b8027d, 0x38894be7, 0x775cb9b9, 0xe1761dfa, 0xf2555e85, 0x24655a5d, 0x9092a63e, 0x07d79e85, 0xaa99916b, 0xe29bfdb0, 0x0ea0ce3d, 0x2baa0898, 0x99e5f686, 0xf582c000, 0x9210da8c, 0x097750b8, +0x22dd5820, 0x6932d4b1, 0xaea3efa4, 0x6ee54a34, 0x813399f3, 0x974538bb, 0x8d112b7c, 0x4420de54, 0x54ee7d61, 0xa6bb23e4, 0x2d120ae5, 0x63a86443, 0x962aa443, 0x6c673686, 0x4eba6ea6, 0xde28c898, 0xd890cae5, 0xa9747121, 0x1e6e6d08, 0x805c050b, +0x37461922, 0xc046a590, 0x8efccb36, 0xda12b657, 0xa0032199, 0xbb38aea6, 0xa556c3ae, 0x205f2492, 0x454f42ac, 0x46a2a2e6, 0xdf475460, 0xe7ce1f87, 0xc1293968, 0x3213fb15, 0x35c46590, 0x60458409, 0xb32062e6, 0x7f4475f9, 0x1323437f, 0x0fcf52c5, +0xdcaab42a, 0x1a5413c7, 0xabf60d93, 0x8f9357ce, 0x878b9b8e, 0x892b55b3, 0x62c7f8bb, 0xa81bedd9, 0xcd0b8be7, 0xc2c4d922, 0xd5dde492, 0xff1870f2, 0x94a8d8f1, 0xb9bad214, 0xfa4d92c5, 0x67921a8c, 0xd1e79a5d, 0x159b4102, 0x5f1b516b, 0x7dc6094b, +0x58cccfee, 0x8ba92901, 0x76332541, 0xcadc1562, 0x95c74409, 0x84667bc4, 0x7b7e0b36, 0x7a1197ce, 0x71e4bbc4, 0x016f9cf8, 0x3ddca9d0, 0x250ac6a5, 0x23b2c4d8, 0xcee66bad, 0xf33ac27d, 0xc3ab45da, 0x2f907657, 0x48026cdb, 0x43f740d1, 0xdb7d2aaf, +0x309187a7, 0x91fd3ac6, 0x4fd5f25e, 0x9f5df4fb, 0x2ac59460, 0xa16cbd61, 0x0555e237, 0x8ac6b5f9, 0x19b9f38d, 0xcbb3899a, 0x3cb33528, 0x496df023, 0x66fd8674, 0x4a801069, 0xed54af75, 0x1d838d42, 0x7ca995b3, 0xb71a1c29, 0x3e31499a, 0xd20a7a17, +0xa3eec1d3, 0xd9ff561d, 0xb24ffe1e, 0xea8331f0, 0xf700bcb2, 0x0bf52c0a, 0x5e74cd93, 0xe423ffcd, 0x2c7d961d, 0x0a9ab0f2, 0xddc528d2, 0x5a4eb35c, 0xa2815d2b, 0xf9a0728f, 0xa4395f56, 0xf8cfee77, 0xec3b338d, 0xcc64171f, 0xd365e6ef, 0x937f4674, +0x5339e3e4, 0xbcef3023, 0x6f8ad6cc, 0xc85e69d0, 0x988a6a7e, 0xefd6d3c7, 0x3f5ed562, 0x7e2be901, 0x74b159f3, 0x10cea335, 0x8c7eb784, 0x4d578eec, 0x8844c94b, 0xf1b8becf, 0x4298dc29, 0x401aa09b, 0x26e726ef, 0x5b212fa4, 0x6bb0a803, 0xd4b2786a, +0xe6a1837f, 0x31fe1b5f, 0x4bef8c91, 0x79fc7784, 0xfdc536ca, 0xa7b87ca9, 0xd9f24539, 0xc2cff140, 0x14c54f9d, 0x041f597d, 0x3a5902f7, 0xfcf37bd0, 0x5b4b0779, 0xa90c1b4d, 0x6eeafe6a, 0xf9a0bead, 0x4aa75c83, 0xec53bc2a, 0xf896f3b7, 0x3e465b8a, +0xa7c2adb3, 0x4b911199, 0x838f0f5a, 0x70fe5e74, 0x10da16e0, 0x974a40c7, 0xcd370aa4, 0xf371512e, 0x2af9c50d, 0xe3ab47ce, 0xd26f36ba, 0xcc0147be, 0xc6d0a83d, 0x7e4a3990, 0x5a079b79, 0x7e30e88a, 0x4eb805fe, 0x244da2e9, 0x01364d1a, 0xc2b5205a, +0xc79c343d, 0xd323aaba, 0x05291467, 0xd9889423, 0x1b476563, 0x60244894, 0x7a5560ed, 0x7f06a590, 0x86dcca27, 0xb62ef649, 0x007ad11a, 0x2052fb94, 0xdd97cd5e, 0x921985ba, 0x400c621a, 0x243773f3, 0x15f30287, 0x51e039e0, 0x2a831417, 0xe97aa84d, +0xc864cfd9, 0x4add8d99, 0xe3d196d4, 0x4140fe1a, 0xfc89aaca, 0x71b2c274, 0x00000000, 0xd60abedd, 0x0eb467e4, 0xf76e0853, 0x54b3fc9d, 0xe9007957, 0x1a712879, 0x31c47174, 0x6bc3ea0d, 0xb9d60dad, 0x20282a8e, 0xa6f4e0a9, 0xf6584549, 0x257beff3, +0xac5fde30, 0x71c8136e, 0x11ec5bfa, 0x87ea873d, 0x9984f639, 0xbcff19ca, 0xe29d0ad4, 0x7b632df7, 0x749bd613, 0x9d9baf44, 0xb7626a49, 0x1f583c1e, 0x1a0bf963, 0x5f2e8f1e, 0x4ec2d4e4, 0x973091dd, 0x75d74a13, 0x99fe2723, 0xc92853d9, 0xec296d30, +0x70848f6e, 0x3e3c8a90, 0xc3836d40, 0x7a2fb1f7, 0x6fa6626a, 0x3b159ef7, 0xe6f882b3, 0x74e10709, 0xb89a91ad, 0x2ee69c70, 0x5b31d663, 0xa3a725d4, 0x932fc8a0, 0xfdbfe7d0, 0x413a2f00, 0x892431c3, 0xd8bed939, 0x0ad1ef83, 0x0ff8fbe4, 0xed65f130, +0x8c0d25a4, 0x3f701690, 0x455fa767, 0xb6542753, 0x0553c57d, 0x7b19fced, 0x2e9c4d6a, 0x82c3935a, 0x6af5a717, 0x8d3b68be, 0x6bb93b17, 0xc6aa7927, 0x1f22ed04, 0xb307e22e, 0x75ad9b09, 0x83f5de40, 0xac250f2a, 0x5585b187, 0xc3f9bc5a, 0xa3ddf4ce, +0x14bf9e87, 0xcc7b96a4, 0x4525767d, 0x65778de9, 0x1e14a01e, 0x3f0ac78a, 0xad69932a, 0x9cd73344, 0xd8c40823, 0x88127cd9, 0x6441c0f3, 0xe84ce557, 0x6112058e, 0x967c0ddd, 0x3b6f4fed, 0xc95282c3, 0x11968ae0, 0x6a8f760d, 0x605e998e, 0x2faa0070, +0x7f7c748a, 0x44133b67, 0x31bea06e, 0xf30b8034, 0xe68253a9, 0x2bcf8817, 0x0be7a299, 0x30f23c6e, 0x98c86a39, 0xb9acdcb7, 0x4076b300, 0x6e902f70, 0x6fdcb370, 0x3088ed74, 0xad134230, 0xa2ebb9d4, 0x5f545e04, 0x8868adc3, 0x86a61b3d, 0x3a23d3ed, +0xf8ec22ad, 0xd6706fc7, 0x54c92d87, 0xe2e7dbce, 0xa976ca57, 0x2164b68e, 0x895ee0d9, 0x5e18c204, 0xe7cecfa9, 0x014c9c00, 0xcd4ddbbe, 0xf2471c34, 0x35a1f913, 0x9de17e5e, 0x9606dcc7, 0xdded1c44, 0x2bb5590d, 0x5e62131e, 0x50d674fa, 0xb37d3334, +0xd73cf3c7, 0x4bebc083, 0xb718bb53, 0xa83a5657, 0xdcdb515e, 0x4f8e48e4, 0xbdb385ca, 0x35db2809, 0x25013ee9, 0x55ff609d, 0xe836344d, 0x87905627, 0xdca18044, 0xb231af34, 0x8d41b9a4, 0xbdc954d0, 0x5a7d4a63, 0xb24b7e2e, 0xf714d949, 0xa29168ce, +0x4469ea7d, 0x04658867, 0xa840874d, 0xf9da6fb7, 0x519ae8fa, 0x50aca5e0, 0x1b3db479, 0x6168d494, 0xe7b41eb3, 0x0eceb6fe, 0x211e6794, 0x34ed6513, 0x98b2bb23, 0x0b9d7383, 0xc7e6e527, 0x9cade25e, 0x3497b409, 0x643b11e9, 0x2fd0d16a, 0xd3597ba0, +0x1e6e7104, 0xc81e1ec3, 0xa68e31b3, 0xed1f202a, 0xb8e040b7, 0x0f822afe, 0xbc85c8d0, 0xf6229453, 0x1589d39d, 0xd74622dd, 0x650d5cf3, 0xd215e7a0, 0xf23dcd2e, 0x4ff499fe, 0x10a0c7fa, 0x0aab3e99, 0x926354a0, 0x8c77f4be, 0x935519ba, 0x82b94240, +0x3fa7a6c9, 0x8edeb3dd, 0xc1c930a7, 0x584404fa, 0xab3d1f85, 0x7dff6825, 0x998d345d, 0xcc867d31, 0x8c980348, 0x1a1cca16, 0x569abc3d, 0x2aea515b, 0x43d74baf, 0x4f17837a, 0x7e365df3, 0x32e8eb5f, 0xa5e3a742, 0xcf4f48e7, 0x7c70ed66, 0x7c282de1, +0x41c93bbd, 0x8391fe4b, 0x693d1af4, 0x67bb62b4, 0xb3676506, 0x72f69526, 0xffe1132d, 0xfe6e966e, 0x0cc0c8d5, 0x7da7a8a2, 0x72ae55a1, 0x33676e1c, 0xf2f69e3c, 0xd69ab727, 0x94c279cb, 0x01d745c4, 0x4046befe, 0xe8ea542a, 0x5993413e, 0x70e8e534, +0x26725909, 0xc2000571, 0x32b02bd8, 0xb33fa581, 0x42000e6b, 0x9b93444f, 0x818f8e59, 0x198d3f47, 0x16dc02c3, 0xe7e3a929, 0x8f51369e, 0x4258ceec, 0xa6725213, 0x5bd5f1ab, 0x555389eb, 0x297ba40a, 0x95153c0f, 0xa7fdd750, 0x4e980639, 0xda5a7ff2, +0x021e7012, 0xd50b4276, 0x1a440a91, 0xf0e8ee2e, 0x0058c087, 0x3de1165c, 0x64725762, 0x3e70e30d, 0x4ec0c6be, 0x8f09f619, 0x9802b11e, 0xd7153264, 0x666c2770, 0x7fe11837, 0x6af42f22, 0xa434e286, 0xaaea5a41, 0xfdff633f, 0x5a5a74e8, 0xa9236f97, +0xb0f69057, 0x03c935d6, 0x0f513d84, 0xe7bb69ae, 0x6b236ae6, 0xa7a517d7, 0x28f42149, 0x821e7b08, 0xeaace4bf, 0x30ae5bca, 0x56c27cba, 0x7321d0e2, 0xd74df2e3, 0x0c980852, 0xda02bf75, 0x65fdd221, 0x4cdeb6ac, 0xc01e7563, 0x2b3d149f, 0x5b8d312c, +0xbdb9ddc1, 0x2ab291dc, 0x3c365398, 0x97538c9a, 0x17538780, 0xeb2361fc, 0xa5bb67c5, 0xc046b5e4, 0xb121d593, 0x0391f551, 0x1b934f55, 0x59cb81b9, 0xd9934a24, 0xd4dc07b2, 0xaab29ac6, 0x81d74ede, 0x7fb9d8b0, 0x31791e0e, 0xe965d169, 0xfda7a3b8, +0x401e7e79, 0x28ace1ce, 0xc258c5f6, 0xc191f020, 0xcec0cda4, 0x5484cc2f, 0x713fa0f0, 0x0f09fd03, 0xc38f8032, 0x14c272d1, 0x262a998e, 0x0edeb8c7, 0xfe3656e9, 0x99d5f4da, 0x333fae9b, 0x1684c244, 0x8d4f468c, 0x550b496c, 0x970b4c1d, 0x30f69b4d, +0xeaf42438, 0xe8b294ad, 0x0d4f4d96, 0xd9cb8aa3, 0xeb7ba17b, 0xf3791b7f, 0x6b7baa61, 0xb2b020c2, 0xf0b02ea9, 0x1802ba04, 0x25bb6cdf, 0xd8440fe0, 0x54dc0ca8, 0x4f4f43fd, 0xbe282890, 0x3db9d6db, 0x4d5133ef, 0xa8f42a53, 0x0246b095, 0xcd5138f5, +0xbfff6d54, 0x71676077, 0x1bcb8fd2, 0x80000b1a, 0xa97baf10, 0xa62a9294, 0xd81ccf67, 0x8e86735a, 0xdbd5fab1, 0x170b4707, 0xb2e8e045, 0xd6c277a0, 0x65a512a6, 0x9684c95e, 0x27a51ccd, 0xf13fabea, 0x25e3ac58, 0xe5a519bc, 0xb0ae50d0, 0x149ab256, +0xdb8d3a36, 0x70b025b3, 0x8cc0c3cf, 0xbfa7add3, 0x581cc47d, 0xffb9d3aa, 0x3c6e931f, 0x68ea5f30, 0x00000000, 0x27fddc4a, 0xfc70e67c, 0x2923648d, 0x73791065, 0x15153715, 0x3e28238a, 0x0e867840, 0x2434e99c, 0x154df792, 0x0d178d11, 0x6965da73, +0xb1791514, 0x3fff664e, 0xf321dbf8, 0xd484c735, 0x9a44018b, 0x985a7199, 0xfc2826fb, 0x4c86762b, 0x8246bb8f, 0x642a97e5, 0x83c93ecc, 0xbc365882, 0x2b65d418, 0xa46c2201, 0x8058cb9d, 0x954dfc88, 0x7e6e9d74, 0xbde11d46, 0x68b29fb7, 0xe42a9cff, +0xe634eced, 0xbc6e9805, 0x5a02b46f, 0xe66c2c6a, 0xce980d23, 0xbe70e817, 0x96dc09d9, 0x8d17860b, 0xf1676b6d, 0xe5fdd93b, 0x5715397e, 0x246c291b, 0xf2ae5ebb, 0x185a7a83, 0xcf178860, 0xa8acead4, 0x9a1cc10c, 0xc3d740b5, 0xab65df02, 0x438f8b28, +0xe4725c78, 0x6634e7f7, 0x19d5ffc0, 0x4d09f368, 0xe93d11ee, 0x949ab94c, 0x6aacefa5, 0x574df9f9, 0xcd09f872, 0x3121de89, 0xccdebdb6, 0x018f8543, 0x4191fb3a, 0x67e3a233, 0x9bcb84c8, 0xd55382f1, 0x73fab2bc, 0x4d3abbeb, 0xcfd47104, 0xf4cfa759, +0xbbf6dd5d, 0xfa905427, 0xd449a4e6, 0x2b022fcb, 0x9a9215ea, 0x1c45cb07, 0xe7375428, 0x8eb2f87e, 0x90f4f296, 0x2ed9f0c1, 0x4ae2a50e, 0x591a567f, 0x0c5c3291, 0x34a6ee2b, 0x17c1e773, 0xa38a0258, 0x0fbd3876, 0xf72eadbe, 0x48e164e1, 0x92f73379, +0x1fa4c1e0, 0xd9f75d7f, 0xcbed6506, 0xa7b3165a, 0xb1903a21, 0x5afb5c98, 0xe30e402a, 0x88882d93, 0x2ae0e4c3, 0x38fadcba, 0x643b55cf, 0xf52d6c51, 0x5d23427d, 0xf1147853, 0xc7b15797, 0x4b006e06, 0xe6d59f20, 0x63e34b2a, 0x08652693, 0x7da541c2, +0xc5b29678, 0x896ae69b, 0x01e2cb08, 0xd8159677, 0x9b70dee2, 0x71f97353, 0x23670958, 0x40844272, 0x6b866db9, 0xb5a92e23, 0xc18b827a, 0x3af91d55, 0x517f70ec, 0x952f2d9c, 0x13f8f371, 0x6dbcb854, 0xa5b0d7b5, 0xc80c6fe1, 0x65d99ec7, 0x2cda312e, +0xfb729f2f, 0xabef24cb, 0x0e5ff37e, 0x16232c7b, 0x3cc3c8b8, 0x2d38fa26, 0xa9ece524, 0x554664ee, 0x6fbf79bb, 0x9891d405, 0x4cd870e3, 0xb9f51cb2, 0x799c55c0, 0xd391ba03, 0xde2f439a, 0x67da5f28, 0x255ddcb5, 0x329c3bc6, 0x187cdf05, 0xb64824c4, +0x309ffa29, 0x76216db6, 0x6985ac56, 0xdbf49c90, 0xa651dd52, 0xc26a889d, 0xef5272bb, 0x275e1d5a, 0x6a64a6b1, 0xfcaa81ca, 0x9ca8c007, 0xc9eea4e9, 0x07d81ee5, 0xca0fae0e, 0xea89adb1, 0xadd5f126, 0x830c01e7, 0x6e5db2b3, 0xbfcfc95f, 0x121a3879, +0x9116399e, 0x317d3121, 0x96ce277b, 0x6c5e735c, 0xd64a6509, 0xb072f129, 0x82eecaef, 0xddce497d, 0x7b9f942f, 0xf317b9bc, 0x208603bf, 0xb393fbce, 0x810fc008, 0xa80e2e2c, 0xae34fbc1, 0x5f208392, 0xf6cc66b6, 0xa06b08bf, 0xce36ba0c, 0x3d2103b0, +0xcc357be3, 0x2f3b3bc9, 0x7c478aca, 0x24bf17bd, 0xf2f572b4, 0xb7aaefcc, 0x11fb329e, 0x8536d40a, 0x26bcd652, 0x28e3252c, 0xe88a6c5e, 0x972cec73, 0xd070b0e4, 0x3747e4cc, 0xc0694972, 0x3b1bd65d, 0xe53495c7, 0xdc2c8275, 0x509dbbe4, 0x701bb85b, +0xa4521cbd, 0x529e7a0b, 0x7422ac59, 0x2901ee24, 0x787e9ec8, 0xaa0defc3, 0x537cb103, 0xbdcc08b0, 0xd1927bec, 0x0203c1ef, 0x5745a501, 0x9eab01e8, 0xfd484ac2, 0xb27130c6, 0x58f89d77, 0x1b9dd5e2, 0xecb3785c, 0xe0ef4acd, 0x4287839d, 0x0987ed9b, +0x1da7000f, 0x94cde694, 0x9315f871, 0x36a52fc4, 0x04391402, 0xc6539c9f, 0x0b842c74, 0x4f397a04, 0x9f49cae0, 0xed51b354, 0xfea94025, 0x84d41f02, 0xf0f6b35b, 0xda165798, 0x0dbef999, 0x1019f996, 0xba141655, 0xd273710b, 0x15c2269c, 0x8a8bec7c, +0xe4d65ecf, 0x99731f0d, 0x6867675e, 0x8cb13991, 0xbc2ec3b8, 0x9d4a0b0f, 0x5b199790, 0xeb6b66b9, 0xc3884395, 0xf9715ec0, 0x721879b4, 0xafd630c9, 0x56a76e09, 0x7e444b25, 0xe10d81c5, 0x7fa6802d, 0x66389420, 0xe2ec8b22, 0x46be979f, 0x7a7d5f27, +0xdfcd8892, 0xc4505d70, 0xcdd7b0eb, 0x77c3a6be, 0xff4b8b2d, 0x35442523, 0x8f503376, 0x4166897a, 0x03e10ae7, 0x4903afe9, 0x455f9d78, 0x44bd5670, 0x8b692774, 0x00000000, 0xe968a756, 0xbe2d0257, 0xd5ab6fee, 0x4edbb10c, 0x1a7f1eea, 0x05dbdf0a, +0x5cc18975, 0x8d53f299, 0x873515e5, 0x3f22c25f, 0xb44be52b, 0x2164c8b7, 0x62018022, 0x2285c250, 0x0a66e77c, 0x391817b2, 0x063ad5ed, 0xf89395c8, 0x475c5c97, 0x199e140d, 0x54a4afe6, 0x3ec00957, 0x1420ed94, 0x1e460ae8, 0x5ec2489a, 0xb817d7ba, +0x75c06751, 0x61e08ac5, 0x86d7deed, 0x80ed0b00, 0xa189c3b7, 0xa268c950, 0x43654895, 0x337ef0ce, 0x600241cd, 0xeeb0b9b3, 0xac373a2e, 0xd7a8ae01, 0x609b5e8b, 0xe7e7f7e3, 0x8eebee3a, 0x1488b7ea, 0xcd7fe0f1, 0xf86df758, 0x6197495d, 0x8c7e1e39, +0xdb62a718, 0x4e3d0442, 0xc941ad2a, 0xa3d45326, 0xfd5fad55, 0xc34f0dad, 0x571cb921, 0x3a2eed23, 0x2ea65ac9, 0x4f311394, 0x5bb9a47e, 0x76861962, 0x32b5bda7, 0x65a90486, 0x68000e0f, 0x25a4ed98, 0x4da4e397, 0x906df957, 0xddc91ac0, 0xa2d844f0, +0xc84dbafc, 0xcfea10f2, 0x9dc4f3de, 0x6b99e9da, 0xfbf4108d, 0x778a0eb4, 0x673cf485, 0x46a654c6, 0x47aa4310, 0x043e4ddb, 0xb75ce4cc, 0x11baede7, 0x5610aef7, 0xd6cbad91, 0x1921bd63, 0x4ca8f441, 0x132f1de4, 0x51b704f9, 0x690c19d9, 0x8342e4b3, +0x98f6a9d3, 0xa57feefe, 0x81d714b0, 0x2faa4d1f, 0x9b6f4e06, 0x2901f0c7, 0x0295f003, 0x27311d9b, 0x522ee32c, 0xe3d9ba38, 0xade4be7a, 0x3c8550fb, 0x400de91e, 0x9453b48c, 0x751ffeb7, 0x3b22faf5, 0x4b0f5e4f, 0x1f8a00bb, 0x894c4434, 0x24a8fa4e, +0x22034796, 0x7e1d49e6, 0xcee60724, 0xf65d1a04, 0xf5c4fdd1, 0x089b5084, 0x6fa7a401, 0xea4efd6a, 0xda6eb0ce, 0xab4f03a2, 0x1d1ff0b8, 0xa8d6e477, 0xb5c914cf, 0x54855ef4, 0x8670bebe, 0xe9d71abf, 0xffca5d56, 0x0a0ea087, 0x2c33aaca, 0xaa431474, +0xd45e5d92, 0x85e9596b, 0xfc53ba83, 0x7413e961, 0xd2f5e04a, 0x582043ab, 0x1e86176d, 0xb26ebec1, 0x6d325402, 0x5ab5b3a8, 0xde50fd15, 0xbc5e539d, 0xa04db4f3, 0x43940ecb, 0xe6ebe035, 0xf7510dd2, 0xa9daf3a1, 0x3e10a0f8, 0xeb42eabc, 0x280de711, +0x78b6f43e, 0x10b6fa31, 0x0b02b751, 0x9f5103dd, 0x182daab5, 0xe8db0d69, 0x499aae4c, 0x702da4ba, 0x219aa043, 0x955fa35a, 0x884053e2, 0xbbf9f993, 0xf36f4009, 0xa141a325, 0xd16c079f, 0x00000000, 0x2096b795, 0x7d84ae33, 0x64a51350, 0xfaf8075b, +0xd7c7ba47, 0x263d0a4d, 0x2d3fbd1c, 0x5e8bfe73, 0x1711503f, 0x877ca968, 0x3d89472d, 0xef7ca767, 0x5322f4fa, 0x7f115e30, 0xe14c4a3b, 0x96c6448f, 0xb4c50319, 0x4a034999, 0x2b9400c4, 0xede95764, 0xcad84aff, 0x5c1e0e70, 0x9e5d140b, 0xe57207e0, +0xe2d5adee, 0x620eae88, 0xc5e4b075, 0x7a23043d, 0xc7714076, 0x30204da4, 0xa7ea1efd, 0x38bb1d20, 0x6302b95e, 0xd8fb40cd, 0x351217a9, 0x05325a0d, 0x4433a4c5, 0x92f80954, 0xd9f7571b, 0x72b854b9, 0xd0601049, 0x99fabe05, 0xdcc50d16, 0x341e007f, +0x55894922, 0xace8a9ac, 0x2a981712, 0xd5524a44, 0x33b9aa71, 0xf4c8ea07, 0x453fb313, 0xe47e1036, 0x0e30ed5c, 0xc0d6ea78, 0x9a6359d0, 0xc4e8a7a3, 0x0f3cfa8a, 0x79bae3e8, 0x12230a32, 0x1ab85ab6, 0x8d7209ef, 0x09974752, 0x5d1219a6, 0xfec64a80, +0x9cc8e408, 0x592c547d, 0xb362a917, 0x7c88b9e5, 0x7b2f13eb, 0x6630e353, 0x4101fec8, 0x39b70af6, 0x1584a03c, 0x73b4436f, 0x824ef365, 0xb8601e46, 0xb0fb4ec2, 0x84e54ebd, 0xf1fab00a, 0xb96c0990, 0x368bf07c, 0x3787e7aa, 0xece540b2, 0x07a7aa0e, +0x4298191d, 0x8fe7f9ec, 0x8ad5a3e1, 0xd3f9f79c, 0xee70b0b1, 0x010c17d6, 0xbecba39e, 0x1bb44d60, 0xf0f6a7dc, 0x230f5040, 0xae7d59af, 0x4896b99a, 0xcbd45d29, 0x8bd9b437, 0xcc73f727, 0x50bb132f, 0xa6e6092b, 0xbaf5ee45, 0x80db0366, 0x93f41e82, +0xaf714e79, 0x6eabb3d7, 0x97ca5359, 0x6c3e43d4, 0xc67d57a0, 0xe0405ded, 0x0ca51d5f, 0x161d47e9, 0xbfc7b448, 0x5f87e9a5, 0xb650f31a, 0x9161ee81, 0x1c13e76e, 0xf26357df, 0x3f1cb72e, 0x312c5a72, 0xf961e08e, 0xc2431a7b, 0x0da90a89, 0xa473f928, +0x06abbdd8, 0x0399e7d5, 0xbd52444b, 0x6a95fe0c, 0xdf5ceac3, 0xb1f75914, 0x7121b36c, 0xc1dafdae, 0x930dcbcb, 0xf572c712, 0xfedc75c8, 0xc96246ec, 0x1dd62ec9, 0xb0073501, 0xcc2c3353, 0xda54af40, 0x13b06c11, 0x6f1deffe, 0x40bd0211, 0x63317966, +0x9f215d53, 0xb7851143, 0xe6c2ab03, 0xe38cdebc, 0x7c2b0652, 0x948fef89, 0x9825fcac, 0xea68b826, 0xb5cfc503, 0x39d871fc, 0x938b4e76, 0x80bda7da, 0x89df44fd, 0x8edbe502, 0x07822442, 0xd432ed98, 0xd1fa1d9a, 0xefa04824, 0x0caa1325, 0xb081b0bc, +0x2822c9ad, 0x667f0cd9, 0x8b9590bd, 0x26c20ec8, 0x024ad440, 0x21402a8a, 0x11fab851, 0xdd500ebf, 0x87b90625, 0x1ad28f36, 0xb9e3539b, 0x617bad26, 0xc7040434, 0x02cc51fd, 0x4e5dc574, 0x8959c140, 0xccaab6ee, 0x1336e9ac, 0xf27666ed, 0xa17b08ed, +0x803b2267, 0xdf1adaff, 0x6d573bbe, 0x09e4669a, 0xad579e75, 0xcee062ae, 0xeaee3d9b, 0xce66e713, 0x181edecb, 0xa331dcad, 0xbe6177d9, 0x7cad83ef, 0xf95e518a, 0xd3364c67, 0x8c17b4ff, 0xc2ccf436, 0xa4357d52, 0x58255967, 0x700790ca, 0x94096a34, +0x873f8398, 0x3276c326, 0x2dea39af, 0x56c59e02, 0x68194e01, 0x00000000, 0xd6febc65, 0x303c1766, 0xa819ebca, 0x3c960443, 0x91c19a36, 0x724d448a, 0xf5f442af, 0x0baeb2da, 0x63b7fcdb, 0xa3b75910, 0x7785b488, 0x14b4cdee, 0x1d50ab74, 0x357262d9, +0xa6f92caf, 0x689fcbbc, 0x7549e575, 0x2488da88, 0x82f7739a, 0x47b9a3ee, 0x79e3f650, 0xd67839d8, 0xc54ed074, 0x35f4e764, 0xef26cd99, 0x9fa7d8ee, 0x0962e327, 0x37be3324, 0x5ae9089a, 0x30ba92db, 0x4b13b0cb, 0xb24de141, 0x238c7b77, 0xf7be96ef, +0xc0862076, 0x9d6b8913, 0xbee7f264, 0x6435d899, 0x58a3dcda, 0xc7828189, 0x3738b699, 0xa89f6e77, 0x3b92a5bc, 0xd4b46825, 0x1f9cfa89, 0xe6442ebe, 0xf0ba3710, 0x0704a1ff, 0xaf9bcf88, 0x4575f213, 0xa67fa912, 0xe30a5b01, 0x9ded0cae, 0xbcad2624, +0x5f21f898, 0x16fe19ae, 0x3c1081fe, 0xfc96a188, 0x9643be74, 0xf7381352, 0x26448b75, 0x91471f8b, 0x7b2fa7ad, 0xd81e7b00, 0xb2cb64fc, 0xe4887f43, 0x66f98964, 0xf2f0e350, 0xc9e4c351, 0x6dd1be03, 0x2d6cbc12, 0xcb2892ac, 0xaad5ba37, 0x1a540a8b, +0x0b283767, 0x3b142001, 0x2a681ded, 0x0e6642d8, 0xfb920077, 0x8271f627, 0x3e5a55be, 0x3edcd003, 0xb70394fe, 0x8e5d60bf, 0x427153ec, 0xfe5af075, 0xb54940be, 0x9ae9ad51, 0x2aee9850, 0xdad22afd, 0x530d6e00, 0x4b953576, 0x5fa77d25, 0x8c913142, +0x4959648b, 0x5deda965, 0x240e5f35, 0x18985b76, 0x16789c13, 0x4c919489, 0xedea9c64, 0x64b35d24, 0x230afeca, 0x49dfe136, 0x117c3dec, 0x548f4a42, 0x5a6f8d27, 0xdf9c5f42, 0x4edb40c9, 0x96c53bc9, 0x70811577, 0xf03cb2ad, 0x473f2653, 0xc5c855c9, +0x0ee0c765, 0x7ba92210, 0x008685bd, 0x6f9b6a43, 0x857557d8, 0xb965d626, 0x9a6f28ec, 0x77033135, 0xf9d8d437, 0x5d6b2cd8, 0x5409cfff, 0x054e75bf, 0xaa533f8a, 0xbb2f0266, 0x796573ed, 0x32f0469b, 0x51c13ffd, 0xc24a718b, 0x0c2c9698, 0x5147ba40, +0xbc2ba399, 0xbba987db, 0xe8a4e9db, 0x72cbc137, 0xddd68b02, 0x28a44c10, 0x395ef441, 0xe8226c66, 0xaf1d4a35, 0x4c171134, 0x85f3d265, 0xd17c9827, 0x98a37911, 0x42f7d651, 0xed6c19d9, 0xa1fd8d50, 0x6a539a41, 0xfb1485ca, 0xd3b0c9da, 0x21c6af37, +0x538bebbd, 0x75cf60c8, 0x8b131500, 0xcbae1711, 0xadd11bc8, 0x05c8f002, 0xe40efafe, 0x1f1a7f34, 0x2f266852, 0xe1c60afc, 0x7ee757af, 0x6ad51ffc, 0xe1408f41, 0xfc102435, 0x2fa0edef, 0x14324853, 0x7e61d212, 0xd898febd, 0x61fd289b, 0xc000a5cb, +0x45f377ae, 0x403b87ac, 0xa4b3f8ef, 0x56431bbf, 0x6c520efa, 0x74f44794, 0x18a6496e, 0x99d66658, 0x7f2f8fa2, 0x02de3958, 0x3c2d6a9a, 0xdb28e73b, 0x63531530, 0x8d5369ff, 0xd70ba1f2, 0x6888dd06, 0xed2221cc, 0x4f21a3f1, 0x07f88eff, 0x6baa8005, +0x5886f155, 0xb082673e, 0x42fe8163, 0xa4076899, 0xeffc1894, 0x77d61a97, 0xa203823d, 0x390bdd3d, 0xd3d1720e, 0x21ad9453, 0x1b84146d, 0x5a58c80d, 0xe3df5e5d, 0x730cc96b, 0xee007ccf, 0xfa857368, 0x3ef353c2, 0x808c4b6d, 0x300e2c53, 0x792b6506, +0x248b23f4, 0xd5d598aa, 0xb458b4c2, 0x04dad3fc, 0xa0ddbb65, 0xe427d0a2, 0xb25c5e66, 0x5e821bf1, 0x7c0dd2a1, 0x1ea2a3ca, 0xe1016705, 0x8aabe700, 0x9fd28cfc, 0x105fdc5b, 0x1281e503, 0x5183003b, 0x27a97ef7, 0xe2233a06, 0x3a29803e, 0x535d3963, +0xafdca0af, 0x5559d3c7, 0xae20c4f4, 0x64ab9bcf, 0x597a950e, 0xa121df3e, 0xfe5fa094, 0xc6a819f2, 0xf15ebb5e, 0x137d8158, 0xd22d1655, 0x8989ba03, 0xb17e0365, 0x0bdbc836, 0x6f7053f9, 0x62af716b, 0x1f5ec791, 0x7ed3ebf9, 0xcfade89c, 0xb5a4d099, +0x0efd7f91, 0x35289bf4, 0x82527235, 0x4dff9aa9, 0x3bd5e465, 0xd429fcf1, 0x7a093805, 0x6974b95d, 0x6557ff94, 0x702e9468, 0xb3a03a3d, 0xacfefdac, 0x2c72b6c1, 0x52a15d38, 0x6675a297, 0x567b8ec4, 0x165b36ff, 0xbca121f7, 0x3f0f3799, 0xe7058da1, +0x7bf55c5e, 0x45060f9c, 0x6dae6aa1, 0x00000000, 0xf75a51fa, 0x60714833, 0x72f0ad30, 0x920dae6e, 0x2f50ebc2, 0x8875de58, 0xcd73d1c4, 0x28a8653d, 0xca8b5f3b, 0xe804966b, 0x5ba4ac56, 0x8b57835b, 0x912ff36d, 0x982a0203, 0x54a5b79c, 0x2373ad0b, +0xfc8199cc, 0xfb791733, 0x08f99535, 0xdd2c0d9f, 0x9b085f00, 0xeadaaf33, 0xc47620aa, 0xf6a635a1, 0x78d7015d, 0xf85b4a30, 0x1c7c9a92, 0xdad48360, 0xd6f7c5a9, 0x0c2346c9, 0x0526b7a7, 0xd80aba38, 0x0f011bca, 0x84569891, 0x90d39736, 0x9cf0d1ff, +0x9e2ee8a7, 0xaafa1708, 0xe0fd035e, 0xc0acf356, 0xbd5d45ac, 0x32d0150b, 0x37f6a2ac, 0x1d80fec9, 0x03225d03, 0x81702f36, 0x618d2c68, 0x34d4ffaf, 0x228fc950, 0x11a3b800, 0xffa3c4cf, 0x14850fa7, 0x2d8ed29a, 0xb77ae9c1, 0xbf837cf4, 0x4bfb700d, +0x8688a1c9, 0xf27ce65d, 0x44fa6bc7, 0xf58468a2, 0xc7547da9, 0xe9f8f230, 0x972b19c9, 0x332c7150, 0x01fc645b, 0x360ac6f7, 0x5f7e7faa, 0x5da046f2, 0x940944ca, 0xab067353, 0x41dcdc60, 0x0a27ac6d, 0xa9d84a0b, 0xc150970d, 0x1a787036, 0xce518cc7, +0x4302e538, 0x0ddf2292, 0xc272ca0e, 0xcc8fb59f, 0xd0f32f0d, 0x0604eaa4, 0xb87bf20b, 0xfd7dfd97, 0x85aafcca, 0x95f52091, 0xb9879650, 0xc9a90238, 0x507f6460, 0x9d0cb5a4, 0x257747af, 0xad0299f7, 0xa725359a, 0x2b8a383e, 0xecde4597, 0xf0a2df05, +0xa3ffe666, 0x8774c592, 0xde0e509c, 0xdff234c7, 0xc58a44f1, 0x26551aac, 0xbaa5cb53, 0x8caf0da4, 0xc8556663, 0x3dd10ec1, 0x17a752a4, 0xf3808206, 0x83ae166e, 0x2eac8f99, 0x9af43b5b, 0x6a56e45e, 0x4c03fef2, 0x71d2f033, 0x29540166, 0x7df1b6fa, +0x2051f008, 0x93f1ca35, 0x195a2d35, 0xe5dbb4f9, 0x6789c6cc, 0xf4780cf9, 0x6e8c37a2, 0x5787ea9f, 0x4020b83b, 0xdcd069c4, 0xcb773b60, 0xe6f9e9fa, 0xf9a72e6b, 0xbe7f18af, 0x15796bfc, 0x96d77d92, 0x8e7134fc, 0x4624529f, 0xa5fb0cc2, 0x31f24808, +0x4eddc7aa, 0x4a071456, 0x48d92d0e, 0xd9f6de63, 0xeb26cb68, 0x5c5c22a9, 0x750823cf, 0xbb59af08, 0x2a765c65, 0x762a7ecc, 0xc38eae55, 0x49254955, 0x38f7b966, 0xb6868d9a, 0x8f8d50a7, 0xa8242e50, 0xd10f4b56, 0x47d836c4, 0x0905f16e, 0xa6d951c1, +0x63286b3b, 0xbd00a447, 0x229a4370, 0xa4c5cf20, 0x66f02694, 0x7c919149, 0xc393928f, 0x03735074, 0x1fb9fa72, 0xc7eda41b, 0x46bf4eab, 0x3d23b902, 0xe5a06ba5, 0x612accba, 0xbe73f433, 0x43670304, 0x446a65e4, 0x8387c1ff, 0x865f8c50, 0x848aa71f, +0xa610e46f, 0x25972590, 0x050fc161, 0x382c7863, 0xc69c53ee, 0x63ffe7f5, 0xd8545e69, 0x658376e0, 0xfcb28c0c, 0x3af9532c, 0xe30b767e, 0x05d84daf, 0xda56f9e8, 0x608cb781, 0xa0bbf9b4, 0x845d2bd1, 0x7e9336c8, 0x7aed005c, 0xe27a818b, 0xa31f250e, +0x067c9115, 0x07daea2e, 0x7a3a8c92, 0xfdc37bf9, 0xc146b9c0, 0x1d6cd13d, 0x1c1d26c8, 0xa3c8a9c0, 0xe577e76b, 0xe77540ea, 0x5c0975b8, 0x5aa26863, 0xa26ed2fb, 0xa563b41b, 0xc44978a1, 0x58a0cfe2, 0x00000000, 0x5e0bd239, 0xbb7c3552, 0x5d78824d, +0x03a4dcba, 0xda817526, 0x98400d19, 0x40c3dfbe, 0x3ff6924d, 0xc5388f54, 0x628e1000, 0xf96ac1a3, 0x8688009e, 0xe109d1ff, 0x40145370, 0x27420edf, 0xf8ccba98, 0x04a9ba5a, 0x9f4d6bf9, 0x5b041358, 0x59d13817, 0xdd8c13c6, 0x01a67b3b, 0x7b9cf7a9, +0x852cdc24, 0xb8d8e9e8, 0x872e7ba5, 0x6627aa5a, 0x7b4b7b67, 0xbfd58f08, 0xc2e2657a, 0x1f6e76bc, 0xe0afaac4, 0x3b5f2817, 0xffc1dc78, 0xc49ef46f, 0xe406109e, 0x82f6360a, 0x64f28115, 0x1ccaaa06, 0xd9f22552, 0x8152eab0, 0x9d4fcc78, 0x1bc7cce6, +0x047e3694, 0xc73a28d5, 0x23ebb485, 0xc191350e, 0xdcfde433, 0x42c1783f, 0x2633f92a, 0xc5ef039a, 0xb80f6526, 0xa7b69f54, 0xbdd72889, 0x47ceb95e, 0x7e44ba06, 0xfbbfeaec, 0x989781d7, 0xb97e92d3, 0x38fbf4ad, 0x43b08fca, 0x1e1f8149, 0xe2ad0d45, +0x398a0358, 0xde28cf7c, 0x4165a485, 0xe604b71f, 0x41b2284b, 0xdeff43b2, 0xdc2a68fd, 0xb9a91e1d, 0x0202a781, 0xa1ca0e41, 0x9931faec, 0xf81b3656, 0xf9bd4d6d, 0xa06c757a, 0xbea478fd, 0x27958211, 0xe1de5d31, 0x1ec80d87, 0xc0374e35, 0xbf0203c6, +0x78382b13, 0x7fe2c13d, 0x24e6d265, 0x3c85c239, 0x1dbb5df3, 0xe6d33bd1, 0xdd5b9f08, 0xfa1991d7, 0x0171f7f5, 0x99e67622, 0x1863105c, 0x3c524ef7, 0xff1650b6, 0x85fb50ea, 0x1b104028, 0x06ab1ddb, 0xa5b438d5, 0x3f211e83, 0xfeb02b8d, 0x47193590, +0xa41243ee, 0xe3dcfab0, 0xba0dc2a7, 0xc3441e41, 0x9c3e3b8d, 0x87f9f76b, 0xdf8eb447, 0x9d9840b6, 0x7c461d87, 0x6554fa2e, 0x1ab63b13, 0x3a2edfe2, 0xe7a2cc24, 0xdf593889, 0x9b335d6d, 0x8185667e, 0x44bde92a, 0x62599cce, 0x451b9211, 0x7949dce6, +0x80f4918b, 0x7d37ea72, 0x19c56b67, 0x5877432c, 0xfc6500c2, 0xc235e9b4, 0x5bd39f96, 0x605b3b4f, 0x4216f4f1, 0xfd14f737, 0xa761139a, 0x78efa7dd, 0x83504d31, 0x3df435cc, 0x2098e4f1, 0x3e50e976, 0x24315eab, 0x21e91304, 0x9be4d1a3, 0x64250ddb, +0x9f9ae737, 0x02d52b4f, 0xdbf082d3, 0xfe67a743, 0x6781d161, 0x5daf0e83, 0xbca6df7c, 0x9ce9b743, 0x213e9fca, 0xd925a99c, 0xc0e0c2fb, 0x5f7a25cc, 0xe078260a, 0x61fd4074, 0xbada4e69, 0x5906b4d9, 0x1a61b7dd, 0xdb270e1d, 0x5cdef976, 0x224dcfbe, +0x3b88a4d9, 0x67565daf, 0x00d78cce, 0xa2b95e35, 0xa6c768a1, 0x18b49c92, 0xbc7153b2, 0x9a42aa98, 0x7f354df3, 0x233c384b, 0xa11d828f, 0x4668c265, 0x7de066bc, 0x45cc1edf, 0xc64bdf20, 0x9e3c9c0c, 0x395d8f96, 0x8221bac4, 0x2540a95e, 0x070d66e0, +0x799e5028, 0xface1d19, 0x5a75e4ad, 0x26e475e4, 0x1912e7a9, 0x5fada902, 0xbbabb99c, 0x3e8765b8, 0x204f683f, 0xd883d2a7, 0x5edc5ef7, 0x9eeb10c2, 0x80231d45, 0xe4d19c50, 0xfb686622, 0x9a952656, 0x50f47e99, 0xe34a86fa, 0x1fdc2c38, 0x18fb2455, +0xc8e7d9cb, 0x75fed4c4, 0xecec1784, 0x3cdc32ba, 0x46847700, 0x7d539577, 0x993e1be0, 0xfdbb1670, 0x87e353ca, 0xa4e34d48, 0x327bc7d6, 0x46a8afa0, 0x9f18779f, 0x19d698e7, 0x5e538bf5, 0x7b5921a8, 0x0e8b2dcc, 0x72d9dca9, 0x2da7ebee, 0x80e88307, +0xebe7c749, 0x8944a6a6, 0x070bd0cd, 0xc04a9878, 0x8e63aecb, 0x5f7e3747, 0x115701f4, 0x8f4e1279, 0xaa44b824, 0xac62d45b, 0x59748398, 0x480f5acc, 0x22017a90, 0x74d36876, 0x002cd8a0, 0x2b818791, 0xfcba7262, 0x74ffb0d6, 0x41a37f6d, 0x9e19138d, +0x6b0f444e, 0x2aac3b23, 0x3df18e08, 0x240bce4f, 0xb3bef863, 0x08819913, 0x7b75f908, 0x012dbcb2, 0xfd97ced0, 0x97b5362c, 0xaa686084, 0x1ef1908a, 0x117bd954, 0xe56cea85, 0x490e3ede, 0x65a8b122, 0x175db52b, 0xad63b049, 0x63a205fd, 0x252672fd, +0x65846982, 0x7d7f4dd7, 0xb4b528ae, 0x6d05f091, 0xba12ddc2, 0xd6164941, 0xf51657c3, 0xc74148b5, 0xbd35d5af, 0xbc18691d, 0xceed6d14, 0xa5e2295a, 0x3bfb3ad7, 0x51f51a8b, 0x4e2936b3, 0xbc34b1bd, 0x7a749d1a, 0x2bad5f31, 0x3ddd56a8, 0x50d8a639, +0x18d7fcf5, 0x355ccfbb, 0xf21d870e, 0xc9e6bdd9, 0x3ad68665, 0xf2315fae, 0xc14bfc6a, 0xba3e0562, 0x90bee6e1, 0xcfec0906, 0x9799ee8c, 0x56d212e6, 0x4e05ee13, 0x7c7e29c5, 0x17716d8b, 0xdebb08f2, 0xecc0cf24, 0x72f50409, 0x242716ef, 0xd9b0d83f, +0x89687e06, 0xedc1ab36, 0x107abd46, 0x5e7f5355, 0xab45dc36, 0xeded7396, 0x58593f2a, 0x6c284c23, 0xd89d648d, 0x105665e6, 0x4f048a01, 0x06266c7f, 0xd7172d53, 0xc16724ca, 0xbb3f6170, 0xf43beb71, 0xf3303bbc, 0x7a5845ba, 0x64850d90, 0x6a0e205c, +0x81c53fb5, 0x337aa3c4, 0xc06640d8, 0xe4415637, 0xe24be2e8, 0x0f8a49de, 0x9e35cb2d, 0x0980fd01, 0x5f52efe7, 0xeaca7bfb, 0x47a9cbb2, 0xc76d9015, 0xb39220c3, 0x232cc622, 0x0fa6917e, 0x418fa7cd, 0x32571f76, 0x1edd482a, 0xfbb1a2af, 0x34717309, +0x91935a53, 0x6b239cee, 0xf41733d1, 0x2d8b334e, 0xbb13b9d0, 0xebcb1fe9, 0x4f2852a1, 0xb5b44cbc, 0xc6402ca7, 0x060ab4df, 0x250aaa5d, 0x0ea7f56c, 0xe5403225, 0x73d8b8bb, 0x8f62cad9, 0x51d9c22b, 0xd030253e, 0xd8b1bc2d, 0x08ad41b3, 0xc66cf407, +0xb598941c, 0x57ffae54, 0x81e9e715, 0xab690496, 0x1ff0f498, 0x56feca46, 0xb499f00e, 0xe2673a48, 0x9912c340, 0x628fb94f, 0x23001e82, 0xa2c52137, 0xd01cfd9e, 0x33567b64, 0x408ec3df, 0xeae6a35b, 0xd99c009f, 0xcec1b5b4, 0xe3665e5a, 0xc9ca6579, +0x3bd7e277, 0x86e237d8, 0x2c8a575c, 0xf31ce31c, 0x16700999, 0x2a80e383, 0xd131412c, 0x88691a14, 0x75d20c64, 0xad4f68e9, 0x7c52f165, 0x222da230, 0x19fa4047, 0x96b4523e, 0xdf96b440, 0xfab0c6bd, 0x00000000, 0xa4cf95e8, 0xd11d998c, 0x90923e41, +0x09ac25a1, 0xa5cef1fa, 0xa3c44525, 0xde97d052, 0x983f7ff2, 0x9813a752, 0xfc96aac2, 0x3cf0ea1a, 0xdfba6ce0, 0x64a9d530, 0xfa9c1e1d, 0xf53a8f63, 0x638edd5d, 0xb2bf9c71, 0x59585b38, 0x6c049483, 0x8845c2b4, 0x73f4601b, 0x9f34af3f, 0xc8cb016b, +0x5875e78a, 0x8e4f766b, 0xe46d8e97, 0x01016412, 0xa2e9f997, 0x2ca68ffc, 0x57d376f4, 0x62a361ef, 0x3afa5ec5, 0xac4e0cfb, 0x40a21b7f, 0xcfc0d1a6, 0x80c45ba7, 0x87cf8b6a, 0x165cd139, 0x6a22f8fc, 0x91bf82f3, 0xb29344d1, 0xa3e89d85, 0x47851312, +0xfb9d7a0f, 0x0727086d, 0x6d292831, 0x345daba9, 0x96988a9e, 0xd63a91e1, 0xbd190d0f, 0x3570171b, 0x4823826c, 0x4922e67e, 0x86ceef78, 0xd73bf5f3, 0x382b6113, 0xd723be3d, 0x866bb9d7, 0x1d6d7fb2, 0xef08df2e, 0xd751585a, 0x19a1d30c, 0x6067c6db, +0xffadac00, 0xd123a988, 0x8f6f19f5, 0x84a702dc, 0x04be4ad9, 0xbc8c63cf, 0x76c2a240, 0x6ddd2c20, 0xc33887ca, 0x19d3356b, 0x6f11972b, 0xa1e11c7d, 0x891de827, 0x96bc2c9e, 0xaee5abea, 0xce826d31, 0x7d785f0e, 0x64d98c02, 0x21f85478, 0xe60c7f0c, +0x38598774, 0x5584ab54, 0x9b06c665, 0xae974d8d, 0xb8322916, 0x4e9b2534, 0xedc46425, 0xc54a7618, 0x1d1f99d5, 0xf6dbea45, 0x060017b5, 0xe67e996b, 0x141b39f7, 0xfd13f16c, 0xdceba514, 0x2334ef73, 0x0dbaeafb, 0x00000000, 0x62ab7dd0, 0xfb6100be, +0xb1446f53, 0x28fcf45a, 0xca4ec18f, 0x0072e667, 0x6bafddf2, 0x86195fb0, 0x8ba3b54b, 0x375d30e3, 0x2c42be83, 0xd82709aa, 0x584ca7c8, 0xa8975a38, 0x64ab6a65, 0x727ce899, 0x55f64d33, 0x23460914, 0xf0dbfdf0, 0xa793edaf, 0xc786cd13, 0x2534f8c6, +0x0672f1d2, 0x0f7651f0, 0x8bd1532c, 0xe4b22260, 0x6bdd3b95, 0x720e0efe, 0x3a953c7f, 0xf21746fb, 0xe97a2efc, 0x79b4f3b0, 0x5748105f, 0xbe323ea3, 0x6f63714c, 0xf265a09c, 0x41ed74c4, 0x4ee9c353, 0x419f92a3, 0xe2c0d3b2, 0x5e4cb07d, 0x806bae62, +0xe2b235d5, 0x6911809e, 0x35918be8, 0x16d782fc, 0x0bbafd4e, 0x489b3281, 0x10d79549, 0xd59de351, 0xb3fa323f, 0x1469df90, 0x92708020, 0x435329a8, 0x278aa5aa, 0xbafe921d, 0x10a5732e, 0xb1368934, 0x8da3a2fe, 0x583e41af, 0x82a71569, 0xf465b729, +0x1fa1c4b9, 0x90bc3b2b, 0x99ca7d6e, 0xca3c27e8, 0xaa5be133, 0x99b89b09, 0x4a256fed, 0x4a57898a, 0x96cecaf9, 0x7b0aaedc, 0xcc3c305d, 0x3e5990c1, 0xc1f43cc1, 0x94709795, 0x2a42a936, 0x1b1f8e60, 0x372fd684, 0x6667d16e, 0xd39df4e4, 0xc538907f, +0x35e36d8f, 0x84d5e4bb, 0x1fd322de, 0x312fc131, 0x0bc81b29, 0xbe40d8c4, 0x315d2756, 0x70b05392, 0x70c2b5f5, 0x2a304f51, 0xb840cf71, 0x3ae7da18, 0x9d7437b7, 0x2c3058e4, 0xe07e8ede, 0x5e3e561a, 0xa55f56a4, 0xcc4ed63a, 0xd3ef1283, 0x740e194b, +0xb388d458, 0xebc47390, 0xda9954c6, 0xa7e10bc8, 0xac2910e1, 0xc8827a84, 0x8dd14499, 0xbcfe85a8, 0xd1514fef, 0xfd61170b, 0x62d99bb7, 0x5cf2ed11, 0xd5ef0536, 0x80194805, 0x7fc60262, 0x27f843cd, 0x1269c825, 0x45533e1d, 0x4c579e3f, 0x5384bce1, +0xc7f42b74, 0xa52db0c3, 0x5a801cc3, 0x53f65a86, 0xb7369e81, 0x4321cfcf, 0xf9adbbb5, 0x82d5f30e, 0x76b04427, 0xba8c747a, 0xac5bf686, 0x09764645, 0x16a5649b, 0x3ce7cdad, 0x33e37a3a, 0x7fb4e405, 0x9b742002, 0x8f1dff92, 0x04ccacbe, 0x4c257858, +0xe4c0c407, 0x513ae18d, 0x6dafca47, 0x48e9d4e6, 0xef7a3949, 0xebb695f7, 0xfb13e6d9, 0xedb68242, 0xe908c89b, 0x33919c5d, 0x896f0e40, 0xcef08b56, 0x0f04b797, 0x7b7848bb, 0xdc994373, 0x92026647, 0x02ccbb0b, 0xdaebb2a1, 0x5c800b76, 0x747cff2c, +0xa193fa1a, 0x2efce3ef, 0x601520bc, 0xde271e1f, 0x0904a022, 0x7d0ab969, 0xf417514e, 0x25461ea1, 0xf0a91b97, 0x9d06d1d0, 0x288e123d, 0x9fca6adb, 0x79c615d7, 0x479f8516, 0xa8e5bc5f, 0x90cedd4c, 0x1b6d6807, 0xb5fa258a, 0x66153709, 0x696366f9, +0xa35f4111, 0xde55f878, 0x573af638, 0x940271f2, 0xe00c68b9, 0x121b2e42, 0x5af2faa4, 0xb588c3ed, 0xffdf4a67, 0xb74478e6, 0xc34a61ad, 0x9fb88cbc, 0xd855efcd, 0x3e2b76a6, 0x3c952bca, 0x218ab21f, 0xa32da776, 0x4521d87a, 0xc8f09ce3, 0x0dc80c9c, +0xf9df5dd2, 0x02be5d6c, 0xf6a90c22, 0xaa290754, 0xc186daa6, 0x47ed6371, 0x514807ea, 0x2e8e0588, 0xa2c00397, 0x9f016a2a, 0x8d19a33f, 0xd570a074, 0x62485fd3, 0xeed7da25, 0x60650dc0, 0xf9027406, 0x7636852a, 0x44ded178, 0x49dabe84, 0x1d31f4fa, +0x2a14c79e, 0xa0ed5184, 0x920505d6, 0xe61ed2ef, 0xd75df267, 0x9b4a2bd5, 0x705096c6, 0x4113b64e, 0xf2600816, 0xbff1f76d, 0xdbdfbb52, 0x36a315ad, 0x71d6b00f, 0x902857c5, 0xca6c069d, 0x485c984d, 0xade93e78, 0x17d5ae23, 0xcbea2054, 0x964e4429, +0x3dc169bd, 0x235be99d, 0x20f09d47, 0x05cd6736, 0x68ac050a, 0x95e530f3, 0x819bea0a, 0xd13be18b, 0x0f293def, 0x3a215c98, 0xdc3f8e77, 0x801dccc3, 0x3c474f74, 0x2710a862, 0x398a2842, 0x1e9a8020, 0xed7caeff, 0x50a00b81, 0x1ad1c1df, 0x433ee45d, +0x147edaf9, 0x727dc4d5, 0xe2559310, 0xe3d3b5d9, 0xc5453b72, 0x253dfa71, 0x6ce744f5, 0xd9f2e941, 0x8f34f12c, 0x336e729b, 0x32e85452, 0xc841548e, 0x2b92e157, 0x9d2c3839, 0xfaa900dc, 0x4d91ff7b, 0x87fdf9e6, 0x6eca16e6, 0x7eff8de0, 0xa4a6107b, +0x85d0abf5, 0x9383231f, 0x84568d3c, 0xfee24123, 0x00000000, 0x97c862e0, 0x10359b06, 0xf62b49e9, 0x867bdf2f, 0x51262d48, 0x31432088, 0xa346255e, 0x77b0a3e3, 0x0b627c10, 0x26968eab, 0xe078c103, 0xa52036b2, 0xecfa8836, 0x642e4c3f, 0x4775a5a2, +0x3e6a1d67, 0x528d5992, 0xb515adb4, 0xd0bdc742, 0xfccf1330, 0x4e3a8ba1, 0x5f89366e, 0x46f3836b, 0xcd8c33b8, 0xb2f59891, 0x094f2e03, 0x044b41ff, 0x5869034b, 0x4bf7ec97, 0xb997e481, 0xbbbab692, 0xf7ad6f20, 0x6a815719, 0x9e874ce3, 0x54eb4a7e, +0x35086177, 0x6f4c302f, 0xa824594e, 0x61e32b09, 0x8eb2d7e5, 0x2e5f8661, 0xf88452cf, 0xf1cb7ccc, 0x63ce791a, 0x678538e5, 0x4fbcad68, 0x7b32ead6, 0xe1fee7ca, 0x7f79ab29, 0xc0885c44, 0x197ab505, 0x3ba77a51, 0xfb2f2615, 0xf4061bfa, 0x9caa1ef0, +0x30c50641, 0x66031e2c, 0x40959087, 0x2fd9a0a8, 0x37253364, 0xeb1abd13, 0x0ae45ad9, 0x8952e2c0, 0xf5803d33, 0x7ab4cc1f, 0x73fbe21c, 0x5e0f10a7, 0xea9c9bda, 0x9463163a, 0x4a71ca5e, 0x24bbdcb8, 0x18fc93cc, 0x57403ea4, 0xa68b4268, 0x6d61623c, +0xce274762, 0xde12dc64, 0xaa090b5d, 0xb6bed96e, 0xe798f426, 0xa16b774d, 0x139eefdc, 0xba3c905b, 0xd874cf88, 0x83b6b819, 0x7cd2dff3, 0x2176bb8e, 0x7d54f93a, 0x165388ea, 0xc9c77247, 0x1f1ca6e9, 0xc323289e, 0x59ef2582, 0xe43380fc, 0xcfa161ab, +0x5a445158, 0xff6467ea, 0x9acc0d1c, 0x1cb7d233, 0x22ddcf54, 0x996779c6, 0x018626c9, 0x380c0e8b, 0x56c6186d, 0xfd4935f9, 0x11b3bdcf, 0x78999e0c, 0xbddca57e, 0x1218c915, 0x42b8c294, 0xb738ffa7, 0xd6dbd4ae, 0x0d046ffc, 0x1b57e716, 0x556d6cb7, +0xd316b398, 0x03ab74da, 0xdf94faad, 0xa9a27f87, 0x29bfb344, 0x066613ec, 0x4558f7b1, 0xd4f686bd, 0xf3e62edf, 0x348e47be, 0x741bd739, 0xb811c248, 0xbc5a83b7, 0xc4c31dbb, 0x2c72d472, 0xef51fcec, 0x530b7f5b, 0x65a86af6, 0xcc0a1571, 0x3fec3bae, +0x15f8fc30, 0x5da4647d, 0x98e15f0f, 0x4c17d9b2, 0x8af9961a, 0x2839958d, 0xe5b5a635, 0x5bc27791, 0x8b7fb0d3, 0xb0d8ca82, 0xbe77d1a4, 0xafc46c6b, 0x88d4c409, 0xe8b1c9c9, 0xb373be58, 0x91ae710c, 0x08c908ca, 0x022d5213, 0xc10e7a8d, 0x82309ed0, +0x791fb8c5, 0xf04d5a05, 0xb15eec4b, 0xac6f18b1, 0xddb9a8be, 0x8c9f85f6, 0xd2909551, 0xda599d9b, 0x07e03525, 0xc2a50e57, 0xab8f2d94, 0xa70d64a1, 0xe937ef00, 0xae424aa2, 0x0c824935, 0x6b0771d0, 0x5c2242b4, 0x0eaf1b26, 0xc6ee4fa8, 0x759df1f0, +0xb4938b7d, 0x692a23c3, 0x2df4f2bb, 0xc7686961, 0x08f0bec9, 0xdbdcfd7b, 0x45ea169e, 0x4214a8c2, 0x1a4da28d, 0xfe7d5332, 0x225f1015, 0x10c1d77a, 0xbc97ab84, 0x7af84a2e, 0xe430f1bf, 0x58a75a3b, 0x522b2fcc, 0x8c8bf7a1, 0xc691b1de, 0x47688dd4, +0x993605cd, 0x4ae4160b, 0x371cb20d, 0xb399ab11, 0x07febe5c, 0x3f125cb0, 0xe14cd4a9, 0x42eaf8b6, 0xf673bd8f, 0x4a1a467f, 0x0d8c9bdf, 0x72f6a493, 0x329ec76f, 0x0f0e0095, 0x65379dc1, 0x7d06f472, 0x359e2947, 0x75081acf, 0x75f64abb, 0xfb017624, +0xa624597d, 0x58590a4f, 0xe3301f97, 0xc4132a94, 0xd65066a4, 0xbe1530ce, 0x1543a218, 0xa4a6c237, 0x4d1aa857, 0x3fec0cc4, 0xeebc8448, 0x4f98331d, 0xb6e58e07, 0x5fa7b413, 0xd42cad9a, 0xeb3ef12a, 0x00fe5074, 0x6d39737c, 0x6f45b842, 0x173f6926, +0x406863fc, 0xd4d2fdee, 0x027ccb3e, 0x0700ee28, 0x2aafaedc, 0x93ba703a, 0xcb1d2a01, 0x8385f734, 0xb467154d, 0x2fd38bca, 0xa6da0909, 0xa4589243, 0xe3ce4fe3, 0x57a95aae, 0xc313c4bc, 0x8b7549fd, 0x55d59190, 0x7df8a406, 0xa124b755, 0x22a14061, +0xc1915ff6, 0x27233503, 0x103f870e, 0x9e36ebe5, 0x18cf39c7, 0xce9f5f63, 0x552bc1e4, 0xf17353a7, 0x778a8185, 0xdea0d86d, 0x7f846f38, 0xf68dedfb, 0x9bb49e87, 0xb915dee6, 0x48668d41, 0x2d511080, 0x57570ada, 0xf18d03d3, 0x3d6e978e, 0x674b56ff, +0xf30f9899, 0x6ac7cd20, 0x708a6fad, 0x1f31879b, 0x282d3596, 0x3a9029d2, 0xe9423a14, 0x7f7a3f4c, 0x86f9d222, 0x00000000, 0xf97dbd1a, 0xec3e1f02, 0x2023db2b, 0xe4cea1cb, 0xd9a03645, 0x604bb8d7, 0x2a51fea8, 0xbb6915d8, 0x3d90c7fa, 0x3812b298, +0x837ba740, 0xee42d43c, 0xdcdc1353, 0x787ad164, 0x89f7d2b7, 0xf4f126c5, 0xc16f0f82, 0x183169b3, 0xbb9745ac, 0xf40f76b1, 0x4796dda0, 0x5ddb7f2d, 0xc4ed7ae0, 0x15bdf26c, 0x60b5e8a3, 0x890982c3, 0xcc1dc429, 0xe1b284dd, 0x9444ce66, 0x9138eb70, +0x5d252f59, 0xa92a59e8, 0x6a399d54, 0x847b4968, 0xa3a62c1f, 0x27dd6577, 0xa1dae721, 0x9b4acef3, 0xd32c43b2, 0x2f2ddbbe, 0x37e2e279, 0x68bb061e, 0x8ef73c9f, 0x9ec8bb91, 0xdc224327, 0x8485191c, 0x02829b4a, 0xe9bc6a60, 0x25a1ae49, 0xc66fe1aa, +0x623773e9, 0x38ece2ec, 0x96380558, 0x65c9cdb5, 0xd3d213c6, 0xfcffc878, 0x9c4a20db, 0xebc0a15e, 0xfbff2650, 0xd6ae36d0, 0xaca82c8a, 0x7774d1f1, 0xb9eb8e92, 0xf3f1c8ed, 0x0ff050e1, 0x1db31cd1, 0x17c13952, 0x50a9b486, 0x62c9239d, 0xaed4e7b4, +0xaba8c2a2, 0xcce3945d, 0xf983ed6e, 0xfe830346, 0x8c75a7d5, 0x9344204e, 0xb61bde73, 0x451446ea, 0x52d57fb8, 0x91c6bb04, 0x94ba9e12, 0xe6b26af5, 0xc961e13f, 0x255ffe3d, 0x12bd1c44, 0x78848110, 0x8e096ceb, 0x20dd8b5f, 0x4898dd35, 0xa9d4099c, +0x1d4d4ca5, 0xe64c3a81, 0xae2ab7c0, 0x30e20c51, 0x40963388, 0xc3ed94c8, 0x6fbbe836, 0x4f666369, 0xd1aed8f8, 0xb367fb65, 0x5057e4f2, 0xbeeb60ba, 0xde5e8819, 0x99c855b9, 0xd150888c, 0x86078256, 0xa3587c6b, 0xac567cfe, 0x7a061a5a, 0xfc01980c, +0x5f59e467, 0x9cb470af, 0x81076c7e, 0x12434c30, 0x080eeebd, 0x81f93c0a, 0x35607933, 0x05827562, 0x28d365e2, 0xb4994539, 0x67b5068b, 0xc99fb14b, 0x0a8c75f7, 0xcbe37a75, 0x7208f4e7, 0x4de4f823, 0x8b8b1989, 0xbc69fbf0, 0xb11b305b, 0x96c6552c, +0x5a25c171, 0xdb22ad0f, 0x1ab3f2f9, 0xb1e5602f, 0x057c2516, 0xce610f17, 0x6dc72308, 0x0a722583, 0xd95e6631, 0x0d72cbab, 0x70743fd9, 0xab5692d6, 0x3a6e79a6, 0xecc04f76, 0x5adb9105, 0x3260971b, 0x301c5c25, 0x6845566a, 0x2daf40f4, 0x1fcfd7ef, +0x004a4701, 0xac000018, 0x929916db, 0x5376463d, 0x33d5f1e5, 0xe7365a8e, 0x54d78986, 0x940b5c59, 0xea7abda8, 0x0179c238, 0x1e981128, 0xf309243a, 0xcb483f7a, 0x47037f88, 0x78e3ab73, 0xaba1cfa3, 0x60e9f0d9, 0xbee7732f, 0xed913512, 0x07eb88ba, +0x983e7947, 0x2d4de0cd, 0x1939de93, 0x8d3282ca, 0x1546bc8c, 0x40a2b033, 0xde44c4f7, 0xca7bba43, 0x6631fd5a, 0x599b6ea0, 0x143f7eb4, 0xb4401cb3, 0xca31fd42, 0x3fe0d4fb, 0xf59b6eb8, 0xc0dcd5df, 0xaa924a9a, 0xdf7741ce, 0x0c35251e, 0xbfd4f616, +0xff3c0124, 0x467abdb0, 0x2aec2f76, 0x18401cab, 0x4dee5715, 0xf270e602, 0x733d06d7, 0xd9af4c4d, 0x94411b58, 0xa0352506, 0x8c0107f3, 0x1ed25629, 0x4c97952d, 0xc7375d65, 0x92d351da, 0xf343633b, 0x5e3aa11b, 0x4da41014, 0x98743e46, 0x6def50fe, +0x61da75e0, 0x2c3422f5, 0x0b94eaa5, 0xeb037f90, 0x3faa93fa, 0x40e8f732, 0x7e3ba6f0, 0x2178c5d3, 0x3938d978, 0x12e77337, 0x1fe1d310, 0xd4e3ab6b, 0xad79c220, 0x93e0d4e3, 0x75e50b54, 0xb946bc94, 0x0d4ce726, 0x533c013c, 0x8ad90a70, 0x814de0d5, +0xe0979535, 0x8bea8f49, 0x6a04d844, 0xd271e1e9, 0x799a694b, 0x58a8eb99, 0x6da517ff, 0x147539b5, 0x32e674dc, 0xe1ee570d, 0xff764625, 0xbead342e, 0x01338539, 0xf9e40ca7, 0x7f0823c9, 0x2c7e65f4, 0x06d80d83, 0xcca3b7c0, 0xb40a5bb2, 0x9947bb7f, +0xc77d1a64, 0x343e795f, 0xa6a76f84, 0xeddb7213, 0xd34264d0, 0x150cfb8d, 0xad338521, 0x4191350a, 0xb90cfb95, 0x78a9ec72, 0xc64e9f5d, 0x41db720b, 0x3547bb67, 0x6a4e9f45, 0x737741d6, 0x93aa93e2, 0x2bdfaa4f, 0xa7deadbc, 0xa07f6207, 0x8c4b40f2, +0xb83f7eac, 0x0c7f621f, 0xc09692de, 0xcdda75f8, 0x4b7c1d97, 0xe1a4100c, 0xd59a6953, 0x87dfaa57, 0xeca2b02b, 0x520f8405, 0x339fb6e4, 0xfe45c31c, 0xf4e2ac80, 0xb87539ad, 0x6b7d1a7c, 0xb2d25631, 0x2b95ed4e, 0x1fab9411, 0x58e2ac98, 0x0bdeada4, +0x00000000, 0x27ea8f51, 0xd30823d1, 0xa14ce73e, 0x8795ed56, 0xbf9eb117, 0x4a4f98ae, 0x26934d69, 0xb2981130, 0x06924a82, 0x0d06a027, 0x95729e61, 0xc1a517e7, 0x07a1cfbb, 0xcd9032f9, 0x8ba0c848, 0x749cc96c, 0x139eb10f, 0x12ad3436, 0xac4a4719, +0xd4a9ec6a, 0x5245c304, 0xf23aa103, 0xf8d7899e, 0x9ee674c4, 0x86ec2f6e, 0xd9e50b4c, 0x38411b40, 0x667bba5b, 0x19739992, 0x807e65ec, 0x5f092422, 0xd23ba6e8, 0x803422ed, 0xfe0f841d, 0xf4a8eb81, 0x720e83ee, 0xcb02787b, 0x200107eb, 0x86a6686f, +0x2d07a7cc, 0xa794eabd, 0xece8f72a, 0x350dfc66, 0x59d129a1, 0x619032e1, 0x213282d2, 0x204b40ea, 0xe605dfb7, 0x180a5baa, 0x7f4264c8, 0x0aed289d, 0x55e40cbf, 0x8d78c5cb, 0x8107a7d4, 0xe77c1d8f, 0x2aa66877, 0xd8d68e75, 0xf5d129b9, 0x9f9fb6fc, +0xc1ef50e6, 0x27a0c850, 0xc604d85c, 0x32ac33dd, 0x9fd5f1fd, 0x8a934d71, 0x6cdcd5c7, 0x7244c4ef, 0x380b5c41, 0xb539de8b, 0x26d90a68, 0x6c9692c6, 0x990dfc7e, 0x67483f62, 0xaad80d9b, 0xde0e83f6, 0x55ae4bbe, 0xb3ab9409, 0x0aa76f9c, 0xb573998a, +0x6b375d7d, 0x47493889, 0x79d02e4a, 0x549dce87, 0xd89cc974, 0x4630fab1, 0xea30faa9, 0x4b365a96, 0x5f436323, 0xf89dce9f, 0x13d4f60e, 0xdf3d06cf, 0x3ed351c2, 0x4cddd22c, 0x3e9916c3, 0x60a3b7d8, 0xabeb88a2, 0x7e71e1f1, 0xe0ddd234, 0x9eac33c5, +0x74d68e6d, 0xcce9f0c1, 0xa6ed2885, 0xb3e1d308, 0xeb493891, 0xf9ae4ba6, 0x4a05dfaf, 0x39729e79, 0x34743e5e, 0xa106a03f, 0x67027863, 0x75af4c55, 0x5e70e61a, 0x9538d960, 0xe64f98b6, 0xd5d02e52, ] + +d0x6a0c91a8=[ 0x30, 0x6f, 0x83, 0x1c, 0x7c, 0xae, 0xfd, 0x01, 0xd7, 0xf5, 0x02, 0xdb, 0xb4, 0xf9, 0x44, 0x28, 0x1b, 0x52, 0x13, 0xe5, 0x2a, 0xad, 0x11, 0xe2, 0x8f, 0x2f, 0x70, 0x14, 0xcc, 0x4d, 0x0f, 0x17, 0x18, 0xc7, 0x46, 0x2c, 0xf3, 0x8a, 0xe0, 0xa2, +0xb6, 0x80, 0x9a, 0xfa, 0xe8, 0x7d, 0x56, 0x1d, 0xbb, 0x15, 0xf0, 0xff, 0x59, 0xd0, 0xef, 0x60, 0xc6, 0xfc, 0xcd, 0x76, 0xf8, 0xaa, 0x0a, 0x2e, 0x7a, 0xbc, 0x96, 0x77, 0x94, 0x3e, 0xc3, 0x45, 0xf1, 0xf7, 0x90, 0xac, 0x50, 0x24, 0xf4, 0x9f, +0x5a, 0x07, 0x7e, 0x03, 0x0e, 0xea, 0x8e, 0x58, 0x0b, 0x73, 0x1e, 0x6d, 0x8c, 0x3d, 0xcf, 0x0c, 0x2d, 0xa5, 0x08, 0x99, 0x72, 0xd4, 0x3f, 0x29, 0x8b, 0x3b, 0xe4, 0x06, 0x4b, 0x67, 0x7f, 0xb0, 0x37, 0x48, 0x00, 0xd3, 0x2b, 0x5e, 0x6c, 0xc9, +0xcb, 0x79, 0xc1, 0x5b, 0x5d, 0x3c, 0x36, 0x55, 0x86, 0x6a, 0x63, 0xb3, 0x98, 0xa9, 0xec, 0xde, 0xd5, 0x38, 0x10, 0x6e, 0xc0, 0x62, 0xa8, 0x12, 0x53, 0x0d, 0x66, 0x68, 0x69, 0xed, 0x92, 0x35, 0xdf, 0xce, 0x5c, 0xc8, 0xbd, 0xe1, 0xd1, 0x16, +0x82, 0xd2, 0x7b, 0x40, 0x95, 0xba, 0xa6, 0x88, 0x27, 0x49, 0x75, 0x09, 0xb2, 0x39, 0x4c, 0xa3, 0xd6, 0xbe, 0xb5, 0xf2, 0xfe, 0x9b, 0x9c, 0xa1, 0x51, 0x19, 0x81, 0x21, 0x42, 0x25, 0xeb, 0xb8, 0xda, 0x23, 0x33, 0x26, 0xa7, 0x3a, 0xe6, 0x9d, +0xca, 0x93, 0x5f, 0x84, 0x4f, 0xc2, 0x71, 0x20, 0x64, 0x8d, 0xab, 0xa0, 0xd8, 0x04, 0x1a, 0x32, 0x89, 0x54, 0x87, 0x4e, 0xe7, 0x6b, 0x1f, 0xb7, 0x91, 0x61, 0xc4, 0x05, 0xf6, 0x41, 0x47, 0xd9, 0xfb, 0x31, 0xbf, 0xaf, 0xe9, 0xee, 0xb9, 0x57, +0x85, 0xb1, 0x65, 0x9e, 0xe3, 0x78, 0x22, 0x74, 0x43, 0xa4, 0x4a, 0xdc, 0xc5, 0x34, 0xdd, 0x97, 0x6a, 0xd0, 0xfd, 0xc6, 0xdb, 0x43, 0x03, 0x01, 0x78, 0x06, 0x18, 0x36, 0xb8, 0xb1, 0x5a, 0x28, 0xf9, 0x4d, 0xd2, 0xff, 0x8a, 0xd4, 0x89, 0xee, +0xc7, 0xa1, 0x4e, 0x70, 0xe4, 0x60, 0x91, 0xd9, 0xf4, 0x3a, 0xab, 0xc2, 0xce, 0xa6, 0x08, 0x54, 0x14, 0x51, 0x00, 0x25, 0xd8, 0xbd, 0xe1, 0xf0, 0x90, 0x7f, 0x88, 0x58, 0xb4, 0xef, 0x77, 0xa9, 0x12, 0x6e, 0x21, 0x13, 0xdc, 0x5c, 0x8b, 0xaa, +0x52, 0x4f, 0x24, 0x80, 0x31, 0xac, 0x2d, 0xe7, 0x10, 0xbb, 0x7a, 0x7e, 0x39, 0xc0, 0xa8, 0xaf, 0xfe, 0x37, 0x1e, 0x48, 0x4c, 0x46, 0x44, 0xe8, 0xca, 0x62, 0x98, 0x63, 0x66, 0x9b, 0x07, 0x27, 0xf1, 0x67, 0xd3, 0xfb, 0x95, 0x57, 0x93, 0x26, +0xd5, 0x9f, 0x3e, 0x35, 0xb3, 0xa4, 0xb6, 0x76, 0xc3, 0x7b, 0x30, 0x65, 0x42, 0xf5, 0x94, 0xcd, 0x09, 0x23, 0xf3, 0x50, 0xfc, 0x0c, 0xe5, 0x68, 0xb2, 0x0b, 0x02, 0x19, 0xa0, 0x73, 0x96, 0x55, 0x9c, 0x7c, 0x4b, 0x05, 0x6c, 0xc9, 0x1c, 0x6f, +0xc1, 0xed, 0x64, 0xa2, 0xb7, 0x2e, 0x38, 0x22, 0xbe, 0x0e, 0x1f, 0xb5, 0x20, 0x56, 0x8d, 0xcc, 0x79, 0x0d, 0xe9, 0x61, 0x40, 0x5f, 0xa3, 0x34, 0x2a, 0x2c, 0xcb, 0x6d, 0x1b, 0xf8, 0x84, 0xeb, 0xf7, 0x3c, 0x5e, 0x75, 0xfa, 0x87, 0xb9, 0xda, +0x47, 0x04, 0xf6, 0x4a, 0x97, 0x41, 0x16, 0x8c, 0x9d, 0xa7, 0x15, 0x92, 0x82, 0x3d, 0x5d, 0x0a, 0xdd, 0x8f, 0x53, 0x1a, 0xc8, 0x69, 0x5b, 0x45, 0xe6, 0xd1, 0x85, 0xbc, 0xf2, 0xb0, 0xd6, 0x0f, 0x59, 0x8e, 0x1d, 0x81, 0xc4, 0xae, 0x11, 0x7d, +0x2f, 0xd7, 0xa5, 0x2b, 0x33, 0xcf, 0x29, 0x49, 0x83, 0x86, 0xbf, 0x99, 0xad, 0x32, 0x74, 0x3f, 0xe3, 0xea, 0x17, 0x9e, 0xc5, 0xe2, 0xde, 0x9a, 0x3b, 0xba, 0xdf, 0x71, 0x6b, 0x72, 0xec, 0xe0, 0xeb, 0xfb, 0xd9, 0xe5, 0xe6, 0x90, 0x50, 0x05, +0xd2, 0x8e, 0x65, 0x37, 0x44, 0xb0, 0xa1, 0xdb, 0x1e, 0x82, 0x7d, 0x26, 0xae, 0x0c, 0x45, 0xd0, 0x6e, 0x03, 0xef, 0x0a, 0x19, 0x8f, 0xc1, 0xb2, 0xd7, 0x59, 0x80, 0x89, 0xe3, 0x8d, 0xd5, 0xf7, 0xfc, 0x06, 0x1c, 0xf6, 0x04, 0xac, 0x38, 0x5b, +0x76, 0x27, 0x72, 0xbd, 0x10, 0x0f, 0xf9, 0xfd, 0xdf, 0x97, 0x47, 0x96, 0x4e, 0x4f, 0x09, 0x8a, 0x57, 0xc3, 0x3d, 0x86, 0x56, 0x71, 0xa2, 0x9c, 0x7e, 0x79, 0xb8, 0xcc, 0xf3, 0xe1, 0x5e, 0xf1, 0x7f, 0x54, 0xb6, 0x4b, 0xbc, 0x4d, 0x83, 0x32, +0x5a, 0xca, 0x12, 0xec, 0xa4, 0xda, 0x4c, 0x2c, 0x70, 0x3e, 0xbe, 0x7c, 0x0b, 0xd6, 0xa9, 0x1b, 0x98, 0xa8, 0x58, 0x02, 0x94, 0x7b, 0x7a, 0x16, 0xc2, 0x91, 0x21, 0x39, 0xc0, 0x61, 0xb5, 0xdc, 0xc6, 0x9f, 0x48, 0xf8, 0x22, 0x36, 0xd1, 0xb3, +0xde, 0x63, 0x15, 0xfe, 0x25, 0xad, 0xea, 0x13, 0x6b, 0x0d, 0x67, 0x23, 0x78, 0x8b, 0x35, 0x08, 0xe8, 0x14, 0x68, 0x46, 0x20, 0xc8, 0x87, 0x42, 0x92, 0xed, 0xc7, 0x2e, 0x1a, 0x3a, 0x81, 0x4a, 0xcd, 0xa7, 0x34, 0xe4, 0x51, 0xd3, 0xbb, 0x31, +0xcf, 0x2b, 0xf4, 0x6f, 0x28, 0x9d, 0x5f, 0xbf, 0xff, 0xab, 0xc5, 0xf0, 0x1d, 0xb7, 0x0e, 0xb9, 0x00, 0xce, 0x73, 0x6d, 0x69, 0x66, 0x5c, 0x52, 0xb4, 0x41, 0x18, 0xc9, 0x29, 0x60, 0xf2, 0x9a, 0x84, 0x3c, 0xe2, 0xa3, 0x55, 0x43, 0x3b, 0x40, +0x2d, 0x88, 0xb1, 0x99, 0xaf, 0x49, 0xa0, 0x93, 0x6c, 0x33, 0xf5, 0xa5, 0xba, 0x64, 0xe7, 0x30, 0x62, 0x1f, 0xc4, 0x3f, 0xdd, 0x85, 0x9b, 0xd4, 0x24, 0x5d, 0xd8, 0xe9, 0x75, 0x07, 0x74, 0x8c, 0xa6, 0x6a, 0xfa, 0x53, 0x17, 0x9e, 0x95, 0x11, +0xaa, 0x01, 0xe0, 0x77, 0x2a, 0xcb, 0xee, 0x2f, 0xd8, 0x71, 0x91, 0x01, 0x70, 0x4c, 0x5c, 0xb8, 0xb0, 0xdd, 0x53, 0x66, 0x50, 0x29, 0x14, 0xaf, 0xf1, 0x97, 0x82, 0x8b, 0x64, 0x3d, 0x26, 0x0e, 0x84, 0x46, 0x81, 0x39, 0x6c, 0x42, 0x47, 0x0f, +0x15, 0x7c, 0x5d, 0x83, 0x76, 0x8f, 0xeb, 0x43, 0x78, 0x58, 0x52, 0x56, 0xcd, 0x22, 0xa4, 0xcc, 0x18, 0xec, 0xe3, 0x69, 0xba, 0x5b, 0x00, 0xb1, 0x35, 0x7a, 0xb5, 0xa7, 0xf0, 0x65, 0x45, 0x4a, 0x87, 0x3e, 0x9a, 0x03, 0x51, 0x1a, 0x6f, 0xc1, +0xee, 0xf7, 0xb2, 0xb7, 0xf9, 0x3f, 0x09, 0xca, 0xd3, 0xfa, 0x4b, 0x0b, 0xfc, 0x77, 0xdc, 0x9b, 0x95, 0xe2, 0xbd, 0x38, 0x98, 0x8d, 0xe4, 0x68, 0xf3, 0x4d, 0x6a, 0x55, 0xa5, 0x8a, 0xbb, 0x1b, 0x17, 0xdf, 0x9e, 0x2d, 0x0c, 0xd7, 0x0a, 0xd6, +0xf2, 0x4e, 0xc5, 0xaa, 0x20, 0x62, 0x6e, 0x54, 0xac, 0xfb, 0xcf, 0xf6, 0xe0, 0xe6, 0x7f, 0xa9, 0xcb, 0x3b, 0xea, 0xa0, 0xb9, 0x94, 0x7b, 0x79, 0x6b, 0xd1, 0xc3, 0x9d, 0x07, 0xc7, 0x3c, 0x9f, 0x02, 0x93, 0xa1, 0xc0, 0x31, 0x32, 0xff, 0x27, +0x61, 0x2c, 0xe5, 0x13, 0x90, 0xa8, 0x5a, 0x2b, 0xfd, 0x1f, 0xdb, 0xae, 0x05, 0x0d, 0xce, 0xd2, 0x44, 0x96, 0xe1, 0x85, 0xab, 0xed, 0x72, 0x80, 0xbf, 0x75, 0xd0, 0x86, 0x59, 0x1c, 0x7e, 0xfe, 0x73, 0x41, 0x21, 0x30, 0xc2, 0xc8, 0x04, 0x19, +0xde, 0xef, 0xa3, 0x37, 0xf8, 0x1d, 0xb3, 0xe7, 0x16, 0x06, 0x2f, 0xb4, 0x24, 0xe8, 0xc4, 0x3a, 0xd9, 0x25, 0x4f, 0xb6, 0x2e, 0x60, 0x88, 0xc9, 0x12, 0xa2, 0x08, 0xad, 0x67, 0x23, 0xc6, 0x48, 0xf5, 0x99, 0x63, 0x2a, 0x6d, 0xa6, 0x5f, 0x40, +0x36, 0xbe, 0x34, 0x57, 0x74, 0xd5, 0x89, 0x5e, 0xbc, 0x1e, 0xd4, 0xda, 0x11, 0x49, 0x9c, 0x33, 0x28, 0xe9, 0x8c, 0x7d, 0xf4, 0x8e, 0x92, 0x10, 0x1d, 0x5f, 0xcd, 0x62, 0x65, 0xce, 0x64, 0x52, 0x00, 0xff, 0x0b, 0x61, 0x41, 0xd4, 0xd2, 0xcf, +0x38, 0xd8, 0xf1, 0x36, 0x6c, 0x32, 0x1c, 0x71, 0x67, 0xf3, 0x19, 0xa0, 0xae, 0x03, 0x7f, 0xfb, 0x9d, 0xfa, 0xb1, 0x82, 0xfd, 0xb3, 0xde, 0x99, 0xbe, 0x86, 0xec, 0xa4, 0xb6, 0x8b, 0x5e, 0x45, 0x35, 0x31, 0xbc, 0x6e, 0x70, 0xa9, 0x2a, 0x97, +0x7c, 0x23, 0xda, 0x7e, 0x12, 0x2d, 0xe5, 0x89, 0xc1, 0x81, 0x0e, 0xf2, 0x92, 0xb0, 0x27, 0x0d, 0x6f, 0xf0, 0x4b, 0x29, 0x6d, 0xd5, 0x4c, 0x01, 0x3b, 0x68, 0xb4, 0xf7, 0xe3, 0xa5, 0x7b, 0x13, 0xdd, 0x16, 0xcb, 0x6b, 0x8f, 0xea, 0x72, 0x88, +0xf4, 0x21, 0x18, 0x44, 0x79, 0x77, 0xc6, 0x7a, 0x2b, 0x3a, 0xc2, 0x8d, 0x73, 0x58, 0x05, 0xa2, 0x90, 0xe9, 0x4d, 0xee, 0x5b, 0x9f, 0xcc, 0xac, 0x28, 0x7d, 0xc5, 0x1a, 0x43, 0x08, 0x4f, 0x1b, 0xb9, 0x4a, 0xdf, 0xc8, 0x20, 0x09, 0xb5, 0x42, +0x9e, 0x5c, 0x83, 0x75, 0xe1, 0x60, 0x80, 0x66, 0x5d, 0xaf, 0xfe, 0x11, 0xa6, 0xf6, 0xd3, 0x30, 0xd1, 0xad, 0xb8, 0x53, 0x91, 0x8e, 0xe8, 0xc7, 0x49, 0xeb, 0xf5, 0x9a, 0xbd, 0x2e, 0xa8, 0x78, 0xd9, 0x4e, 0x57, 0xba, 0x46, 0x74, 0x48, 0x5a, +0xdb, 0x2c, 0x0c, 0x85, 0x37, 0x8c, 0xa3, 0x63, 0x56, 0xf8, 0xef, 0x0a, 0x3f, 0x8a, 0xe4, 0xc0, 0x34, 0xc9, 0x59, 0xd6, 0x3d, 0x07, 0xc4, 0x9c, 0x33, 0x3c, 0x2f, 0x25, 0x94, 0xb7, 0xca, 0x98, 0x6a, 0xd0, 0xb2, 0x87, 0xed, 0x9b, 0xfc, 0x10, +0x76, 0x06, 0x39, 0x47, 0xe6, 0xd7, 0xbf, 0x26, 0xa1, 0xe0, 0x69, 0xe2, 0x1f, 0x24, 0x54, 0x40, 0x50, 0x3e, 0x04, 0x1e, 0xe7, 0x96, 0x84, 0xaa, 0x14, 0x93, 0xbb, 0x51, 0x02, 0x22, 0xa7, 0xc3, 0xab, 0x15, 0xdc, 0x95, 0x17, 0x0f, 0x55, 0xf9, +0xce, 0x76, 0x71, 0x40, 0x56, 0xda, 0xaf, 0x82, 0x39, 0xa1, 0x97, 0x79, 0x86, 0xbb, 0xd3, 0x66, 0x10, 0x9b, 0x81, 0x22, 0x4f, 0x29, 0xcc, 0x57, 0xd0, 0xab, 0x43, 0x31, 0xed, 0xfa, 0xe3, 0x24, 0x3e, 0x63, 0x89, 0x85, 0xea, 0x9c, 0xf3, 0xd1, +0x54, 0xef, 0x50, 0x1e, 0x47, 0x42, 0xc0, 0x51, 0x20, 0x07, 0x5a, 0xe8, 0x72, 0xad, 0xf4, 0xee, 0xb5, 0x0c, 0x88, 0x7e, 0xcb, 0xf7, 0xba, 0x34, 0xb4, 0x27, 0xf6, 0x2f, 0x01, 0x7c, 0xfc, 0x2d, 0xc4, 0x4e, 0xe2, 0x6a, 0x53, 0x69, 0x7b, 0x3d, +0xc6, 0xac, 0x6b, 0x80, 0xbe, 0x73, 0x8f, 0x15, 0x5f, 0x59, 0x2a, 0x36, 0xb1, 0xfe, 0xeb, 0xa2, 0x41, 0xe9, 0x83, 0xf9, 0x23, 0x1c, 0xbc, 0x8e, 0x1d, 0x78, 0xe6, 0xc5, 0xe7, 0xbd, 0xde, 0xd9, 0x05, 0xcd, 0x55, 0x03, 0xa3, 0x4c, 0xe5, 0x4a, +0x0b, 0xe1, 0xf5, 0xa9, 0x00, 0x9d, 0x5d, 0x87, 0xfb, 0xa8, 0xe4, 0x19, 0x4d, 0x6c, 0x28, 0xb6, 0x98, 0x44, 0x32, 0x77, 0x95, 0x91, 0xb8, 0x1a, 0x1f, 0xb3, 0xec, 0x4b, 0x96, 0xc7, 0xd6, 0x8d, 0x60, 0x09, 0x94, 0x65, 0xb0, 0x9f, 0x2e, 0x33, +0x8b, 0xb2, 0xd5, 0x37, 0xaa, 0xa5, 0xdc, 0x17, 0x0e, 0x99, 0x2b, 0x74, 0x02, 0x7a, 0x8a, 0x35, 0xf0, 0x11, 0x0f, 0xd8, 0xd2, 0x6e, 0xdd, 0xb9, 0x68, 0x5e, 0x7d, 0x9e, 0x3b, 0x25, 0x3a, 0x45, 0x75, 0xdb, 0x08, 0x30, 0xc8, 0x58, 0x48, 0xf8, +0x8c, 0xff, 0xc2, 0xc3, 0xbf, 0xcf, 0x84, 0x1b, 0x0a, 0x67, 0x9a, 0xa7, 0x26, 0xe0, 0x12, 0xca, 0x5b, 0xc9, 0x04, 0xd7, 0x92, 0xf2, 0x2c, 0x38, 0x3c, 0xd4, 0xa4, 0x13, 0xc1, 0xa6, 0x64, 0x93, 0x3f, 0x7f, 0x0d, 0xb7, 0x49, 0x61, 0x62, 0xae, +0xfd, 0x70, 0x21, 0x6d, 0xa0, 0x46, 0x90, 0x14, 0xf1, 0xdf, 0x06, 0x52, 0x6f, 0x18, 0x16, 0x5c, 0x65, 0xdd, 0x3b, 0x37, 0x1c, 0x46, 0x6c, 0x2a, 0x78, 0xee, 0x8e, 0xc5, 0x26, 0x28, 0x0c, 0x8a, 0x29, 0x2b, 0x17, 0xf7, 0x7d, 0x82, 0x41, 0xb5, +0x66, 0x01, 0x67, 0xd7, 0xdf, 0x03, 0x86, 0xd9, 0x33, 0x64, 0x92, 0x39, 0xc4, 0x69, 0x95, 0x6b, 0x3f, 0xe6, 0x45, 0xed, 0x49, 0xd8, 0x3d, 0x00, 0xea, 0x21, 0x6d, 0x4c, 0xce, 0xcf, 0xf1, 0xb1, 0x02, 0x76, 0xa5, 0xb4, 0x7c, 0x05, 0x13, 0x27, +0xa3, 0xde, 0x1f, 0x2d, 0x40, 0xfb, 0xad, 0x43, 0xe2, 0xfd, 0x5c, 0x79, 0x08, 0xcd, 0xd1, 0xf8, 0xda, 0x5d, 0xa7, 0x5e, 0xa6, 0xc7, 0x24, 0x4a, 0xf3, 0xca, 0x1a, 0xe7, 0xeb, 0x9b, 0x3c, 0xf0, 0xbc, 0x87, 0x94, 0x31, 0xd4, 0x0f, 0x11, 0x09, +0x72, 0x5f, 0x96, 0xe0, 0xa0, 0x83, 0xd2, 0x58, 0x62, 0xd5, 0x75, 0xdb, 0xa9, 0x0b, 0xe4, 0x9c, 0x71, 0xb3, 0xdc, 0xfa, 0x4e, 0xbb, 0xf4, 0x06, 0x7b, 0x91, 0xbd, 0xa1, 0x18, 0x7e, 0xcc, 0xd6, 0x90, 0x51, 0x85, 0x0a, 0x4b, 0x35, 0x47, 0x84, +0x1e, 0xa8, 0x68, 0x7a, 0x77, 0xb7, 0xe3, 0x1b, 0xb2, 0x9d, 0xd0, 0xaf, 0xae, 0x23, 0xac, 0xf6, 0x6e, 0x63, 0x6a, 0x8f, 0x4f, 0x20, 0x57, 0x99, 0xa2, 0x54, 0xb0, 0xcb, 0x73, 0xe9, 0x2f, 0xc0, 0xfc, 0xe8, 0x61, 0x16, 0x5a, 0x8d, 0x52, 0xfe, +0xf9, 0x1d, 0x7f, 0x93, 0x10, 0x42, 0x55, 0x9f, 0x53, 0x6f, 0xd3, 0x14, 0xc1, 0xab, 0xb9, 0xef, 0x97, 0xa4, 0x8b, 0x0e, 0xe5, 0x44, 0x2c, 0x88, 0xf2, 0xbf, 0x22, 0xff, 0xc6, 0x60, 0x89, 0xe1, 0x12, 0x80, 0x4d, 0x19, 0xb8, 0x04, 0x98, 0xc3, +0x3e, 0x9e, 0xc2, 0x0d, 0x2e, 0x25, 0xc8, 0x34, 0x36, 0xec, 0x07, 0x48, 0xf5, 0x56, 0x15, 0x32, 0xaa, 0x5b, 0x8c, 0xba, 0x3a, 0xbe, 0xb6, 0x70, 0x74, 0xc9, 0x38, 0x30, 0x59, 0x50, 0x9a, 0x81, 0x42, 0x1a, 0x48, 0xbd, 0xd6, 0x90, 0x72, 0xbf, +0xce, 0x9d, 0x29, 0xd8, 0x4d, 0xc2, 0x96, 0xe3, 0x77, 0xa1, 0xe5, 0x62, 0x85, 0x2d, 0x5d, 0x01, 0xe0, 0x5f, 0x4e, 0xf2, 0x66, 0xa8, 0xf9, 0xd9, 0x2e, 0xb0, 0xf0, 0x83, 0x30, 0x6e, 0x50, 0x5b, 0xb9, 0x59, 0xb8, 0xfc, 0x9e, 0x89, 0x0e, 0x23, +0x86, 0xf1, 0x6f, 0x98, 0x9b, 0x32, 0x5a, 0x69, 0x5c, 0x68, 0x7c, 0x3b, 0xc1, 0x73, 0x6a, 0xd1, 0x55, 0x14, 0xd4, 0x2c, 0x81, 0x22, 0xca, 0x52, 0x54, 0x34, 0x57, 0xe7, 0x13, 0x28, 0x1e, 0xee, 0x71, 0x64, 0xad, 0x41, 0xbe, 0x82, 0x20, 0x02, +0x43, 0x0f, 0xef, 0xaf, 0x51, 0x94, 0x4c, 0x79, 0xc7, 0x65, 0x3a, 0x6b, 0xcb, 0x19, 0xcf, 0x49, 0xd0, 0x6d, 0x21, 0xa3, 0x7e, 0xed, 0x2f, 0x33, 0xdd, 0xe4, 0x74, 0x97, 0xda, 0x04, 0x1f, 0xb4, 0x3c, 0x9a, 0xb5, 0xf7, 0x38, 0x3f, 0xc4, 0x2b, +0xec, 0x3d, 0xa6, 0xe9, 0xd5, 0x63, 0x58, 0xe6, 0xfe, 0x4f, 0x09, 0x11, 0x27, 0xfb, 0x67, 0xc0, 0x8f, 0xea, 0x00, 0x56, 0xa7, 0xf5, 0x75, 0x16, 0x84, 0x8e, 0xd3, 0xf6, 0x31, 0xfa, 0x06, 0x18, 0x2a, 0xbc, 0x8b, 0xc3, 0x99, 0x4a, 0x05, 0xab, +0xaa, 0xcc, 0xb2, 0x07, 0x47, 0x5e, 0xd2, 0xc9, 0xa0, 0x0d, 0x46, 0x45, 0x44, 0xa2, 0x10, 0xdc, 0x53, 0xa5, 0x7b, 0x26, 0x60, 0xf4, 0xd7, 0x0a, 0xff, 0x8d, 0x40, 0xf8, 0x95, 0xb3, 0xac, 0x35, 0x12, 0x4b, 0x76, 0x08, 0xc5, 0x03, 0xf3, 0x6c, +0xc8, 0x17, 0xe1, 0x70, 0xdf, 0xb1, 0x1b, 0x0b, 0x8c, 0xfd, 0x87, 0x8a, 0xc6, 0x92, 0x36, 0xde, 0xeb, 0x24, 0x7d, 0xe8, 0xbb, 0x25, 0xe2, 0xcd, 0x9f, 0x15, 0x7a, 0x91, 0x1d, 0xae, 0x7f, 0x80, 0x93, 0x37, 0x9c, 0x1c, 0x3e, 0xa9, 0x61, 0xb6, +0xba, 0x88, 0xa4, 0x39, 0xdb, 0xb7, 0x0c, 0x78, 0x13, 0xa0, 0x2d, 0x17, 0xe1, 0x70, 0xe7, 0x27, 0x51, 0x60, 0x1c, 0x58, 0xa4, 0xb6, 0x4e, 0xe6, 0x7d, 0xd9, 0xb1, 0xc9, 0x20, 0xbf, 0xa6, 0x72, 0xea, 0x5d, 0x75, 0x46, 0xdb, 0x47, 0xfb, 0xa8, +0x91, 0x1a, 0x00, 0x19, 0x3a, 0xc8, 0xcf, 0x99, 0xb4, 0x36, 0x01, 0x48, 0xe3, 0xdf, 0xa1, 0x63, 0x87, 0x0a, 0xab, 0x06, 0xaf, 0x98, 0xc6, 0x61, 0x2f, 0x84, 0xca, 0xb5, 0xb0, 0xd0, 0x86, 0x05, 0x65, 0x67, 0xd5, 0x23, 0x16, 0x10, 0x33, 0x8d, +0xb8, 0x57, 0x4f, 0xbb, 0x02, 0x43, 0x97, 0x0c, 0x79, 0xbd, 0x6f, 0xbc, 0x66, 0x50, 0xae, 0x8b, 0x0e, 0x5f, 0xce, 0xe5, 0x2b, 0xee, 0x41, 0xc5, 0xe8, 0xda, 0x3c, 0x34, 0x64, 0xfd, 0x85, 0x09, 0xdd, 0xd4, 0x21, 0x9a, 0xff, 0x77, 0x53, 0x0b, +0xd7, 0x49, 0xfa, 0xb9, 0x28, 0x25, 0x5c, 0x3b, 0x08, 0x6a, 0x2a, 0x59, 0xfc, 0xa3, 0x42, 0x8c, 0x92, 0x6d, 0x6c, 0xf6, 0xd2, 0x0d, 0xaa, 0x1e, 0xf5, 0x8e, 0x74, 0x94, 0xf4, 0xc4, 0xf0, 0xac, 0x03, 0x83, 0x71, 0x15, 0xe4, 0x22, 0x32, 0x1b, +0xc1, 0xef, 0x37, 0x9e, 0x54, 0x4b, 0xe9, 0x18, 0x96, 0x78, 0x45, 0x5e, 0xe0, 0xf3, 0x3e, 0x5b, 0x93, 0x2e, 0xc7, 0xba, 0xbe, 0x9c, 0x31, 0x0f, 0x1d, 0xa7, 0x7c, 0x7f, 0x7e, 0x11, 0x24, 0xf8, 0xb7, 0x69, 0xe2, 0xed, 0xcb, 0x7b, 0xf1, 0x14, +0x6e, 0x44, 0xdc, 0x81, 0x95, 0x4c, 0x26, 0x90, 0x8f, 0x88, 0x2c, 0xd6, 0xcd, 0x35, 0x9f, 0xa2, 0xd3, 0x56, 0x76, 0xd8, 0x6b, 0x89, 0x4a, 0x40, 0xc0, 0x62, 0x04, 0xa5, 0xcc, 0xf9, 0xc3, 0xeb, 0x82, 0x1f, 0x80, 0x55, 0xf7, 0xd1, 0x8a, 0x4d, +0x68, 0x3d, 0x9b, 0x29, 0x38, 0x52, 0x07, 0xf2, 0xb2, 0x9d, 0xfe, 0xa9, 0xc2, 0xb3, 0x73, 0x39, 0x12, 0xec, 0x30, 0xad, 0xde, 0x3f, 0x7a, 0x5a, 0x28, 0x6e, 0x0e, 0x62, 0x8b, 0xb6, 0x81, 0xab, 0x40, 0xb8, 0xd4, 0x89, 0x16, 0xdc, 0xd9, 0xa3, +0x0f, 0x58, 0x6b, 0x8a, 0xe9, 0x7f, 0x07, 0x4b, 0x0d, 0x19, 0x56, 0xd7, 0x5c, 0x73, 0x12, 0x32, 0x31, 0x18, 0xed, 0xc3, 0xa5, 0xbd, 0x7a, 0x99, 0x20, 0x7b, 0xb7, 0x50, 0xa2, 0x64, 0xc4, 0x6d, 0xe1, 0xcc, 0xcb, 0xdb, 0xda, 0xa7, 0x8d, 0x9e, +0xe8, 0x55, 0x0c, 0x69, 0xcd, 0x80, 0x9d, 0xd3, 0x03, 0x3f, 0x4a, 0x53, 0x39, 0xe3, 0x8e, 0x75, 0x41, 0xc6, 0x9b, 0x70, 0x44, 0x86, 0x7c, 0xf7, 0x79, 0x85, 0xbc, 0x84, 0x26, 0x82, 0x7e, 0x2d, 0x3d, 0x45, 0x63, 0xff, 0x3c, 0xf0, 0x9a, 0x6a, +0x3b, 0xfa, 0x59, 0x1c, 0x29, 0x24, 0xdd, 0xae, 0x57, 0x30, 0x94, 0xf6, 0xb3, 0x78, 0xcf, 0x1d, 0x42, 0xad, 0xea, 0x54, 0x01, 0x1b, 0x61, 0x92, 0x5b, 0x6f, 0xc8, 0xba, 0x77, 0x83, 0x00, 0x06, 0x48, 0xb9, 0x60, 0xe0, 0xa8, 0x3a, 0xc2, 0x68, +0x9f, 0xa4, 0xef, 0x09, 0xeb, 0xf4, 0x23, 0x47, 0x96, 0xfe, 0x2b, 0x14, 0xe7, 0xfc, 0x4e, 0x6c, 0x38, 0xd6, 0xee, 0xd0, 0x4d, 0xc7, 0x76, 0xa0, 0x2a, 0xce, 0x1a, 0x1f, 0xf5, 0x43, 0x10, 0x17, 0x13, 0xca, 0x02, 0xf8, 0xde, 0x66, 0xf2, 0xb5, +0x04, 0xd2, 0x5f, 0x2e, 0xe5, 0x49, 0xe2, 0xb2, 0x1e, 0x98, 0x52, 0x4c, 0xc9, 0x37, 0x8f, 0xc5, 0x34, 0x74, 0x90, 0xd8, 0xe4, 0xbb, 0xfd, 0xbe, 0x71, 0xbf, 0xc0, 0x5e, 0x4f, 0x8c, 0x21, 0xb1, 0xf1, 0xf3, 0x7d, 0xe6, 0x51, 0x25, 0x67, 0xaa, +0xdf, 0x35, 0xa9, 0xd5, 0x5a, 0xac, 0x33, 0x72, 0x46, 0xb4, 0xb0, 0xf9, 0x65, 0x0b, 0xfb, 0xec, 0x2f, 0x08, 0x5d, 0x36, 0xc1, 0x97, 0x0a, 0x88, 0x15, 0x2c, 0x22, 0x93, 0x11, 0xa6, 0xd1, 0x05, 0xaf, 0x9c, 0xa1, 0x3e, 0x87, 0x27, 0x91, 0x95, +0x5a, 0x17, 0x95, 0x65, 0x68, 0xc8, 0x96, 0x40, 0x91, 0x50, 0x24, 0x48, 0xae, 0x4a, 0xe7, 0xaf, 0xda, 0xfc, 0xe6, 0x22, 0xbe, 0x9b, 0xe4, 0x31, 0xb4, 0x1f, 0x94, 0xa4, 0x08, 0xe8, 0x81, 0x02, 0xf5, 0x62, 0x37, 0x6d, 0x54, 0xe1, 0x06, 0x07, +0xe2, 0x7a, 0x03, 0x73, 0x53, 0xec, 0xbb, 0x98, 0x72, 0x93, 0x8f, 0x60, 0xf0, 0x6b, 0x45, 0x33, 0xa0, 0x2b, 0xb6, 0x70, 0x59, 0x3d, 0xdb, 0x8d, 0x14, 0x3f, 0xcf, 0x3a, 0x61, 0x34, 0x6c, 0xa9, 0xeb, 0x5f, 0x52, 0xff, 0xbc, 0x8b, 0xd9, 0x26, +0xc0, 0x71, 0x2e, 0x46, 0x0a, 0x1a, 0x16, 0xea, 0x6e, 0x29, 0x2d, 0xee, 0xdd, 0x0f, 0x83, 0x49, 0x27, 0xd1, 0x3c, 0x76, 0x88, 0xa7, 0x99, 0x9f, 0x12, 0xe3, 0x8c, 0xc5, 0xfd, 0xc1, 0x25, 0x0b, 0x6a, 0x66, 0xd6, 0x21, 0xa1, 0x80, 0xc6, 0x55, +0x36, 0xcb, 0x23, 0xf2, 0x39, 0x4f, 0x2a, 0xc2, 0xc7, 0xac, 0x8a, 0xb1, 0x7d, 0x9a, 0x82, 0x05, 0x5e, 0x0e, 0x1b, 0x6f, 0x1e, 0xed, 0xcd, 0x5b, 0xab, 0x32, 0x9d, 0x18, 0x5d, 0x57, 0x1d, 0x15, 0x0c, 0xd2, 0xb8, 0xaa, 0xb5, 0xf1, 0x63, 0x86, +0x74, 0xa3, 0x51, 0xfe, 0x30, 0x56, 0xf3, 0x9e, 0xdf, 0x7c, 0x00, 0xd8, 0x3b, 0x87, 0x04, 0xcc, 0xba, 0xe5, 0x97, 0x90, 0x44, 0x79, 0xde, 0xad, 0x01, 0xef, 0xd3, 0x4c, 0x58, 0x20, 0x9c, 0xf9, 0x2f, 0x8e, 0x41, 0x19, 0x4e, 0x47, 0x5c, 0x69, +0xc9, 0x09, 0xd7, 0xd4, 0xd0, 0xbf, 0xf8, 0x4b, 0xdc, 0xc4, 0x7e, 0x85, 0x2c, 0x42, 0x38, 0x92, 0xb0, 0x84, 0xf4, 0x75, 0x35, 0xb3, 0xce, 0xb2, 0xbd, 0xe0, 0x1c, 0x7b, 0xe9, 0x77, 0x7f, 0xa6, 0xfb, 0xa8, 0xca, 0xb7, 0xd5, 0xf7, 0x3e, 0x89, +0x43, 0xfa, 0x64, 0x13, 0x0d, 0x10, 0xa5, 0xb9, 0x78, 0x11, 0x28, 0x67, 0xc3, 0x4d, 0xf6, 0xa2, 0x1d, 0x80, 0xb3, 0xe5, 0x95, 0x6f, 0x2e, 0x3c, 0xbc, 0x2f, 0xe7, 0xa1, 0x33, 0xc8, 0xe9, 0x10, 0xdc, 0x97, 0x4c, 0xcd, 0x30, 0xfc, 0x35, 0xdd, +0x08, 0x8d, 0xaf, 0x7b, 0x20, 0x91, 0x7c, 0x1c, 0xed, 0x7f, 0xf2, 0x2a, 0x12, 0x6c, 0xe0, 0xa8, 0x6e, 0x09, 0x65, 0xdf, 0x07, 0xc2, 0xda, 0x73, 0x0b, 0xb5, 0x7e, 0x81, 0x85, 0x0d, 0xe6, 0x9b, 0x5c, 0x8a, 0x3e, 0x98, 0xf1, 0x5e, 0xdb, 0x31, +0x48, 0xfa, 0x39, 0x05, 0x90, 0xba, 0xd1, 0x11, 0x02, 0xb7, 0xeb, 0x53, 0xe2, 0x89, 0x2b, 0x4a, 0x58, 0x56, 0xfd, 0xad, 0xf3, 0xca, 0x92, 0x2d, 0x27, 0x86, 0x83, 0x1f, 0xef, 0xc0, 0x52, 0xf5, 0xf0, 0xab, 0xff, 0x96, 0x8e, 0x01, 0xb4, 0x66, +0x88, 0xd7, 0xc4, 0xcb, 0x04, 0x21, 0x76, 0xf6, 0x1a, 0x5b, 0x23, 0xc3, 0xf8, 0x74, 0x72, 0x9c, 0x32, 0x22, 0xb6, 0x6b, 0x60, 0xd9, 0xa7, 0xbd, 0x70, 0x6d, 0x36, 0x9a, 0x28, 0x99, 0xe3, 0x2c, 0x46, 0xa4, 0x3d, 0x45, 0x67, 0x47, 0xea, 0x41, +0x9f, 0xb9, 0x17, 0x0e, 0x93, 0xae, 0x71, 0x40, 0xb1, 0x5d, 0xa6, 0xe1, 0x84, 0xa3, 0x62, 0xec, 0x18, 0xee, 0x61, 0xbe, 0x82, 0x8b, 0xc9, 0xf7, 0xa2, 0x8f, 0x14, 0x8c, 0x37, 0x4e, 0xf9, 0x0a, 0x26, 0xc1, 0x3f, 0xe4, 0xb2, 0x25, 0x1b, 0xd0, +0x79, 0x3a, 0xa9, 0xc6, 0xf4, 0xa5, 0x19, 0xe8, 0x15, 0x78, 0x57, 0x43, 0x4b, 0xbb, 0xde, 0xd5, 0x77, 0x5f, 0x49, 0xfe, 0x0c, 0x7d, 0xd8, 0x75, 0x3b, 0xce, 0xcf, 0x4d, 0x44, 0x9d, 0x13, 0x29, 0x54, 0x06, 0xb8, 0xd4, 0x16, 0xcc, 0x68, 0xa0, +0x50, 0xbf, 0x1e, 0x42, 0x51, 0x59, 0x69, 0x7a, 0x4f, 0xc5, 0xd2, 0x03, 0xd6, 0xc7, 0x87, 0xfb, 0x9e, 0x34, 0x0f, 0xaa, 0x94, 0x63, 0x24, 0x64, 0x5a, 0x38, 0xb0, 0x55, 0x00, 0xd3, 0xac, 0x6a, 0x89, 0x5c, 0xf4, 0x35, 0x32, 0xc0, 0x50, 0xb9, +0x75, 0x0e, 0x1d, 0x25, 0xf0, 0x6b, 0x60, 0x10, 0x86, 0x88, 0x72, 0x61, 0x18, 0x48, 0x36, 0x3e, 0xaf, 0x77, 0x45, 0x78, 0x55, 0xc7, 0xff, 0xce, 0xe2, 0x9e, 0xae, 0x0f, 0xe3, 0xf2, 0x64, 0xf8, 0xad, 0x8a, 0xdc, 0x66, 0x41, 0xcf, 0x17, 0x70, +0x34, 0x2b, 0xc4, 0x0d, 0x0b, 0x20, 0x4d, 0x87, 0x06, 0x4c, 0x99, 0xef, 0xb7, 0x3a, 0x01, 0x4f, 0x6a, 0xda, 0xfe, 0xe9, 0x00, 0x73, 0xd7, 0x74, 0x6f, 0x65, 0xdd, 0xa9, 0x4a, 0xee, 0xe1, 0x82, 0x6e, 0xf6, 0xdb, 0x3d, 0x24, 0x09, 0xeb, 0x8b, +0xf5, 0xa7, 0xb1, 0x31, 0xb4, 0xd8, 0x16, 0x33, 0x12, 0xde, 0x7d, 0xa2, 0xc5, 0x2d, 0x49, 0xbf, 0x67, 0xb5, 0x46, 0xb3, 0x76, 0xf9, 0x52, 0xd0, 0xa1, 0xfc, 0x97, 0xc3, 0xb6, 0x27, 0x02, 0xe4, 0x7f, 0xc2, 0xa4, 0xd1, 0xd5, 0x8d, 0x6c, 0xea, +0x69, 0x5d, 0x9f, 0xaa, 0x9b, 0x8e, 0x1b, 0x28, 0xd3, 0x38, 0xe7, 0x3b, 0x22, 0x6d, 0xc1, 0x5f, 0x11, 0xb8, 0x0a, 0xe6, 0x92, 0x57, 0x0c, 0x4b, 0x7c, 0x53, 0x51, 0x80, 0xa3, 0x04, 0x71, 0xfb, 0x98, 0xbe, 0x9c, 0xd4, 0x1e, 0x07, 0xfa, 0x84, +0x26, 0x7a, 0xba, 0x83, 0xcc, 0x23, 0xf1, 0x4e, 0xca, 0x93, 0x9a, 0x81, 0x5e, 0xc8, 0x79, 0xe0, 0xa6, 0x1a, 0x47, 0x40, 0x7e, 0x9d, 0xbc, 0x14, 0xd6, 0xd2, 0x1f, 0x85, 0xcd, 0x30, 0xbd, 0xbb, 0xdf, 0x1c, 0xe5, 0xb0, 0x68, 0x44, 0xed, 0x2f, +0xf7, 0x2e, 0x3f, 0x56, 0x29, 0x13, 0x62, 0x39, 0x96, 0xa8, 0x43, 0x08, 0xac, 0xa5, 0x21, 0xa0, 0xc6, 0xc9, 0x03, 0xd9, 0x05, 0x5a, 0x59, 0x91, 0x37, 0xb2, 0x63, 0x90, 0x8f, 0x5b, 0xec, 0x95, 0x7b, 0x58, 0xcb, 0x2a, 0xab, 0x94, 0xf3, 0x8c, +0x42, 0x54, 0x3c, 0x15, 0xfd, 0x19, 0x2c, 0xe8, 0xd3, 0xfd, 0x06, 0x6d, 0x9c, 0x49, 0xa3, 0xca, 0x41, 0x4b, 0xe1, 0x30, 0x89, 0xab, 0xbf, 0x4f, 0x48, 0x24, 0x95, 0x0b, 0x92, 0x65, 0xae, 0xea, 0xc1, 0x78, 0x68, 0xeb, 0x2a, 0x7a, 0xc2, 0xc4, +0xb4, 0xb6, 0xf3, 0xe7, 0x80, 0xff, 0x5f, 0x4e, 0x51, 0xf9, 0xfc, 0x73, 0xa2, 0xaf, 0xe2, 0x5a, 0xb2, 0x8b, 0x46, 0xfb, 0xcb, 0x16, 0x91, 0x3f, 0xf8, 0x5d, 0x11, 0xd6, 0xed, 0x37, 0x0c, 0x13, 0x36, 0x8c, 0x6a, 0x7c, 0x4a, 0xb0, 0x26, 0x63, +0x03, 0x23, 0xc8, 0x05, 0x77, 0xa8, 0xdc, 0x85, 0x34, 0x76, 0x38, 0x69, 0x57, 0xb1, 0x55, 0x4c, 0xf2, 0xbc, 0xb8, 0x6c, 0xe3, 0x0e, 0xcf, 0x47, 0x6e, 0x67, 0x20, 0x50, 0xe0, 0x98, 0xb5, 0xdd, 0x22, 0x74, 0xa6, 0xbe, 0x81, 0x44, 0x7d, 0xde, +0x9a, 0x4d, 0xcc, 0x33, 0x8d, 0xb9, 0x2b, 0x96, 0xe4, 0x27, 0x5b, 0x66, 0xc3, 0x99, 0x43, 0x2c, 0xd9, 0xe8, 0x35, 0x19, 0x62, 0x21, 0x94, 0xee, 0xa9, 0x17, 0xd8, 0xc6, 0x25, 0x45, 0xd2, 0xc7, 0x64, 0xf1, 0x54, 0xc9, 0x8a, 0x9d, 0xf0, 0x59, +0xce, 0xf6, 0x0f, 0x31, 0xec, 0x3c, 0x93, 0x71, 0x1b, 0x9e, 0xe9, 0x9f, 0xad, 0xd0, 0x8e, 0x2e, 0xe5, 0x14, 0x08, 0x8f, 0x1f, 0x39, 0x7b, 0x2f, 0x00, 0x1c, 0x10, 0xbb, 0x12, 0x84, 0xa0, 0x56, 0xba, 0x5e, 0x7f, 0x18, 0x09, 0x28, 0xc5, 0xd7, +0xf5, 0x7e, 0x83, 0x29, 0xdf, 0xf4, 0x1d, 0xd5, 0x5c, 0x04, 0x72, 0xcd, 0xa4, 0x3b, 0x2d, 0x3d, 0x90, 0x42, 0x0d, 0x0a, 0xd4, 0x61, 0x02, 0x01, 0x3e, 0x53, 0x07, 0xb3, 0xfe, 0x82, 0xdb, 0x3a, 0x52, 0xac, 0xbd, 0xa7, 0xda, 0x40, 0x88, 0x86, +0xa5, 0x79, 0x32, 0x60, 0x97, 0x6f, 0xb7, 0xf7, 0x70, 0xfa, 0x75, 0xd1, 0x15, 0x1e, 0xa1, 0x1a, 0xe6, 0x87, 0x6b, 0xef, 0x9b, 0xc0, 0x58, 0xaa, 0xc4, 0x83, 0x38, 0x23, 0xca, 0x11, 0x85, 0xb2, 0xe8, 0x76, 0xc5, 0xfc, 0x7c, 0xbb, 0xa7, 0x1e, +0x2d, 0x9b, 0xda, 0x0c, 0x43, 0x87, 0x3f, 0x74, 0xd6, 0x96, 0xc0, 0x5f, 0x86, 0x4e, 0x98, 0x02, 0x2f, 0xef, 0xf6, 0xd2, 0x71, 0xf1, 0xdc, 0x5a, 0x6e, 0x4f, 0xa0, 0x42, 0x7f, 0x68, 0x04, 0xf2, 0xfd, 0x34, 0xa5, 0xad, 0x81, 0xba, 0xaf, 0xde, +0xf7, 0x4d, 0x15, 0x65, 0xcc, 0x9a, 0xd5, 0x18, 0xd3, 0x5d, 0xea, 0x91, 0x8f, 0x44, 0xee, 0xbd, 0x1d, 0x36, 0x75, 0x7b, 0x99, 0x61, 0xcd, 0xdd, 0x7d, 0x17, 0x94, 0x3b, 0x53, 0x20, 0x21, 0xed, 0x5b, 0xfe, 0xc8, 0x4b, 0xb4, 0xd8, 0x35, 0x88, +0xb0, 0x8c, 0x48, 0x3a, 0x77, 0x78, 0x08, 0xf5, 0xa1, 0xb9, 0xc6, 0xe6, 0x06, 0x10, 0xf9, 0xf0, 0x07, 0xec, 0x8b, 0x64, 0x28, 0x29, 0xa8, 0x80, 0xfb, 0x52, 0xce, 0x58, 0x70, 0x62, 0x39, 0xe9, 0x50, 0x24, 0xa4, 0x26, 0xe4, 0x6d, 0x54, 0xb1, +0x6f, 0x27, 0x40, 0xa6, 0x4a, 0xc2, 0x8a, 0xd0, 0x2a, 0x6b, 0xb7, 0xd9, 0xaa, 0x0b, 0x7e, 0x97, 0x47, 0x59, 0x6c, 0x9d, 0x45, 0x33, 0x67, 0x56, 0x0d, 0x3d, 0x9f, 0x66, 0xf8, 0xcb, 0x5e, 0x16, 0x5c, 0x31, 0x32, 0xb6, 0xdf, 0x55, 0x22, 0x25, +0x9e, 0xe7, 0xc7, 0x92, 0x60, 0xd1, 0x1a, 0xd4, 0xc3, 0xbc, 0x7a, 0x13, 0x41, 0x63, 0x93, 0x2b, 0x72, 0x51, 0x84, 0xbe, 0x05, 0x49, 0x6a, 0xac, 0xc9, 0x4c, 0x37, 0x1b, 0x01, 0xbf, 0xa9, 0x2e, 0x69, 0xe5, 0x3c, 0x30, 0xb3, 0x9c, 0xe0, 0x03, +0x46, 0xab, 0x95, 0xfa, 0x0a, 0x3e, 0x19, 0x00, 0xeb, 0x8e, 0xf3, 0xb5, 0x82, 0x0f, 0xf4, 0x2c, 0x79, 0x89, 0xa3, 0xae, 0x1f, 0x0e, 0x14, 0xc1, 0xe2, 0xcf, 0xff, 0xa2, 0x90, 0x8d, 0xd7, 0xe1, 0xb8, 0x1c, 0xdb, 0x09, 0xe3, 0x57, 0x73, 0x12, +0x40, 0xee, 0xc7, 0x49, 0xd3, 0x07, 0x7e, 0x10, 0x1b, 0xad, 0x96, 0xc6, 0x8d, 0xb7, 0x57, 0x80, 0x77, 0x87, 0x56, 0x94, 0x08, 0x78, 0xe6, 0x54, 0x3c, 0xaf, 0x27, 0x58, 0x16, 0xdc, 0x99, 0xb9, 0x9b, 0x2e, 0x05, 0x88, 0xf3, 0x17, 0x6b, 0x1a, +0x12, 0xa3, 0x36, 0xc4, 0xca, 0x37, 0x89, 0x14, 0x8b, 0x73, 0x5e, 0xdf, 0x0b, 0x3a, 0x8a, 0xfd, 0xce, 0x6c, 0x82, 0x4a, 0x75, 0xe9, 0xe8, 0x6f, 0xfa, 0x53, 0xc1, 0x8c, 0xb1, 0x35, 0x4e, 0xd6, 0x76, 0x2a, 0xec, 0xcd, 0x0c, 0xf8, 0x9e, 0x4c, +0x01, 0x55, 0x0d, 0x81, 0x45, 0xef, 0x3d, 0x26, 0xfb, 0x8f, 0x5f, 0x1c, 0xd4, 0x7b, 0x38, 0xe4, 0x7c, 0x48, 0x21, 0x43, 0x9a, 0x23, 0x25, 0x95, 0x8e, 0x32, 0x63, 0xeb, 0x28, 0xcf, 0x02, 0xbf, 0x7f, 0xa0, 0xbb, 0xba, 0x91, 0x93, 0xed, 0xa5, +0x04, 0x84, 0xc9, 0xa1, 0x2f, 0x19, 0xfc, 0x2d, 0x41, 0xc8, 0x2c, 0x0a, 0xb8, 0x74, 0xf1, 0x7a, 0x31, 0x4b, 0xb3, 0x9c, 0x09, 0x5b, 0x50, 0x67, 0x1f, 0xa8, 0x0f, 0x18, 0x15, 0x20, 0xcb, 0xaa, 0xde, 0xcc, 0xd1, 0xa4, 0xe2, 0xe5, 0xac, 0x00, +0xf9, 0x39, 0xf0, 0xa9, 0x34, 0x69, 0xf5, 0xe1, 0x1e, 0x66, 0xd5, 0x3e, 0x60, 0x6a, 0xdb, 0x22, 0x03, 0x06, 0x2b, 0x92, 0x5c, 0xb0, 0x13, 0x90, 0x6e, 0x83, 0x97, 0x62, 0xda, 0xe3, 0x24, 0x6d, 0x30, 0xa2, 0x9f, 0xbd, 0xd8, 0x86, 0xf6, 0xff, +0x79, 0x68, 0xd0, 0x0e, 0xfe, 0x33, 0x9d, 0xc2, 0x71, 0xb5, 0xc0, 0x1d, 0xb6, 0x70, 0xf2, 0xbc, 0xc5, 0xc3, 0xf4, 0x3f, 0x59, 0xa6, 0x5d, 0xb4, 0x46, 0xdd, 0xe7, 0xa7, 0x85, 0x65, 0x61, 0x4d, 0x4f, 0x64, 0xf7, 0x51, 0xe0, 0x11, 0x42, 0x7d, +0xab, 0xd2, 0x44, 0x47, 0xea, 0x98, 0xbe, 0xd9, 0x72, 0x29, 0xd7, 0xb2, 0xae, 0x3b, 0x5a, 0x52, ] + +d0x6a0d4e80=[ 0x00000000, 0xe4e4489f, 0x77e2fbc4, 0x9306b35b, 0xe8eafbc9, 0x0c0eb356, 0x9f08000d, 0x7bec4892, 0x4e720732, 0xaa964fad, 0x3990fcf6, 0xdd74b469, 0xa698fcfb, 0x427cb464, 0xd17a073f, 0x359e4fa0, 0x0f5d7917, 0xebb93188, 0x78bf82d3, 0x9c5bca4c, +0xe7b782de, 0x0353ca41, 0x9055791a, 0x74b13185, 0x412f7e25, 0xa5cb36ba, 0x36cd85e1, 0xd229cd7e, 0xa9c585ec, 0x4d21cd73, 0xde277e28, 0x3ac336b7, 0x300209b0, 0xd4e6412f, 0x47e0f274, 0xa304baeb, 0xd8e8f279, 0x3c0cbae6, 0xaf0a09bd, 0x4bee4122, +0x7e700e82, 0x9a94461d, 0x0992f546, 0xed76bdd9, 0x969af54b, 0x727ebdd4, 0xe1780e8f, 0x059c4610, 0x3f5f70a7, 0xdbbb3838, 0x48bd8b63, 0xac59c3fc, 0xd7b58b6e, 0x3351c3f1, 0xa05770aa, 0x44b33835, 0x712d7795, 0x95c93f0a, 0x06cf8c51, 0xe22bc4ce, +0x99c78c5c, 0x7d23c4c3, 0xee257798, 0x0ac13f07, 0xbdc60735, 0x59224faa, 0xca24fcf1, 0x2ec0b46e, 0x552cfcfc, 0xb1c8b463, 0x22ce0738, 0xc62a4fa7, 0xf3b40007, 0x17504898, 0x8456fbc3, 0x60b2b35c, 0x1b5efbce, 0xffbab351, 0x6cbc000a, 0x88584895, +0xb29b7e22, 0x567f36bd, 0xc57985e6, 0x219dcd79, 0x5a7185eb, 0xbe95cd74, 0x2d937e2f, 0xc97736b0, 0xfce97910, 0x180d318f, 0x8b0b82d4, 0x6fefca4b, 0x140382d9, 0xf0e7ca46, 0x63e1791d, 0x87053182, 0x8dc40e85, 0x6920461a, 0xfa26f541, 0x1ec2bdde, +0x652ef54c, 0x81cabdd3, 0x12cc0e88, 0xf6284617, 0xc3b609b7, 0x27524128, 0xb454f273, 0x50b0baec, 0x2b5cf27e, 0xcfb8bae1, 0x5cbe09ba, 0xb85a4125, 0x82997792, 0x667d3f0d, 0xf57b8c56, 0x119fc4c9, 0x6a738c5b, 0x8e97c4c4, 0x1d91779f, 0xf9753f00, +0xcceb70a0, 0x280f383f, 0xbb098b64, 0x5fedc3fb, 0x24018b69, 0xc0e5c3f6, 0x53e370ad, 0xb7073832, 0x09699620, 0xed8ddebf, 0x7e8b6de4, 0x9a6f257b, 0xe1836de9, 0x05672576, 0x9661962d, 0x7285deb2, 0x471b9112, 0xa3ffd98d, 0x30f96ad6, 0xd41d2249, +0xaff16adb, 0x4b152244, 0xd813911f, 0x3cf7d980, 0x0634ef37, 0xe2d0a7a8, 0x71d614f3, 0x95325c6c, 0xeede14fe, 0x0a3a5c61, 0x993cef3a, 0x7dd8a7a5, 0x4846e805, 0xaca2a09a, 0x3fa413c1, 0xdb405b5e, 0xa0ac13cc, 0x44485b53, 0xd74ee808, 0x33aaa097, +0x396b9f90, 0xdd8fd70f, 0x4e896454, 0xaa6d2ccb, 0xd1816459, 0x35652cc6, 0xa6639f9d, 0x4287d702, 0x771998a2, 0x93fdd03d, 0x00fb6366, 0xe41f2bf9, 0x9ff3636b, 0x7b172bf4, 0xe81198af, 0x0cf5d030, 0x3636e687, 0xd2d2ae18, 0x41d41d43, 0xa53055dc, +0xdedc1d4e, 0x3a3855d1, 0xa93ee68a, 0x4ddaae15, 0x7844e1b5, 0x9ca0a92a, 0x0fa61a71, 0xeb4252ee, 0x90ae1a7c, 0x744a52e3, 0xe74ce1b8, 0x03a8a927, 0xb4af9115, 0x504bd98a, 0xc34d6ad1, 0x27a9224e, 0x5c456adc, 0xb8a12243, 0x2ba79118, 0xcf43d987, +0xfadd9627, 0x1e39deb8, 0x8d3f6de3, 0x69db257c, 0x12376dee, 0xf6d32571, 0x65d5962a, 0x8131deb5, 0xbbf2e802, 0x5f16a09d, 0xcc1013c6, 0x28f45b59, 0x531813cb, 0xb7fc5b54, 0x24fae80f, 0xc01ea090, 0xf580ef30, 0x1164a7af, 0x826214f4, 0x66865c6b, +0x1d6a14f9, 0xf98e5c66, 0x6a88ef3d, 0x8e6ca7a2, 0x84ad98a5, 0x6049d03a, 0xf34f6361, 0x17ab2bfe, 0x6c47636c, 0x88a32bf3, 0x1ba598a8, 0xff41d037, 0xcadf9f97, 0x2e3bd708, 0xbd3d6453, 0x59d92ccc, 0x2235645e, 0xc6d12cc1, 0x55d79f9a, 0xb133d705, +0x8bf0e1b2, 0x6f14a92d, 0xfc121a76, 0x18f652e9, 0x631a1a7b, 0x87fe52e4, 0x14f8e1bf, 0xf01ca920, 0xc582e680, 0x2166ae1f, 0xb2601d44, 0x568455db, 0x2d681d49, 0xc98c55d6, 0x5a8ae68d, 0xbe6eae12, 0x00000000, 0x1e650f36, 0x3690e458, 0x28f5eb6e, +0x2f4b4170, 0x312e4e46, 0x19dba528, 0x07beaa1e, 0x9a5fa4b2, 0x843aab84, 0xaccf40ea, 0xb2aa4fdc, 0xb514e5c2, 0xab71eaf4, 0x8384019a, 0x9de10eac, 0x0a38f086, 0x145dffb0, 0x3ca814de, 0x22cd1be8, 0x2573b1f6, 0x3b16bec0, 0x13e355ae, 0x0d865a98, +0x90675434, 0x8e025b02, 0xa6f7b06c, 0xb892bf5a, 0xbf2c1544, 0xa1491a72, 0x89bcf11c, 0x97d9fe2a, 0x013ae8ba, 0x1f5fe78c, 0x37aa0ce2, 0x29cf03d4, 0x2e71a9ca, 0x3014a6fc, 0x18e14d92, 0x068442a4, 0x9b654c08, 0x8500433e, 0xadf5a850, 0xb390a766, +0xb42e0d78, 0xaa4b024e, 0x82bee920, 0x9cdbe616, 0x0b02183c, 0x1567170a, 0x3d92fc64, 0x23f7f352, 0x2449594c, 0x3a2c567a, 0x12d9bd14, 0x0cbcb222, 0x915dbc8e, 0x8f38b3b8, 0xa7cd58d6, 0xb9a857e0, 0xbe16fdfe, 0xa073f2c8, 0x888619a6, 0x96e31690, +0x175e7470, 0x093b7b46, 0x21ce9028, 0x3fab9f1e, 0x38153500, 0x26703a36, 0x0e85d158, 0x10e0de6e, 0x8d01d0c2, 0x9364dff4, 0xbb91349a, 0xa5f43bac, 0xa24a91b2, 0xbc2f9e84, 0x94da75ea, 0x8abf7adc, 0x1d6684f6, 0x03038bc0, 0x2bf660ae, 0x35936f98, +0x322dc586, 0x2c48cab0, 0x04bd21de, 0x1ad82ee8, 0x87392044, 0x995c2f72, 0xb1a9c41c, 0xafcccb2a, 0xa8726134, 0xb6176e02, 0x9ee2856c, 0x80878a5a, 0x16649cca, 0x080193fc, 0x20f47892, 0x3e9177a4, 0x392fddba, 0x274ad28c, 0x0fbf39e2, 0x11da36d4, +0x8c3b3878, 0x925e374e, 0xbaabdc20, 0xa4ced316, 0xa3707908, 0xbd15763e, 0x95e09d50, 0x8b859266, 0x1c5c6c4c, 0x0239637a, 0x2acc8814, 0x34a98722, 0x33172d3c, 0x2d72220a, 0x0587c964, 0x1be2c652, 0x8603c8fe, 0x9866c7c8, 0xb0932ca6, 0xaef62390, +0xa948898e, 0xb72d86b8, 0x9fd86dd6, 0x81bd62e0, 0x0a0ee27c, 0x146bed4a, 0x3c9e0624, 0x22fb0912, 0x2545a30c, 0x3b20ac3a, 0x13d54754, 0x0db04862, 0x905146ce, 0x8e3449f8, 0xa6c1a296, 0xb8a4ada0, 0xbf1a07be, 0xa17f0888, 0x898ae3e6, 0x97efecd0, +0x003612fa, 0x1e531dcc, 0x36a6f6a2, 0x28c3f994, 0x2f7d538a, 0x31185cbc, 0x19edb7d2, 0x0788b8e4, 0x9a69b648, 0x840cb97e, 0xacf95210, 0xb29c5d26, 0xb522f738, 0xab47f80e, 0x83b21360, 0x9dd71c56, 0x0b340ac6, 0x155105f0, 0x3da4ee9e, 0x23c1e1a8, +0x247f4bb6, 0x3a1a4480, 0x12efafee, 0x0c8aa0d8, 0x916bae74, 0x8f0ea142, 0xa7fb4a2c, 0xb99e451a, 0xbe20ef04, 0xa045e032, 0x88b00b5c, 0x96d5046a, 0x010cfa40, 0x1f69f576, 0x379c1e18, 0x29f9112e, 0x2e47bb30, 0x3022b406, 0x18d75f68, 0x06b2505e, +0x9b535ef2, 0x853651c4, 0xadc3baaa, 0xb3a6b59c, 0xb4181f82, 0xaa7d10b4, 0x8288fbda, 0x9cedf4ec, 0x1d50960c, 0x0335993a, 0x2bc07254, 0x35a57d62, 0x321bd77c, 0x2c7ed84a, 0x048b3324, 0x1aee3c12, 0x870f32be, 0x996a3d88, 0xb19fd6e6, 0xaffad9d0, +0xa84473ce, 0xb6217cf8, 0x9ed49796, 0x80b198a0, 0x1768668a, 0x090d69bc, 0x21f882d2, 0x3f9d8de4, 0x382327fa, 0x264628cc, 0x0eb3c3a2, 0x10d6cc94, 0x8d37c238, 0x9352cd0e, 0xbba72660, 0xa5c22956, 0xa27c8348, 0xbc198c7e, 0x94ec6710, 0x8a896826, +0x1c6a7eb6, 0x020f7180, 0x2afa9aee, 0x349f95d8, 0x33213fc6, 0x2d4430f0, 0x05b1db9e, 0x1bd4d4a8, 0x8635da04, 0x9850d532, 0xb0a53e5c, 0xaec0316a, 0xa97e9b74, 0xb71b9442, 0x9fee7f2c, 0x818b701a, 0x16528e30, 0x08378106, 0x20c26a68, 0x3ea7655e, +0x3919cf40, 0x277cc076, 0x0f892b18, 0x11ec242e, 0x8c0d2a82, 0x926825b4, 0xba9dceda, 0xa4f8c1ec, 0xa3466bf2, 0xbd2364c4, 0x95d68faa, 0x8bb3809c, 0x00000000, 0x63b76282, 0xf9ac7c18, 0x9a1b1e9a, 0x8c58b9c1, 0xefefdb43, 0x75f4c5d9, 0x1643a75b, +0x82ccdf0e, 0xe17bbd8c, 0x7b60a316, 0x18d7c194, 0x0e9466cf, 0x6d23044d, 0xf7381ad7, 0x948f7855, 0x540f676e, 0x37b805ec, 0xada31b76, 0xce1479f4, 0xd857deaf, 0xbbe0bc2d, 0x21fba2b7, 0x424cc035, 0xd6c3b860, 0xb574dae2, 0x2f6fc478, 0x4cd8a6fa, +0x5a9b01a1, 0x392c6323, 0xa3377db9, 0xc0801f3b, 0x27f967f1, 0x444e0573, 0xde551be9, 0xbde2796b, 0xaba1de30, 0xc816bcb2, 0x520da228, 0x31bac0aa, 0xa535b8ff, 0xc682da7d, 0x5c99c4e7, 0x3f2ea665, 0x296d013e, 0x4ada63bc, 0xd0c17d26, 0xb3761fa4, +0x73f6009f, 0x1041621d, 0x8a5a7c87, 0xe9ed1e05, 0xffaeb95e, 0x9c19dbdc, 0x0602c546, 0x65b5a7c4, 0xf13adf91, 0x928dbd13, 0x0896a389, 0x6b21c10b, 0x7d626650, 0x1ed504d2, 0x84ce1a48, 0xe77978ca, 0xe5b783ef, 0x8600e16d, 0x1c1bfff7, 0x7fac9d75, +0x69ef3a2e, 0x0a5858ac, 0x90434636, 0xf3f424b4, 0x677b5ce1, 0x04cc3e63, 0x9ed720f9, 0xfd60427b, 0xeb23e520, 0x889487a2, 0x128f9938, 0x7138fbba, 0xb1b8e481, 0xd20f8603, 0x48149899, 0x2ba3fa1b, 0x3de05d40, 0x5e573fc2, 0xc44c2158, 0xa7fb43da, +0x33743b8f, 0x50c3590d, 0xcad84797, 0xa96f2515, 0xbf2c824e, 0xdc9be0cc, 0x4680fe56, 0x25379cd4, 0xc24ee41e, 0xa1f9869c, 0x3be29806, 0x5855fa84, 0x4e165ddf, 0x2da13f5d, 0xb7ba21c7, 0xd40d4345, 0x40823b10, 0x23355992, 0xb92e4708, 0xda99258a, +0xccda82d1, 0xaf6de053, 0x3576fec9, 0x56c19c4b, 0x96418370, 0xf5f6e1f2, 0x6fedff68, 0x0c5a9dea, 0x1a193ab1, 0x79ae5833, 0xe3b546a9, 0x8002242b, 0x148d5c7e, 0x773a3efc, 0xed212066, 0x8e9642e4, 0x98d5e5bf, 0xfb62873d, 0x617999a7, 0x02cefb25, +0x1426e174, 0x779183f6, 0xed8a9d6c, 0x8e3dffee, 0x987e58b5, 0xfbc93a37, 0x61d224ad, 0x0265462f, 0x96ea3e7a, 0xf55d5cf8, 0x6f464262, 0x0cf120e0, 0x1ab287bb, 0x7905e539, 0xe31efba3, 0x80a99921, 0x4029861a, 0x239ee498, 0xb985fa02, 0xda329880, +0xcc713fdb, 0xafc65d59, 0x35dd43c3, 0x566a2141, 0xc2e55914, 0xa1523b96, 0x3b49250c, 0x58fe478e, 0x4ebde0d5, 0x2d0a8257, 0xb7119ccd, 0xd4a6fe4f, 0x33df8685, 0x5068e407, 0xca73fa9d, 0xa9c4981f, 0xbf873f44, 0xdc305dc6, 0x462b435c, 0x259c21de, +0xb113598b, 0xd2a43b09, 0x48bf2593, 0x2b084711, 0x3d4be04a, 0x5efc82c8, 0xc4e79c52, 0xa750fed0, 0x67d0e1eb, 0x04678369, 0x9e7c9df3, 0xfdcbff71, 0xeb88582a, 0x883f3aa8, 0x12242432, 0x719346b0, 0xe51c3ee5, 0x86ab5c67, 0x1cb042fd, 0x7f07207f, +0x69448724, 0x0af3e5a6, 0x90e8fb3c, 0xf35f99be, 0xf191629b, 0x92260019, 0x083d1e83, 0x6b8a7c01, 0x7dc9db5a, 0x1e7eb9d8, 0x8465a742, 0xe7d2c5c0, 0x735dbd95, 0x10eadf17, 0x8af1c18d, 0xe946a30f, 0xff050454, 0x9cb266d6, 0x06a9784c, 0x651e1ace, +0xa59e05f5, 0xc6296777, 0x5c3279ed, 0x3f851b6f, 0x29c6bc34, 0x4a71deb6, 0xd06ac02c, 0xb3dda2ae, 0x2752dafb, 0x44e5b879, 0xdefea6e3, 0xbd49c461, 0xab0a633a, 0xc8bd01b8, 0x52a61f22, 0x31117da0, 0xd668056a, 0xb5df67e8, 0x2fc47972, 0x4c731bf0, +0x5a30bcab, 0x3987de29, 0xa39cc0b3, 0xc02ba231, 0x54a4da64, 0x3713b8e6, 0xad08a67c, 0xcebfc4fe, 0xd8fc63a5, 0xbb4b0127, 0x21501fbd, 0x42e77d3f, 0x82676204, 0xe1d00086, 0x7bcb1e1c, 0x187c7c9e, 0x0e3fdbc5, 0x6d88b947, 0xf793a7dd, 0x9424c55f, +0x00abbd0a, 0x631cdf88, 0xf907c112, 0x9ab0a390, 0x8cf304cb, 0xef446649, 0x755f78d3, 0x16e81a51, 0x00000000, 0x742d77fc, 0x148689b9, 0x60abfe45, 0xa87dcf9f, 0xdc50b863, 0xbcfb4626, 0xc8d631da, 0x094ff790, 0x7d62806c, 0x1dc97e29, 0x69e409d5, +0xa132380f, 0xd51f4ff3, 0xb5b4b1b6, 0xc199c64a, 0x519550e8, 0x25b82714, 0x4513d951, 0x313eaead, 0xf9e89f77, 0x8dc5e88b, 0xed6e16ce, 0x99436132, 0x58daa778, 0x2cf7d084, 0x4c5c2ec1, 0x3871593d, 0xf0a768e7, 0x848a1f1b, 0xe421e15e, 0x900c96a2, +0xd0274a97, 0xa40a3d6b, 0xc4a1c32e, 0xb08cb4d2, 0x785a8508, 0x0c77f2f4, 0x6cdc0cb1, 0x18f17b4d, 0xd968bd07, 0xad45cafb, 0xcdee34be, 0xb9c34342, 0x71157298, 0x05380564, 0x6593fb21, 0x11be8cdd, 0x81b21a7f, 0xf59f6d83, 0x953493c6, 0xe119e43a, +0x29cfd5e0, 0x5de2a21c, 0x3d495c59, 0x49642ba5, 0x88fdedef, 0xfcd09a13, 0x9c7b6456, 0xe85613aa, 0x20802270, 0x54ad558c, 0x3406abc9, 0x402bdc35, 0x3d53ed43, 0x497e9abf, 0x29d564fa, 0x5df81306, 0x952e22dc, 0xe1035520, 0x81a8ab65, 0xf585dc99, +0x341c1ad3, 0x40316d2f, 0x209a936a, 0x54b7e496, 0x9c61d54c, 0xe84ca2b0, 0x88e75cf5, 0xfcca2b09, 0x6cc6bdab, 0x18ebca57, 0x78403412, 0x0c6d43ee, 0xc4bb7234, 0xb09605c8, 0xd03dfb8d, 0xa4108c71, 0x65894a3b, 0x11a43dc7, 0x710fc382, 0x0522b47e, +0xcdf485a4, 0xb9d9f258, 0xd9720c1d, 0xad5f7be1, 0xed74a7d4, 0x9959d028, 0xf9f22e6d, 0x8ddf5991, 0x4509684b, 0x31241fb7, 0x518fe1f2, 0x25a2960e, 0xe43b5044, 0x901627b8, 0xf0bdd9fd, 0x8490ae01, 0x4c469fdb, 0x386be827, 0x58c01662, 0x2ced619e, +0xbce1f73c, 0xc8cc80c0, 0xa8677e85, 0xdc4a0979, 0x149c38a3, 0x60b14f5f, 0x001ab11a, 0x7437c6e6, 0xb5ae00ac, 0xc1837750, 0xa1288915, 0xd505fee9, 0x1dd3cf33, 0x69feb8cf, 0x0955468a, 0x7d783176, 0x109ce0d7, 0x64b1972b, 0x041a696e, 0x70371e92, +0xb8e12f48, 0xcccc58b4, 0xac67a6f1, 0xd84ad10d, 0x19d31747, 0x6dfe60bb, 0x0d559efe, 0x7978e902, 0xb1aed8d8, 0xc583af24, 0xa5285161, 0xd105269d, 0x4109b03f, 0x3524c7c3, 0x558f3986, 0x21a24e7a, 0xe9747fa0, 0x9d59085c, 0xfdf2f619, 0x89df81e5, +0x484647af, 0x3c6b3053, 0x5cc0ce16, 0x28edb9ea, 0xe03b8830, 0x9416ffcc, 0xf4bd0189, 0x80907675, 0xc0bbaa40, 0xb496ddbc, 0xd43d23f9, 0xa0105405, 0x68c665df, 0x1ceb1223, 0x7c40ec66, 0x086d9b9a, 0xc9f45dd0, 0xbdd92a2c, 0xdd72d469, 0xa95fa395, +0x6189924f, 0x15a4e5b3, 0x750f1bf6, 0x01226c0a, 0x912efaa8, 0xe5038d54, 0x85a87311, 0xf18504ed, 0x39533537, 0x4d7e42cb, 0x2dd5bc8e, 0x59f8cb72, 0x98610d38, 0xec4c7ac4, 0x8ce78481, 0xf8caf37d, 0x301cc2a7, 0x4431b55b, 0x249a4b1e, 0x50b73ce2, +0x2dcf0d94, 0x59e27a68, 0x3949842d, 0x4d64f3d1, 0x85b2c20b, 0xf19fb5f7, 0x91344bb2, 0xe5193c4e, 0x2480fa04, 0x50ad8df8, 0x300673bd, 0x442b0441, 0x8cfd359b, 0xf8d04267, 0x987bbc22, 0xec56cbde, 0x7c5a5d7c, 0x08772a80, 0x68dcd4c5, 0x1cf1a339, +0xd42792e3, 0xa00ae51f, 0xc0a11b5a, 0xb48c6ca6, 0x7515aaec, 0x0138dd10, 0x61932355, 0x15be54a9, 0xdd686573, 0xa945128f, 0xc9eeecca, 0xbdc39b36, 0xfde84703, 0x89c530ff, 0xe96eceba, 0x9d43b946, 0x5595889c, 0x21b8ff60, 0x41130125, 0x353e76d9, +0xf4a7b093, 0x808ac76f, 0xe021392a, 0x940c4ed6, 0x5cda7f0c, 0x28f708f0, 0x485cf6b5, 0x3c718149, 0xac7d17eb, 0xd8506017, 0xb8fb9e52, 0xccd6e9ae, 0x0400d874, 0x702daf88, 0x108651cd, 0x64ab2631, 0xa532e07b, 0xd11f9787, 0xb1b469c2, 0xc5991e3e, +0x0d4f2fe4, 0x79625818, 0x19c9a65d, 0x6de4d1a1, 0x00000000, 0x6098f002, 0xa2a63a6c, 0xc23eca6e, 0xdddf37be, 0xbd47c7bc, 0x7f790dd2, 0x1fe1fdd0, 0xec0db56a, 0x8c954568, 0x4eab8f06, 0x2e337f04, 0x31d282d4, 0x514a72d6, 0x9374b8b8, 0xf3ec48ba, +0x542c2cbf, 0x34b4dcbd, 0xf68a16d3, 0x9612e6d1, 0x89f31b01, 0xe96beb03, 0x2b55216d, 0x4bcdd16f, 0xb82199d5, 0xd8b969d7, 0x1a87a3b9, 0x7a1f53bb, 0x65feae6b, 0x05665e69, 0xc7589407, 0xa7c06405, 0xbe4cb932, 0xded44930, 0x1cea835e, 0x7c72735c, +0x63938e8c, 0x030b7e8e, 0xc135b4e0, 0xa1ad44e2, 0x52410c58, 0x32d9fc5a, 0xf0e73634, 0x907fc636, 0x8f9e3be6, 0xef06cbe4, 0x2d38018a, 0x4da0f188, 0xea60958d, 0x8af8658f, 0x48c6afe1, 0x285e5fe3, 0x37bfa233, 0x57275231, 0x9519985f, 0xf581685d, +0x066d20e7, 0x66f5d0e5, 0xa4cb1a8b, 0xc453ea89, 0xdbb21759, 0xbb2ae75b, 0x79142d35, 0x198cdd37, 0xabfddb30, 0xcb652b32, 0x095be15c, 0x69c3115e, 0x7622ec8e, 0x16ba1c8c, 0xd484d6e2, 0xb41c26e0, 0x47f06e5a, 0x27689e58, 0xe5565436, 0x85cea434, +0x9a2f59e4, 0xfab7a9e6, 0x38896388, 0x5811938a, 0xffd1f78f, 0x9f49078d, 0x5d77cde3, 0x3def3de1, 0x220ec031, 0x42963033, 0x80a8fa5d, 0xe0300a5f, 0x13dc42e5, 0x7344b2e7, 0xb17a7889, 0xd1e2888b, 0xce03755b, 0xae9b8559, 0x6ca54f37, 0x0c3dbf35, +0x15b16202, 0x75299200, 0xb717586e, 0xd78fa86c, 0xc86e55bc, 0xa8f6a5be, 0x6ac86fd0, 0x0a509fd2, 0xf9bcd768, 0x9924276a, 0x5b1aed04, 0x3b821d06, 0x2463e0d6, 0x44fb10d4, 0x86c5daba, 0xe65d2ab8, 0x419d4ebd, 0x2105bebf, 0xe33b74d1, 0x83a384d3, +0x9c427903, 0xfcda8901, 0x3ee4436f, 0x5e7cb36d, 0xad90fbd7, 0xcd080bd5, 0x0f36c1bb, 0x6fae31b9, 0x704fcc69, 0x10d73c6b, 0xd2e9f605, 0xb2710607, 0xf5f95af6, 0x9561aaf4, 0x575f609a, 0x37c79098, 0x28266d48, 0x48be9d4a, 0x8a805724, 0xea18a726, +0x19f4ef9c, 0x796c1f9e, 0xbb52d5f0, 0xdbca25f2, 0xc42bd822, 0xa4b32820, 0x668de24e, 0x0615124c, 0xa1d57649, 0xc14d864b, 0x03734c25, 0x63ebbc27, 0x7c0a41f7, 0x1c92b1f5, 0xdeac7b9b, 0xbe348b99, 0x4dd8c323, 0x2d403321, 0xef7ef94f, 0x8fe6094d, +0x9007f49d, 0xf09f049f, 0x32a1cef1, 0x52393ef3, 0x4bb5e3c4, 0x2b2d13c6, 0xe913d9a8, 0x898b29aa, 0x966ad47a, 0xf6f22478, 0x34ccee16, 0x54541e14, 0xa7b856ae, 0xc720a6ac, 0x051e6cc2, 0x65869cc0, 0x7a676110, 0x1aff9112, 0xd8c15b7c, 0xb859ab7e, +0x1f99cf7b, 0x7f013f79, 0xbd3ff517, 0xdda70515, 0xc246f8c5, 0xa2de08c7, 0x60e0c2a9, 0x007832ab, 0xf3947a11, 0x930c8a13, 0x5132407d, 0x31aab07f, 0x2e4b4daf, 0x4ed3bdad, 0x8ced77c3, 0xec7587c1, 0x5e0481c6, 0x3e9c71c4, 0xfca2bbaa, 0x9c3a4ba8, +0x83dbb678, 0xe343467a, 0x217d8c14, 0x41e57c16, 0xb20934ac, 0xd291c4ae, 0x10af0ec0, 0x7037fec2, 0x6fd60312, 0x0f4ef310, 0xcd70397e, 0xade8c97c, 0x0a28ad79, 0x6ab05d7b, 0xa88e9715, 0xc8166717, 0xd7f79ac7, 0xb76f6ac5, 0x7551a0ab, 0x15c950a9, +0xe6251813, 0x86bde811, 0x4483227f, 0x241bd27d, 0x3bfa2fad, 0x5b62dfaf, 0x995c15c1, 0xf9c4e5c3, 0xe04838f4, 0x80d0c8f6, 0x42ee0298, 0x2276f29a, 0x3d970f4a, 0x5d0fff48, 0x9f313526, 0xffa9c524, 0x0c458d9e, 0x6cdd7d9c, 0xaee3b7f2, 0xce7b47f0, +0xd19aba20, 0xb1024a22, 0x733c804c, 0x13a4704e, 0xb464144b, 0xd4fce449, 0x16c22e27, 0x765ade25, 0x69bb23f5, 0x0923d3f7, 0xcb1d1999, 0xab85e99b, 0x5869a121, 0x38f15123, 0xfacf9b4d, 0x9a576b4f, 0x85b6969f, 0xe52e669d, 0x2710acf3, 0x47885cf1, +0x00000000, 0xf1a12859, 0x0d2160bf, 0xfc8048e6, 0x992b295a, 0x688a0103, 0x940a49e5, 0x65ab61bc, 0xa6fb16eb, 0x575a3eb2, 0xabda7654, 0x5a7b5e0d, 0x3fd03fb1, 0xce7117e8, 0x32f15f0e, 0xc3507757, 0xfc76b5d7, 0x0dd79d8e, 0xf157d568, 0x00f6fd31, +0x655d9c8d, 0x94fcb4d4, 0x687cfc32, 0x99ddd46b, 0x5a8da33c, 0xab2c8b65, 0x57acc383, 0xa60debda, 0xc3a68a66, 0x3207a23f, 0xce87ead9, 0x3f26c280, 0x477d7f20, 0xb6dc5779, 0x4a5c1f9f, 0xbbfd37c6, 0xde56567a, 0x2ff77e23, 0xd37736c5, 0x22d61e9c, +0xe18669cb, 0x10274192, 0xeca70974, 0x1d06212d, 0x78ad4091, 0x890c68c8, 0x758c202e, 0x842d0877, 0xbb0bcaf7, 0x4aaae2ae, 0xb62aaa48, 0x478b8211, 0x2220e3ad, 0xd381cbf4, 0x2f018312, 0xdea0ab4b, 0x1df0dc1c, 0xec51f445, 0x10d1bca3, 0xe17094fa, +0x84dbf546, 0x757add1f, 0x89fa95f9, 0x785bbda0, 0x6ce8faf3, 0x9d49d2aa, 0x61c99a4c, 0x9068b215, 0xf5c3d3a9, 0x0462fbf0, 0xf8e2b316, 0x09439b4f, 0xca13ec18, 0x3bb2c441, 0xc7328ca7, 0x3693a4fe, 0x5338c542, 0xa299ed1b, 0x5e19a5fd, 0xafb88da4, +0x909e4f24, 0x613f677d, 0x9dbf2f9b, 0x6c1e07c2, 0x09b5667e, 0xf8144e27, 0x049406c1, 0xf5352e98, 0x366559cf, 0xc7c47196, 0x3b443970, 0xcae51129, 0xaf4e7095, 0x5eef58cc, 0xa26f102a, 0x53ce3873, 0x2b9585d3, 0xda34ad8a, 0x26b4e56c, 0xd715cd35, +0xb2beac89, 0x431f84d0, 0xbf9fcc36, 0x4e3ee46f, 0x8d6e9338, 0x7ccfbb61, 0x804ff387, 0x71eedbde, 0x1445ba62, 0xe5e4923b, 0x1964dadd, 0xe8c5f284, 0xd7e33004, 0x2642185d, 0xdac250bb, 0x2b6378e2, 0x4ec8195e, 0xbf693107, 0x43e979e1, 0xb24851b8, +0x711826ef, 0x80b90eb6, 0x7c394650, 0x8d986e09, 0xe8330fb5, 0x199227ec, 0xe5126f0a, 0x14b34753, 0xb82e444c, 0x498f6c15, 0xb50f24f3, 0x44ae0caa, 0x21056d16, 0xd0a4454f, 0x2c240da9, 0xdd8525f0, 0x1ed552a7, 0xef747afe, 0x13f43218, 0xe2551a41, +0x87fe7bfd, 0x765f53a4, 0x8adf1b42, 0x7b7e331b, 0x4458f19b, 0xb5f9d9c2, 0x49799124, 0xb8d8b97d, 0xdd73d8c1, 0x2cd2f098, 0xd052b87e, 0x21f39027, 0xe2a3e770, 0x1302cf29, 0xef8287cf, 0x1e23af96, 0x7b88ce2a, 0x8a29e673, 0x76a9ae95, 0x870886cc, +0xff533b6c, 0x0ef21335, 0xf2725bd3, 0x03d3738a, 0x66781236, 0x97d93a6f, 0x6b597289, 0x9af85ad0, 0x59a82d87, 0xa80905de, 0x54894d38, 0xa5286561, 0xc08304dd, 0x31222c84, 0xcda26462, 0x3c034c3b, 0x03258ebb, 0xf284a6e2, 0x0e04ee04, 0xffa5c65d, +0x9a0ea7e1, 0x6baf8fb8, 0x972fc75e, 0x668eef07, 0xa5de9850, 0x547fb009, 0xa8fff8ef, 0x595ed0b6, 0x3cf5b10a, 0xcd549953, 0x31d4d1b5, 0xc075f9ec, 0xd4c6bebf, 0x256796e6, 0xd9e7de00, 0x2846f659, 0x4ded97e5, 0xbc4cbfbc, 0x40ccf75a, 0xb16ddf03, +0x723da854, 0x839c800d, 0x7f1cc8eb, 0x8ebde0b2, 0xeb16810e, 0x1ab7a957, 0xe637e1b1, 0x1796c9e8, 0x28b00b68, 0xd9112331, 0x25916bd7, 0xd430438e, 0xb19b2232, 0x403a0a6b, 0xbcba428d, 0x4d1b6ad4, 0x8e4b1d83, 0x7fea35da, 0x836a7d3c, 0x72cb5565, +0x176034d9, 0xe6c11c80, 0x1a415466, 0xebe07c3f, 0x93bbc19f, 0x621ae9c6, 0x9e9aa120, 0x6f3b8979, 0x0a90e8c5, 0xfb31c09c, 0x07b1887a, 0xf610a023, 0x3540d774, 0xc4e1ff2d, 0x3861b7cb, 0xc9c09f92, 0xac6bfe2e, 0x5dcad677, 0xa14a9e91, 0x50ebb6c8, +0x6fcd7448, 0x9e6c5c11, 0x62ec14f7, 0x934d3cae, 0xf6e65d12, 0x0747754b, 0xfbc73dad, 0x0a6615f4, 0xc93662a3, 0x38974afa, 0xc417021c, 0x35b62a45, 0x501d4bf9, 0xa1bc63a0, 0x5d3c2b46, 0xac9d031f, 0x00000000, 0xea79f56f, 0xdd935e3f, 0x37eaab50, +0xbd5001f3, 0x5729f49c, 0x60c35fcc, 0x8abaaaa3, 0x649c2fc0, 0x8ee5daaf, 0xb90f71ff, 0x53768490, 0xd9cc2e33, 0x33b5db5c, 0x045f700c, 0xee268563, 0xdb0d810c, 0x31747463, 0x069edf33, 0xece72a5c, 0x665d80ff, 0x8c247590, 0xbbcedec0, 0x51b72baf, +0xbf91aecc, 0x55e85ba3, 0x6202f0f3, 0x887b059c, 0x02c1af3f, 0xe8b85a50, 0xdf52f100, 0x352b046f, 0x868f5785, 0x6cf6a2ea, 0x5b1c09ba, 0xb165fcd5, 0x3bdf5676, 0xd1a6a319, 0xe64c0849, 0x0c35fd26, 0xe2137845, 0x086a8d2a, 0x3f80267a, 0xd5f9d315, +0x5f4379b6, 0xb53a8cd9, 0x82d02789, 0x68a9d2e6, 0x5d82d689, 0xb7fb23e6, 0x801188b6, 0x6a687dd9, 0xe0d2d77a, 0x0aab2215, 0x3d418945, 0xd7387c2a, 0x391ef949, 0xd3670c26, 0xe48da776, 0x0ef45219, 0x844ef8ba, 0x6e370dd5, 0x59dda685, 0xb3a453ea, +0xc7571742, 0x2d2ee22d, 0x1ac4497d, 0xf0bdbc12, 0x7a0716b1, 0x907ee3de, 0xa794488e, 0x4dedbde1, 0xa3cb3882, 0x49b2cded, 0x7e5866bd, 0x942193d2, 0x1e9b3971, 0xf4e2cc1e, 0xc308674e, 0x29719221, 0x1c5a964e, 0xf6236321, 0xc1c9c871, 0x2bb03d1e, +0xa10a97bd, 0x4b7362d2, 0x7c99c982, 0x96e03ced, 0x78c6b98e, 0x92bf4ce1, 0xa555e7b1, 0x4f2c12de, 0xc596b87d, 0x2fef4d12, 0x1805e642, 0xf27c132d, 0x41d840c7, 0xaba1b5a8, 0x9c4b1ef8, 0x7632eb97, 0xfc884134, 0x16f1b45b, 0x211b1f0b, 0xcb62ea64, +0x25446f07, 0xcf3d9a68, 0xf8d73138, 0x12aec457, 0x98146ef4, 0x726d9b9b, 0x458730cb, 0xaffec5a4, 0x9ad5c1cb, 0x70ac34a4, 0x47469ff4, 0xad3f6a9b, 0x2785c038, 0xcdfc3557, 0xfa169e07, 0x106f6b68, 0xfe49ee0b, 0x14301b64, 0x23dab034, 0xc9a3455b, +0x4319eff8, 0xa9601a97, 0x9e8ab1c7, 0x74f344a8, 0xea72a7f4, 0x000b529b, 0x37e1f9cb, 0xdd980ca4, 0x5722a607, 0xbd5b5368, 0x8ab1f838, 0x60c80d57, 0x8eee8834, 0x64977d5b, 0x537dd60b, 0xb9042364, 0x33be89c7, 0xd9c77ca8, 0xee2dd7f8, 0x04542297, +0x317f26f8, 0xdb06d397, 0xecec78c7, 0x06958da8, 0x8c2f270b, 0x6656d264, 0x51bc7934, 0xbbc58c5b, 0x55e30938, 0xbf9afc57, 0x88705707, 0x6209a268, 0xe8b308cb, 0x02cafda4, 0x352056f4, 0xdf59a39b, 0x6cfdf071, 0x8684051e, 0xb16eae4e, 0x5b175b21, +0xd1adf182, 0x3bd404ed, 0x0c3eafbd, 0xe6475ad2, 0x0861dfb1, 0xe2182ade, 0xd5f2818e, 0x3f8b74e1, 0xb531de42, 0x5f482b2d, 0x68a2807d, 0x82db7512, 0xb7f0717d, 0x5d898412, 0x6a632f42, 0x801ada2d, 0x0aa0708e, 0xe0d985e1, 0xd7332eb1, 0x3d4adbde, +0xd36c5ebd, 0x3915abd2, 0x0eff0082, 0xe486f5ed, 0x6e3c5f4e, 0x8445aa21, 0xb3af0171, 0x59d6f41e, 0x2d25b0b6, 0xc75c45d9, 0xf0b6ee89, 0x1acf1be6, 0x9075b145, 0x7a0c442a, 0x4de6ef7a, 0xa79f1a15, 0x49b99f76, 0xa3c06a19, 0x942ac149, 0x7e533426, +0xf4e99e85, 0x1e906bea, 0x297ac0ba, 0xc30335d5, 0xf62831ba, 0x1c51c4d5, 0x2bbb6f85, 0xc1c29aea, 0x4b783049, 0xa101c526, 0x96eb6e76, 0x7c929b19, 0x92b41e7a, 0x78cdeb15, 0x4f274045, 0xa55eb52a, 0x2fe41f89, 0xc59deae6, 0xf27741b6, 0x180eb4d9, +0xabaae733, 0x41d3125c, 0x7639b90c, 0x9c404c63, 0x16fae6c0, 0xfc8313af, 0xcb69b8ff, 0x21104d90, 0xcf36c8f3, 0x254f3d9c, 0x12a596cc, 0xf8dc63a3, 0x7266c900, 0x981f3c6f, 0xaff5973f, 0x458c6250, 0x70a7663f, 0x9ade9350, 0xad343800, 0x474dcd6f, +0xcdf767cc, 0x278e92a3, 0x106439f3, 0xfa1dcc9c, 0x143b49ff, 0xfe42bc90, 0xc9a817c0, 0x23d1e2af, 0xa96b480c, 0x4312bd63, 0x74f81633, 0x9e81e35c, 0x00000000, 0x1dacdfa6, 0x56f41206, 0x4b58cda0, 0x7bb4c8d0, 0x66181776, 0x2d40dad6, 0x30ec0570, +0x55274191, 0x488b9e37, 0x03d35397, 0x1e7f8c31, 0x2e938941, 0x333f56e7, 0x78679b47, 0x65cb44e1, 0x0dcd3366, 0x1061ecc0, 0x5b392160, 0x4695fec6, 0x7679fbb6, 0x6bd52410, 0x208de9b0, 0x3d213616, 0x58ea72f7, 0x4546ad51, 0x0e1e60f1, 0x13b2bf57, +0x235eba27, 0x3ef26581, 0x75aaa821, 0x68067787, 0xaa52dbb3, 0xb7fe0415, 0xfca6c9b5, 0xe10a1613, 0xd1e61363, 0xcc4accc5, 0x87120165, 0x9abedec3, 0xff759a22, 0xe2d94584, 0xa9818824, 0xb42d5782, 0x84c152f2, 0x996d8d54, 0xd23540f4, 0xcf999f52, +0xa79fe8d5, 0xba333773, 0xf16bfad3, 0xecc72575, 0xdc2b2005, 0xc187ffa3, 0x8adf3203, 0x9773eda5, 0xf2b8a944, 0xef1476e2, 0xa44cbb42, 0xb9e064e4, 0x890c6194, 0x94a0be32, 0xdff87392, 0xc254ac34, 0x0d6b44ff, 0x10c79b59, 0x5b9f56f9, 0x4633895f, +0x76df8c2f, 0x6b735389, 0x202b9e29, 0x3d87418f, 0x584c056e, 0x45e0dac8, 0x0eb81768, 0x1314c8ce, 0x23f8cdbe, 0x3e541218, 0x750cdfb8, 0x68a0001e, 0x00a67799, 0x1d0aa83f, 0x5652659f, 0x4bfeba39, 0x7b12bf49, 0x66be60ef, 0x2de6ad4f, 0x304a72e9, +0x55813608, 0x482de9ae, 0x0375240e, 0x1ed9fba8, 0x2e35fed8, 0x3399217e, 0x78c1ecde, 0x656d3378, 0xa7399f4c, 0xba9540ea, 0xf1cd8d4a, 0xec6152ec, 0xdc8d579c, 0xc121883a, 0x8a79459a, 0x97d59a3c, 0xf21ededd, 0xefb2017b, 0xa4eaccdb, 0xb946137d, +0x89aa160d, 0x9406c9ab, 0xdf5e040b, 0xc2f2dbad, 0xaaf4ac2a, 0xb758738c, 0xfc00be2c, 0xe1ac618a, 0xd14064fa, 0xccecbb5c, 0x87b476fc, 0x9a18a95a, 0xffd3edbb, 0xe27f321d, 0xa927ffbd, 0xb48b201b, 0x8467256b, 0x99cbfacd, 0xd293376d, 0xcf3fe8cb, +0x227d9fa1, 0x3fd14007, 0x74898da7, 0x69255201, 0x59c95771, 0x446588d7, 0x0f3d4577, 0x12919ad1, 0x775ade30, 0x6af60196, 0x21aecc36, 0x3c021390, 0x0cee16e0, 0x1142c946, 0x5a1a04e6, 0x47b6db40, 0x2fb0acc7, 0x321c7361, 0x7944bec1, 0x64e86167, +0x54046417, 0x49a8bbb1, 0x02f07611, 0x1f5ca9b7, 0x7a97ed56, 0x673b32f0, 0x2c63ff50, 0x31cf20f6, 0x01232586, 0x1c8ffa20, 0x57d73780, 0x4a7be826, 0x882f4412, 0x95839bb4, 0xdedb5614, 0xc37789b2, 0xf39b8cc2, 0xee375364, 0xa56f9ec4, 0xb8c34162, +0xdd080583, 0xc0a4da25, 0x8bfc1785, 0x9650c823, 0xa6bccd53, 0xbb1012f5, 0xf048df55, 0xede400f3, 0x85e27774, 0x984ea8d2, 0xd3166572, 0xcebabad4, 0xfe56bfa4, 0xe3fa6002, 0xa8a2ada2, 0xb50e7204, 0xd0c536e5, 0xcd69e943, 0x863124e3, 0x9b9dfb45, +0xab71fe35, 0xb6dd2193, 0xfd85ec33, 0xe0293395, 0x2f16db5e, 0x32ba04f8, 0x79e2c958, 0x644e16fe, 0x54a2138e, 0x490ecc28, 0x02560188, 0x1ffade2e, 0x7a319acf, 0x679d4569, 0x2cc588c9, 0x3169576f, 0x0185521f, 0x1c298db9, 0x57714019, 0x4add9fbf, +0x22dbe838, 0x3f77379e, 0x742ffa3e, 0x69832598, 0x596f20e8, 0x44c3ff4e, 0x0f9b32ee, 0x1237ed48, 0x77fca9a9, 0x6a50760f, 0x2108bbaf, 0x3ca46409, 0x0c486179, 0x11e4bedf, 0x5abc737f, 0x4710acd9, 0x854400ed, 0x98e8df4b, 0xd3b012eb, 0xce1ccd4d, +0xfef0c83d, 0xe35c179b, 0xa804da3b, 0xb5a8059d, 0xd063417c, 0xcdcf9eda, 0x8697537a, 0x9b3b8cdc, 0xabd789ac, 0xb67b560a, 0xfd239baa, 0xe08f440c, 0x8889338b, 0x9525ec2d, 0xde7d218d, 0xc3d1fe2b, 0xf33dfb5b, 0xee9124fd, 0xa5c9e95d, 0xb86536fb, +0xddae721a, 0xc002adbc, 0x8b5a601c, 0x96f6bfba, 0xa61abaca, 0xbbb6656c, 0xf0eea8cc, 0xed42776a, 0x00000000, 0x74e7e527, 0x5e08c837, 0x2aef2d10, 0x6607df95, 0x12e03ab2, 0x380f17a2, 0x4ce8f285, 0xdb9bcd7c, 0xaf7c285b, 0x8593054b, 0xf174e06c, +0xbd9c12e9, 0xc97bf7ce, 0xe394dade, 0x97733ff9, 0x710587f1, 0x05e262d6, 0x2f0d4fc6, 0x5beaaae1, 0x17025864, 0x63e5bd43, 0x490a9053, 0x3ded7574, 0xaa9e4a8d, 0xde79afaa, 0xf49682ba, 0x8071679d, 0xcc999518, 0xb87e703f, 0x92915d2f, 0xe676b808, +0xa6abb48e, 0xd24c51a9, 0xf8a37cb9, 0x8c44999e, 0xc0ac6b1b, 0xb44b8e3c, 0x9ea4a32c, 0xea43460b, 0x7d3079f2, 0x09d79cd5, 0x2338b1c5, 0x57df54e2, 0x1b37a667, 0x6fd04340, 0x453f6e50, 0x31d88b77, 0xd7ae337f, 0xa349d658, 0x89a6fb48, 0xfd411e6f, +0xb1a9ecea, 0xc54e09cd, 0xefa124dd, 0x9b46c1fa, 0x0c35fe03, 0x78d21b24, 0x523d3634, 0x26dad313, 0x6a322196, 0x1ed5c4b1, 0x343ae9a1, 0x40dd0c86, 0xd05a7cdf, 0xa4bd99f8, 0x8e52b4e8, 0xfab551cf, 0xb65da34a, 0xc2ba466d, 0xe8556b7d, 0x9cb28e5a, +0x0bc1b1a3, 0x7f265484, 0x55c97994, 0x212e9cb3, 0x6dc66e36, 0x19218b11, 0x33cea601, 0x47294326, 0xa15ffb2e, 0xd5b81e09, 0xff573319, 0x8bb0d63e, 0xc75824bb, 0xb3bfc19c, 0x9950ec8c, 0xedb709ab, 0x7ac43652, 0x0e23d375, 0x24ccfe65, 0x502b1b42, +0x1cc3e9c7, 0x68240ce0, 0x42cb21f0, 0x362cc4d7, 0x76f1c851, 0x02162d76, 0x28f90066, 0x5c1ee541, 0x10f617c4, 0x6411f2e3, 0x4efedff3, 0x3a193ad4, 0xad6a052d, 0xd98de00a, 0xf362cd1a, 0x8785283d, 0xcb6ddab8, 0xbf8a3f9f, 0x9565128f, 0xe182f7a8, +0x07f44fa0, 0x7313aa87, 0x59fc8797, 0x2d1b62b0, 0x61f39035, 0x15147512, 0x3ffb5802, 0x4b1cbd25, 0xdc6f82dc, 0xa88867fb, 0x82674aeb, 0xf680afcc, 0xba685d49, 0xce8fb86e, 0xe460957e, 0x90877059, 0x91f0ed2a, 0xe517080d, 0xcff8251d, 0xbb1fc03a, +0xf7f732bf, 0x8310d798, 0xa9fffa88, 0xdd181faf, 0x4a6b2056, 0x3e8cc571, 0x1463e861, 0x60840d46, 0x2c6cffc3, 0x588b1ae4, 0x726437f4, 0x0683d2d3, 0xe0f56adb, 0x94128ffc, 0xbefda2ec, 0xca1a47cb, 0x86f2b54e, 0xf2155069, 0xd8fa7d79, 0xac1d985e, +0x3b6ea7a7, 0x4f894280, 0x65666f90, 0x11818ab7, 0x5d697832, 0x298e9d15, 0x0361b005, 0x77865522, 0x375b59a4, 0x43bcbc83, 0x69539193, 0x1db474b4, 0x515c8631, 0x25bb6316, 0x0f544e06, 0x7bb3ab21, 0xecc094d8, 0x982771ff, 0xb2c85cef, 0xc62fb9c8, +0x8ac74b4d, 0xfe20ae6a, 0xd4cf837a, 0xa028665d, 0x465ede55, 0x32b93b72, 0x18561662, 0x6cb1f345, 0x205901c0, 0x54bee4e7, 0x7e51c9f7, 0x0ab62cd0, 0x9dc51329, 0xe922f60e, 0xc3cddb1e, 0xb72a3e39, 0xfbc2ccbc, 0x8f25299b, 0xa5ca048b, 0xd12de1ac, +0x41aa91f5, 0x354d74d2, 0x1fa259c2, 0x6b45bce5, 0x27ad4e60, 0x534aab47, 0x79a58657, 0x0d426370, 0x9a315c89, 0xeed6b9ae, 0xc43994be, 0xb0de7199, 0xfc36831c, 0x88d1663b, 0xa23e4b2b, 0xd6d9ae0c, 0x30af1604, 0x4448f323, 0x6ea7de33, 0x1a403b14, +0x56a8c991, 0x224f2cb6, 0x08a001a6, 0x7c47e481, 0xeb34db78, 0x9fd33e5f, 0xb53c134f, 0xc1dbf668, 0x8d3304ed, 0xf9d4e1ca, 0xd33bccda, 0xa7dc29fd, 0xe701257b, 0x93e6c05c, 0xb909ed4c, 0xcdee086b, 0x8106faee, 0xf5e11fc9, 0xdf0e32d9, 0xabe9d7fe, +0x3c9ae807, 0x487d0d20, 0x62922030, 0x1675c517, 0x5a9d3792, 0x2e7ad2b5, 0x0495ffa5, 0x70721a82, 0x9604a28a, 0xe2e347ad, 0xc80c6abd, 0xbceb8f9a, 0xf0037d1f, 0x84e49838, 0xae0bb528, 0xdaec500f, 0x4d9f6ff6, 0x39788ad1, 0x1397a7c1, 0x677042e6, +0x2b98b063, 0x5f7f5544, 0x75907854, 0x01779d73, 0x00000000, 0xfc2bc890, 0xa0ee8331, 0x5cc54ba1, 0x2418561f, 0xd8339e8f, 0x84f6d52e, 0x78dd1dbe, 0xe8ce8f0b, 0x14e5479b, 0x48200c3a, 0xb40bc4aa, 0xccd6d914, 0x30fd1184, 0x6c385a25, 0x901392b5, +0x39c8e61c, 0xc5e32e8c, 0x9926652d, 0x650dadbd, 0x1dd0b003, 0xe1fb7893, 0xbd3e3332, 0x4115fba2, 0xd1066917, 0x2d2da187, 0x71e8ea26, 0x8dc322b6, 0xf51e3f08, 0x0935f798, 0x55f0bc39, 0xa9db74a9, 0x06a527aa, 0xfa8eef3a, 0xa64ba49b, 0x5a606c0b, +0x22bd71b5, 0xde96b925, 0x8253f284, 0x7e783a14, 0xee6ba8a1, 0x12406031, 0x4e852b90, 0xb2aee300, 0xca73febe, 0x3658362e, 0x6a9d7d8f, 0x96b6b51f, 0x3f6dc1b6, 0xc3460926, 0x9f834287, 0x63a88a17, 0x1b7597a9, 0xe75e5f39, 0xbb9b1498, 0x47b0dc08, +0xd7a34ebd, 0x2b88862d, 0x774dcd8c, 0x8b66051c, 0xf3bb18a2, 0x0f90d032, 0x53559b93, 0xaf7e5303, 0xe05fa83d, 0x1c7460ad, 0x40b12b0c, 0xbc9ae39c, 0xc447fe22, 0x386c36b2, 0x64a97d13, 0x9882b583, 0x08912736, 0xf4baefa6, 0xa87fa407, 0x54546c97, +0x2c897129, 0xd0a2b9b9, 0x8c67f218, 0x704c3a88, 0xd9974e21, 0x25bc86b1, 0x7979cd10, 0x85520580, 0xfd8f183e, 0x01a4d0ae, 0x5d619b0f, 0xa14a539f, 0x3159c12a, 0xcd7209ba, 0x91b7421b, 0x6d9c8a8b, 0x15419735, 0xe96a5fa5, 0xb5af1404, 0x4984dc94, +0xe6fa8f97, 0x1ad14707, 0x46140ca6, 0xba3fc436, 0xc2e2d988, 0x3ec91118, 0x620c5ab9, 0x9e279229, 0x0e34009c, 0xf21fc80c, 0xaeda83ad, 0x52f14b3d, 0x2a2c5683, 0xd6079e13, 0x8ac2d5b2, 0x76e91d22, 0xdf32698b, 0x2319a11b, 0x7fdceaba, 0x83f7222a, +0xfb2a3f94, 0x0701f704, 0x5bc4bca5, 0xa7ef7435, 0x37fce680, 0xcbd72e10, 0x971265b1, 0x6b39ad21, 0x13e4b09f, 0xefcf780f, 0xb30a33ae, 0x4f21fb3e, 0xdfb53003, 0x239ef893, 0x7f5bb332, 0x83707ba2, 0xfbad661c, 0x0786ae8c, 0x5b43e52d, 0xa7682dbd, +0x377bbf08, 0xcb507798, 0x97953c39, 0x6bbef4a9, 0x1363e917, 0xef482187, 0xb38d6a26, 0x4fa6a2b6, 0xe67dd61f, 0x1a561e8f, 0x4693552e, 0xbab89dbe, 0xc2658000, 0x3e4e4890, 0x628b0331, 0x9ea0cba1, 0x0eb35914, 0xf2989184, 0xae5dda25, 0x527612b5, +0x2aab0f0b, 0xd680c79b, 0x8a458c3a, 0x766e44aa, 0xd91017a9, 0x253bdf39, 0x79fe9498, 0x85d55c08, 0xfd0841b6, 0x01238926, 0x5de6c287, 0xa1cd0a17, 0x31de98a2, 0xcdf55032, 0x91301b93, 0x6d1bd303, 0x15c6cebd, 0xe9ed062d, 0xb5284d8c, 0x4903851c, +0xe0d8f1b5, 0x1cf33925, 0x40367284, 0xbc1dba14, 0xc4c0a7aa, 0x38eb6f3a, 0x642e249b, 0x9805ec0b, 0x08167ebe, 0xf43db62e, 0xa8f8fd8f, 0x54d3351f, 0x2c0e28a1, 0xd025e031, 0x8ce0ab90, 0x70cb6300, 0x3fea983e, 0xc3c150ae, 0x9f041b0f, 0x632fd39f, +0x1bf2ce21, 0xe7d906b1, 0xbb1c4d10, 0x47378580, 0xd7241735, 0x2b0fdfa5, 0x77ca9404, 0x8be15c94, 0xf33c412a, 0x0f1789ba, 0x53d2c21b, 0xaff90a8b, 0x06227e22, 0xfa09b6b2, 0xa6ccfd13, 0x5ae73583, 0x223a283d, 0xde11e0ad, 0x82d4ab0c, 0x7eff639c, +0xeeecf129, 0x12c739b9, 0x4e027218, 0xb229ba88, 0xcaf4a736, 0x36df6fa6, 0x6a1a2407, 0x9631ec97, 0x394fbf94, 0xc5647704, 0x99a13ca5, 0x658af435, 0x1d57e98b, 0xe17c211b, 0xbdb96aba, 0x4192a22a, 0xd181309f, 0x2daaf80f, 0x716fb3ae, 0x8d447b3e, +0xf5996680, 0x09b2ae10, 0x5577e5b1, 0xa95c2d21, 0x00875988, 0xfcac9118, 0xa069dab9, 0x5c421229, 0x249f0f97, 0xd8b4c707, 0x84718ca6, 0x785a4436, 0xe849d683, 0x14621e13, 0x48a755b2, 0xb48c9d22, 0xcc51809c, 0x307a480c, 0x6cbf03ad, 0x9094cb3d, +0x00000000, 0xe4421d1b, 0xf36825b9, 0x172a38a2, 0x3e338a9e, 0xda719785, 0xcd5baf27, 0x2919b23c, 0x304b348b, 0xd4092990, 0xc3231132, 0x27610c29, 0x0e78be15, 0xea3aa30e, 0xfd109bac, 0x195286b7, 0xd4f8d2d0, 0x30bacfcb, 0x2790f769, 0xc3d2ea72, +0xeacb584e, 0x0e894555, 0x19a37df7, 0xfde160ec, 0xe4b3e65b, 0x00f1fb40, 0x17dbc3e2, 0xf399def9, 0xda806cc5, 0x3ec271de, 0x29e8497c, 0xcdaa5467, 0x0f628c0e, 0xeb209115, 0xfc0aa9b7, 0x1848b4ac, 0x31510690, 0xd5131b8b, 0xc2392329, 0x267b3e32, +0x3f29b885, 0xdb6ba59e, 0xcc419d3c, 0x28038027, 0x011a321b, 0xe5582f00, 0xf27217a2, 0x16300ab9, 0xdb9a5ede, 0x3fd843c5, 0x28f27b67, 0xccb0667c, 0xe5a9d440, 0x01ebc95b, 0x16c1f1f9, 0xf283ece2, 0xebd16a55, 0x0f93774e, 0x18b94fec, 0xfcfb52f7, +0xd5e2e0cb, 0x31a0fdd0, 0x268ac572, 0xc2c8d869, 0x2db47507, 0xc9f6681c, 0xdedc50be, 0x3a9e4da5, 0x1387ff99, 0xf7c5e282, 0xe0efda20, 0x04adc73b, 0x1dff418c, 0xf9bd5c97, 0xee976435, 0x0ad5792e, 0x23cccb12, 0xc78ed609, 0xd0a4eeab, 0x34e6f3b0, +0xf94ca7d7, 0x1d0ebacc, 0x0a24826e, 0xee669f75, 0xc77f2d49, 0x233d3052, 0x341708f0, 0xd05515eb, 0xc907935c, 0x2d458e47, 0x3a6fb6e5, 0xde2dabfe, 0xf73419c2, 0x137604d9, 0x045c3c7b, 0xe01e2160, 0x22d6f909, 0xc694e412, 0xd1bedcb0, 0x35fcc1ab, +0x1ce57397, 0xf8a76e8c, 0xef8d562e, 0x0bcf4b35, 0x129dcd82, 0xf6dfd099, 0xe1f5e83b, 0x05b7f520, 0x2cae471c, 0xc8ec5a07, 0xdfc662a5, 0x3b847fbe, 0xf62e2bd9, 0x126c36c2, 0x05460e60, 0xe104137b, 0xc81da147, 0x2c5fbc5c, 0x3b7584fe, 0xdf3799e5, +0xc6651f52, 0x22270249, 0x350d3aeb, 0xd14f27f0, 0xf85695cc, 0x1c1488d7, 0x0b3eb075, 0xef7cad6e, 0x2c975c87, 0xc8d5419c, 0xdfff793e, 0x3bbd6425, 0x12a4d619, 0xf6e6cb02, 0xe1ccf3a0, 0x058eeebb, 0x1cdc680c, 0xf89e7517, 0xefb44db5, 0x0bf650ae, +0x22efe292, 0xc6adff89, 0xd187c72b, 0x35c5da30, 0xf86f8e57, 0x1c2d934c, 0x0b07abee, 0xef45b6f5, 0xc65c04c9, 0x221e19d2, 0x35342170, 0xd1763c6b, 0xc824badc, 0x2c66a7c7, 0x3b4c9f65, 0xdf0e827e, 0xf6173042, 0x12552d59, 0x057f15fb, 0xe13d08e0, +0x23f5d089, 0xc7b7cd92, 0xd09df530, 0x34dfe82b, 0x1dc65a17, 0xf984470c, 0xeeae7fae, 0x0aec62b5, 0x13bee402, 0xf7fcf919, 0xe0d6c1bb, 0x0494dca0, 0x2d8d6e9c, 0xc9cf7387, 0xdee54b25, 0x3aa7563e, 0xf70d0259, 0x134f1f42, 0x046527e0, 0xe0273afb, +0xc93e88c7, 0x2d7c95dc, 0x3a56ad7e, 0xde14b065, 0xc74636d2, 0x23042bc9, 0x342e136b, 0xd06c0e70, 0xf975bc4c, 0x1d37a157, 0x0a1d99f5, 0xee5f84ee, 0x01232980, 0xe561349b, 0xf24b0c39, 0x16091122, 0x3f10a31e, 0xdb52be05, 0xcc7886a7, 0x283a9bbc, +0x31681d0b, 0xd52a0010, 0xc20038b2, 0x264225a9, 0x0f5b9795, 0xeb198a8e, 0xfc33b22c, 0x1871af37, 0xd5dbfb50, 0x3199e64b, 0x26b3dee9, 0xc2f1c3f2, 0xebe871ce, 0x0faa6cd5, 0x18805477, 0xfcc2496c, 0xe590cfdb, 0x01d2d2c0, 0x16f8ea62, 0xf2baf779, +0xdba34545, 0x3fe1585e, 0x28cb60fc, 0xcc897de7, 0x0e41a58e, 0xea03b895, 0xfd298037, 0x196b9d2c, 0x30722f10, 0xd430320b, 0xc31a0aa9, 0x275817b2, 0x3e0a9105, 0xda488c1e, 0xcd62b4bc, 0x2920a9a7, 0x00391b9b, 0xe47b0680, 0xf3513e22, 0x17132339, +0xdab9775e, 0x3efb6a45, 0x29d152e7, 0xcd934ffc, 0xe48afdc0, 0x00c8e0db, 0x17e2d879, 0xf3a0c562, 0xeaf243d5, 0x0eb05ece, 0x199a666c, 0xfdd87b77, 0xd4c1c94b, 0x3083d450, 0x27a9ecf2, 0xc3ebf1e9, 0x00000000, 0x33597587, 0x710b53f1, 0x42522676, +0x2825f335, 0x1b7c86b2, 0x592ea0c4, 0x6a77d543, 0x413cb5b1, 0x7265c036, 0x3037e640, 0x036e93c7, 0x69194684, 0x5a403303, 0x18121575, 0x2b4b60f2, 0x92e5a873, 0xa1bcddf4, 0xe3eefb82, 0xd0b78e05, 0xbac05b46, 0x89992ec1, 0xcbcb08b7, 0xf8927d30, +0xd3d91dc2, 0xe0806845, 0xa2d24e33, 0x918b3bb4, 0xfbfceef7, 0xc8a59b70, 0x8af7bd06, 0xb9aec881, 0xdd1505f0, 0xee4c7077, 0xac1e5601, 0x9f472386, 0xf530f6c5, 0xc6698342, 0x843ba534, 0xb762d0b3, 0x9c29b041, 0xaf70c5c6, 0xed22e3b0, 0xde7b9637, +0xb40c4374, 0x875536f3, 0xc5071085, 0xf65e6502, 0x4ff0ad83, 0x7ca9d804, 0x3efbfe72, 0x0da28bf5, 0x67d55eb6, 0x548c2b31, 0x16de0d47, 0x258778c0, 0x0ecc1832, 0x3d956db5, 0x7fc74bc3, 0x4c9e3e44, 0x26e9eb07, 0x15b09e80, 0x57e2b8f6, 0x64bbcd71, +0xb10f72b6, 0x82560731, 0xc0042147, 0xf35d54c0, 0x992a8183, 0xaa73f404, 0xe821d272, 0xdb78a7f5, 0xf033c707, 0xc36ab280, 0x813894f6, 0xb261e171, 0xd8163432, 0xeb4f41b5, 0xa91d67c3, 0x9a441244, 0x23eadac5, 0x10b3af42, 0x52e18934, 0x61b8fcb3, +0x0bcf29f0, 0x38965c77, 0x7ac47a01, 0x499d0f86, 0x62d66f74, 0x518f1af3, 0x13dd3c85, 0x20844902, 0x4af39c41, 0x79aae9c6, 0x3bf8cfb0, 0x08a1ba37, 0x6c1a7746, 0x5f4302c1, 0x1d1124b7, 0x2e485130, 0x443f8473, 0x7766f1f4, 0x3534d782, 0x066da205, +0x2d26c2f7, 0x1e7fb770, 0x5c2d9106, 0x6f74e481, 0x050331c2, 0x365a4445, 0x74086233, 0x475117b4, 0xfeffdf35, 0xcda6aab2, 0x8ff48cc4, 0xbcadf943, 0xd6da2c00, 0xe5835987, 0xa7d17ff1, 0x94880a76, 0xbfc36a84, 0x8c9a1f03, 0xcec83975, 0xfd914cf2, +0x97e699b1, 0xa4bfec36, 0xe6edca40, 0xd5b4bfc7, 0xf9679120, 0xca3ee4a7, 0x886cc2d1, 0xbb35b756, 0xd1426215, 0xe21b1792, 0xa04931e4, 0x93104463, 0xb85b2491, 0x8b025116, 0xc9507760, 0xfa0902e7, 0x907ed7a4, 0xa327a223, 0xe1758455, 0xd22cf1d2, +0x6b823953, 0x58db4cd4, 0x1a896aa2, 0x29d01f25, 0x43a7ca66, 0x70febfe1, 0x32ac9997, 0x01f5ec10, 0x2abe8ce2, 0x19e7f965, 0x5bb5df13, 0x68ecaa94, 0x029b7fd7, 0x31c20a50, 0x73902c26, 0x40c959a1, 0x247294d0, 0x172be157, 0x5579c721, 0x6620b2a6, +0x0c5767e5, 0x3f0e1262, 0x7d5c3414, 0x4e054193, 0x654e2161, 0x561754e6, 0x14457290, 0x271c0717, 0x4d6bd254, 0x7e32a7d3, 0x3c6081a5, 0x0f39f422, 0xb6973ca3, 0x85ce4924, 0xc79c6f52, 0xf4c51ad5, 0x9eb2cf96, 0xadebba11, 0xefb99c67, 0xdce0e9e0, +0xf7ab8912, 0xc4f2fc95, 0x86a0dae3, 0xb5f9af64, 0xdf8e7a27, 0xecd70fa0, 0xae8529d6, 0x9ddc5c51, 0x4868e396, 0x7b319611, 0x3963b067, 0x0a3ac5e0, 0x604d10a3, 0x53146524, 0x11464352, 0x221f36d5, 0x09545627, 0x3a0d23a0, 0x785f05d6, 0x4b067051, +0x2171a512, 0x1228d095, 0x507af6e3, 0x63238364, 0xda8d4be5, 0xe9d43e62, 0xab861814, 0x98df6d93, 0xf2a8b8d0, 0xc1f1cd57, 0x83a3eb21, 0xb0fa9ea6, 0x9bb1fe54, 0xa8e88bd3, 0xeabaada5, 0xd9e3d822, 0xb3940d61, 0x80cd78e6, 0xc29f5e90, 0xf1c62b17, +0x957de666, 0xa62493e1, 0xe476b597, 0xd72fc010, 0xbd581553, 0x8e0160d4, 0xcc5346a2, 0xff0a3325, 0xd44153d7, 0xe7182650, 0xa54a0026, 0x961375a1, 0xfc64a0e2, 0xcf3dd565, 0x8d6ff313, 0xbe368694, 0x07984e15, 0x34c13b92, 0x76931de4, 0x45ca6863, +0x2fbdbd20, 0x1ce4c8a7, 0x5eb6eed1, 0x6def9b56, 0x46a4fba4, 0x75fd8e23, 0x37afa855, 0x04f6ddd2, 0x6e810891, 0x5dd87d16, 0x1f8a5b60, 0x2cd32ee7, 0x00000000, 0x79efb9da, 0x07078c73, 0x7ee835a9, 0xc628f960, 0xbfc740ba, 0xc12f7513, 0xb8c0ccc9, +0xecf2cce6, 0x951d753c, 0xebf54095, 0x921af94f, 0x2ada3586, 0x53358c5c, 0x2dddb9f5, 0x5432002f, 0x35b035ce, 0x4c5f8c14, 0x32b7b9bd, 0x4b580067, 0xf398ccae, 0x8a777574, 0xf49f40dd, 0x8d70f907, 0xd942f928, 0xa0ad40f2, 0xde45755b, 0xa7aacc81, +0x1f6a0048, 0x6685b992, 0x186d8c3b, 0x618235e1, 0xfb6b8dfa, 0x82843420, 0xfc6c0189, 0x8583b853, 0x3d43749a, 0x44accd40, 0x3a44f8e9, 0x43ab4133, 0x1799411c, 0x6e76f8c6, 0x109ecd6f, 0x697174b5, 0xd1b1b87c, 0xa85e01a6, 0xd6b6340f, 0xaf598dd5, +0xcedbb834, 0xb73401ee, 0xc9dc3447, 0xb0338d9d, 0x08f34154, 0x711cf88e, 0x0ff4cd27, 0x761b74fd, 0x222974d2, 0x5bc6cd08, 0x252ef8a1, 0x5cc1417b, 0xe4018db2, 0x9dee3468, 0xe30601c1, 0x9ae9b81b, 0xc5fc3b65, 0xbc1382bf, 0xc2fbb716, 0xbb140ecc, +0x03d4c205, 0x7a3b7bdf, 0x04d34e76, 0x7d3cf7ac, 0x290ef783, 0x50e14e59, 0x2e097bf0, 0x57e6c22a, 0xef260ee3, 0x96c9b739, 0xe8218290, 0x91ce3b4a, 0xf04c0eab, 0x89a3b771, 0xf74b82d8, 0x8ea43b02, 0x3664f7cb, 0x4f8b4e11, 0x31637bb8, 0x488cc262, +0x1cbec24d, 0x65517b97, 0x1bb94e3e, 0x6256f7e4, 0xda963b2d, 0xa37982f7, 0xdd91b75e, 0xa47e0e84, 0x3e97b69f, 0x47780f45, 0x39903aec, 0x407f8336, 0xf8bf4fff, 0x8150f625, 0xffb8c38c, 0x86577a56, 0xd2657a79, 0xab8ac3a3, 0xd562f60a, 0xac8d4fd0, +0x144d8319, 0x6da23ac3, 0x134a0f6a, 0x6aa5b6b0, 0x0b278351, 0x72c83a8b, 0x0c200f22, 0x75cfb6f8, 0xcd0f7a31, 0xb4e0c3eb, 0xca08f642, 0xb3e74f98, 0xe7d54fb7, 0x9e3af66d, 0xe0d2c3c4, 0x993d7a1e, 0x21fdb6d7, 0x58120f0d, 0x26fa3aa4, 0x5f15837e, +0x49a11c68, 0x304ea5b2, 0x4ea6901b, 0x374929c1, 0x8f89e508, 0xf6665cd2, 0x888e697b, 0xf161d0a1, 0xa553d08e, 0xdcbc6954, 0xa2545cfd, 0xdbbbe527, 0x637b29ee, 0x1a949034, 0x647ca59d, 0x1d931c47, 0x7c1129a6, 0x05fe907c, 0x7b16a5d5, 0x02f91c0f, +0xba39d0c6, 0xc3d6691c, 0xbd3e5cb5, 0xc4d1e56f, 0x90e3e540, 0xe90c5c9a, 0x97e46933, 0xee0bd0e9, 0x56cb1c20, 0x2f24a5fa, 0x51cc9053, 0x28232989, 0xb2ca9192, 0xcb252848, 0xb5cd1de1, 0xcc22a43b, 0x74e268f2, 0x0d0dd128, 0x73e5e481, 0x0a0a5d5b, +0x5e385d74, 0x27d7e4ae, 0x593fd107, 0x20d068dd, 0x9810a414, 0xe1ff1dce, 0x9f172867, 0xe6f891bd, 0x877aa45c, 0xfe951d86, 0x807d282f, 0xf99291f5, 0x41525d3c, 0x38bde4e6, 0x4655d14f, 0x3fba6895, 0x6b8868ba, 0x1267d160, 0x6c8fe4c9, 0x15605d13, +0xada091da, 0xd44f2800, 0xaaa71da9, 0xd348a473, 0x8c5d270d, 0xf5b29ed7, 0x8b5aab7e, 0xf2b512a4, 0x4a75de6d, 0x339a67b7, 0x4d72521e, 0x349debc4, 0x60afebeb, 0x19405231, 0x67a86798, 0x1e47de42, 0xa687128b, 0xdf68ab51, 0xa1809ef8, 0xd86f2722, +0xb9ed12c3, 0xc002ab19, 0xbeea9eb0, 0xc705276a, 0x7fc5eba3, 0x062a5279, 0x78c267d0, 0x012dde0a, 0x551fde25, 0x2cf067ff, 0x52185256, 0x2bf7eb8c, 0x93372745, 0xead89e9f, 0x9430ab36, 0xeddf12ec, 0x7736aaf7, 0x0ed9132d, 0x70312684, 0x09de9f5e, +0xb11e5397, 0xc8f1ea4d, 0xb619dfe4, 0xcff6663e, 0x9bc46611, 0xe22bdfcb, 0x9cc3ea62, 0xe52c53b8, 0x5dec9f71, 0x240326ab, 0x5aeb1302, 0x2304aad8, 0x42869f39, 0x3b6926e3, 0x4581134a, 0x3c6eaa90, 0x84ae6659, 0xfd41df83, 0x83a9ea2a, 0xfa4653f0, +0xae7453df, 0xd79bea05, 0xa973dfac, 0xd09c6676, 0x685caabf, 0x11b31365, 0x6f5b26cc, 0x16b49f16, 0x00000000, 0xefdf2c37, 0x4145f239, 0xae9ade0e, 0xd6b9435e, 0x39666f69, 0x97fcb167, 0x78239d50, 0x60e723d4, 0x8f380fe3, 0x21a2d1ed, 0xce7dfdda, +0xb65e608a, 0x59814cbd, 0xf71b92b3, 0x18c4be84, 0xa373f5f0, 0x4cacd9c7, 0xe23607c9, 0x0de92bfe, 0x75cab6ae, 0x9a159a99, 0x348f4497, 0xdb5068a0, 0xc394d624, 0x2c4bfa13, 0x82d1241d, 0x6d0e082a, 0x152d957a, 0xfaf2b94d, 0x54686743, 0xbbb74b74, +0xb24e864c, 0x5d91aa7b, 0xf30b7475, 0x1cd45842, 0x64f7c512, 0x8b28e925, 0x25b2372b, 0xca6d1b1c, 0xd2a9a598, 0x3d7689af, 0x93ec57a1, 0x7c337b96, 0x0410e6c6, 0xebcfcaf1, 0x455514ff, 0xaa8a38c8, 0x113d73bc, 0xfee25f8b, 0x50788185, 0xbfa7adb2, +0xc78430e2, 0x285b1cd5, 0x86c1c2db, 0x691eeeec, 0x71da5068, 0x9e057c5f, 0x309fa251, 0xdf408e66, 0xa7631336, 0x48bc3f01, 0xe626e10f, 0x09f9cd38, 0x3d5adc42, 0xd285f075, 0x7c1f2e7b, 0x93c0024c, 0xebe39f1c, 0x043cb32b, 0xaaa66d25, 0x45794112, +0x5dbdff96, 0xb262d3a1, 0x1cf80daf, 0xf3272198, 0x8b04bcc8, 0x64db90ff, 0xca414ef1, 0x259e62c6, 0x9e2929b2, 0x71f60585, 0xdf6cdb8b, 0x30b3f7bc, 0x48906aec, 0xa74f46db, 0x09d598d5, 0xe60ab4e2, 0xfece0a66, 0x11112651, 0xbf8bf85f, 0x5054d468, +0x28774938, 0xc7a8650f, 0x6932bb01, 0x86ed9736, 0x8f145a0e, 0x60cb7639, 0xce51a837, 0x218e8400, 0x59ad1950, 0xb6723567, 0x18e8eb69, 0xf737c75e, 0xeff379da, 0x002c55ed, 0xaeb68be3, 0x4169a7d4, 0x394a3a84, 0xd69516b3, 0x780fc8bd, 0x97d0e48a, +0x2c67affe, 0xc3b883c9, 0x6d225dc7, 0x82fd71f0, 0xfadeeca0, 0x1501c097, 0xbb9b1e99, 0x544432ae, 0x4c808c2a, 0xa35fa01d, 0x0dc57e13, 0xe21a5224, 0x9a39cf74, 0x75e6e343, 0xdb7c3d4d, 0x34a3117a, 0x8ce13f21, 0x633e1316, 0xcda4cd18, 0x227be12f, +0x5a587c7f, 0xb5875048, 0x1b1d8e46, 0xf4c2a271, 0xec061cf5, 0x03d930c2, 0xad43eecc, 0x429cc2fb, 0x3abf5fab, 0xd560739c, 0x7bfaad92, 0x942581a5, 0x2f92cad1, 0xc04de6e6, 0x6ed738e8, 0x810814df, 0xf92b898f, 0x16f4a5b8, 0xb86e7bb6, 0x57b15781, +0x4f75e905, 0xa0aac532, 0x0e301b3c, 0xe1ef370b, 0x99ccaa5b, 0x7613866c, 0xd8895862, 0x37567455, 0x3eafb96d, 0xd170955a, 0x7fea4b54, 0x90356763, 0xe816fa33, 0x07c9d604, 0xa953080a, 0x468c243d, 0x5e489ab9, 0xb197b68e, 0x1f0d6880, 0xf0d244b7, +0x88f1d9e7, 0x672ef5d0, 0xc9b42bde, 0x266b07e9, 0x9ddc4c9d, 0x720360aa, 0xdc99bea4, 0x33469293, 0x4b650fc3, 0xa4ba23f4, 0x0a20fdfa, 0xe5ffd1cd, 0xfd3b6f49, 0x12e4437e, 0xbc7e9d70, 0x53a1b147, 0x2b822c17, 0xc45d0020, 0x6ac7de2e, 0x8518f219, +0xb1bbe363, 0x5e64cf54, 0xf0fe115a, 0x1f213d6d, 0x6702a03d, 0x88dd8c0a, 0x26475204, 0xc9987e33, 0xd15cc0b7, 0x3e83ec80, 0x9019328e, 0x7fc61eb9, 0x07e583e9, 0xe83aafde, 0x46a071d0, 0xa97f5de7, 0x12c81693, 0xfd173aa4, 0x538de4aa, 0xbc52c89d, +0xc47155cd, 0x2bae79fa, 0x8534a7f4, 0x6aeb8bc3, 0x722f3547, 0x9df01970, 0x336ac77e, 0xdcb5eb49, 0xa4967619, 0x4b495a2e, 0xe5d38420, 0x0a0ca817, 0x03f5652f, 0xec2a4918, 0x42b09716, 0xad6fbb21, 0xd54c2671, 0x3a930a46, 0x9409d448, 0x7bd6f87f, +0x631246fb, 0x8ccd6acc, 0x2257b4c2, 0xcd8898f5, 0xb5ab05a5, 0x5a742992, 0xf4eef79c, 0x1b31dbab, 0xa08690df, 0x4f59bce8, 0xe1c362e6, 0x0e1c4ed1, 0x763fd381, 0x99e0ffb6, 0x377a21b8, 0xd8a50d8f, 0xc061b30b, 0x2fbe9f3c, 0x81244132, 0x6efb6d05, +0x16d8f055, 0xf907dc62, 0x579d026c, 0xb8422e5b, 0x00000000, 0x814f0798, 0x69e49576, 0xe8ab92ee, 0xb327cdff, 0x3268ca67, 0xdac35889, 0x5b8c5f11, 0x81e7348d, 0x00a83315, 0xe803a1fb, 0x694ca663, 0x32c0f972, 0xb38ffeea, 0x5b246c04, 0xda6b6b9c, +0x1516bb8f, 0x9459bc17, 0x7cf22ef9, 0xfdbd2961, 0xa6317670, 0x277e71e8, 0xcfd5e306, 0x4e9ae49e, 0x94f18f02, 0x15be889a, 0xfd151a74, 0x7c5a1dec, 0x27d642fd, 0xa6994565, 0x4e32d78b, 0xcf7dd013, 0x28a7fb41, 0xa9e8fcd9, 0x41436e37, 0xc00c69af, +0x9b8036be, 0x1acf3126, 0xf264a3c8, 0x732ba450, 0xa940cfcc, 0x280fc854, 0xc0a45aba, 0x41eb5d22, 0x1a670233, 0x9b2805ab, 0x73839745, 0xf2cc90dd, 0x3db140ce, 0xbcfe4756, 0x5455d5b8, 0xd51ad220, 0x8e968d31, 0x0fd98aa9, 0xe7721847, 0x663d1fdf, +0xbc567443, 0x3d1973db, 0xd5b2e135, 0x54fde6ad, 0x0f71b9bc, 0x8e3ebe24, 0x66952cca, 0xe7da2b52, 0x61a303c9, 0xe0ec0451, 0x084796bf, 0x89089127, 0xd284ce36, 0x53cbc9ae, 0xbb605b40, 0x3a2f5cd8, 0xe0443744, 0x610b30dc, 0x89a0a232, 0x08efa5aa, +0x5363fabb, 0xd22cfd23, 0x3a876fcd, 0xbbc86855, 0x74b5b846, 0xf5fabfde, 0x1d512d30, 0x9c1e2aa8, 0xc79275b9, 0x46dd7221, 0xae76e0cf, 0x2f39e757, 0xf5528ccb, 0x741d8b53, 0x9cb619bd, 0x1df91e25, 0x46754134, 0xc73a46ac, 0x2f91d442, 0xaeded3da, +0x4904f888, 0xc84bff10, 0x20e06dfe, 0xa1af6a66, 0xfa233577, 0x7b6c32ef, 0x93c7a001, 0x1288a799, 0xc8e3cc05, 0x49accb9d, 0xa1075973, 0x20485eeb, 0x7bc401fa, 0xfa8b0662, 0x1220948c, 0x936f9314, 0x5c124307, 0xdd5d449f, 0x35f6d671, 0xb4b9d1e9, +0xef358ef8, 0x6e7a8960, 0x86d11b8e, 0x079e1c16, 0xddf5778a, 0x5cba7012, 0xb411e2fc, 0x355ee564, 0x6ed2ba75, 0xef9dbded, 0x07362f03, 0x8679289b, 0x708a5cd8, 0xf1c55b40, 0x196ec9ae, 0x9821ce36, 0xc3ad9127, 0x42e296bf, 0xaa490451, 0x2b0603c9, +0xf16d6855, 0x70226fcd, 0x9889fd23, 0x19c6fabb, 0x424aa5aa, 0xc305a232, 0x2bae30dc, 0xaae13744, 0x659ce757, 0xe4d3e0cf, 0x0c787221, 0x8d3775b9, 0xd6bb2aa8, 0x57f42d30, 0xbf5fbfde, 0x3e10b846, 0xe47bd3da, 0x6534d442, 0x8d9f46ac, 0x0cd04134, +0x575c1e25, 0xd61319bd, 0x3eb88b53, 0xbff78ccb, 0x582da799, 0xd962a001, 0x31c932ef, 0xb0863577, 0xeb0a6a66, 0x6a456dfe, 0x82eeff10, 0x03a1f888, 0xd9ca9314, 0x5885948c, 0xb02e0662, 0x316101fa, 0x6aed5eeb, 0xeba25973, 0x0309cb9d, 0x8246cc05, +0x4d3b1c16, 0xcc741b8e, 0x24df8960, 0xa5908ef8, 0xfe1cd1e9, 0x7f53d671, 0x97f8449f, 0x16b74307, 0xccdc289b, 0x4d932f03, 0xa538bded, 0x2477ba75, 0x7ffbe564, 0xfeb4e2fc, 0x161f7012, 0x9750778a, 0x11295f11, 0x90665889, 0x78cdca67, 0xf982cdff, +0xa20e92ee, 0x23419576, 0xcbea0798, 0x4aa50000, 0x90ce6b9c, 0x11816c04, 0xf92afeea, 0x7865f972, 0x23e9a663, 0xa2a6a1fb, 0x4a0d3315, 0xcb42348d, 0x043fe49e, 0x8570e306, 0x6ddb71e8, 0xec947670, 0xb7182961, 0x36572ef9, 0xdefcbc17, 0x5fb3bb8f, +0x85d8d013, 0x0497d78b, 0xec3c4565, 0x6d7342fd, 0x36ff1dec, 0xb7b01a74, 0x5f1b889a, 0xde548f02, 0x398ea450, 0xb8c1a3c8, 0x506a3126, 0xd12536be, 0x8aa969af, 0x0be66e37, 0xe34dfcd9, 0x6202fb41, 0xb86990dd, 0x39269745, 0xd18d05ab, 0x50c20233, +0x0b4e5d22, 0x8a015aba, 0x62aac854, 0xe3e5cfcc, 0x2c981fdf, 0xadd71847, 0x457c8aa9, 0xc4338d31, 0x9fbfd220, 0x1ef0d5b8, 0xf65b4756, 0x771440ce, 0xad7f2b52, 0x2c302cca, 0xc49bbe24, 0x45d4b9bc, 0x1e58e6ad, 0x9f17e135, 0x77bc73db, 0xf6f37443, +0x00000000, 0xaeb6407d, 0xb895929f, 0x1623d2e2, 0xf1b508b8, 0x5f0348c5, 0x49209a27, 0xe796da5a, 0x5da836d5, 0xf31e76a8, 0xe53da44a, 0x4b8be437, 0xac1d3e6d, 0x02ab7e10, 0x1488acf2, 0xba3eec8f, 0xd6cc85b7, 0x787ac5ca, 0x6e591728, 0xc0ef5755, +0x27798d0f, 0x89cfcd72, 0x9fec1f90, 0x315a5fed, 0x8b64b362, 0x25d2f31f, 0x33f121fd, 0x9d476180, 0x7ad1bbda, 0xd467fba7, 0xc2442945, 0x6cf26938, 0x22fc9351, 0x8c4ad32c, 0x9a6901ce, 0x34df41b3, 0xd3499be9, 0x7dffdb94, 0x6bdc0976, 0xc56a490b, +0x7f54a584, 0xd1e2e5f9, 0xc7c1371b, 0x69777766, 0x8ee1ad3c, 0x2057ed41, 0x36743fa3, 0x98c27fde, 0xf43016e6, 0x5a86569b, 0x4ca58479, 0xe213c404, 0x05851e5e, 0xab335e23, 0xbd108cc1, 0x13a6ccbc, 0xa9982033, 0x072e604e, 0x110db2ac, 0xbfbbf2d1, +0x582d288b, 0xf69b68f6, 0xe0b8ba14, 0x4e0efa69, 0x2c08bcf0, 0x82befc8d, 0x949d2e6f, 0x3a2b6e12, 0xddbdb448, 0x730bf435, 0x652826d7, 0xcb9e66aa, 0x71a08a25, 0xdf16ca58, 0xc93518ba, 0x678358c7, 0x8015829d, 0x2ea3c2e0, 0x38801002, 0x9636507f, +0xfac43947, 0x5472793a, 0x4251abd8, 0xece7eba5, 0x0b7131ff, 0xa5c77182, 0xb3e4a360, 0x1d52e31d, 0xa76c0f92, 0x09da4fef, 0x1ff99d0d, 0xb14fdd70, 0x56d9072a, 0xf86f4757, 0xee4c95b5, 0x40fad5c8, 0x0ef42fa1, 0xa0426fdc, 0xb661bd3e, 0x18d7fd43, +0xff412719, 0x51f76764, 0x47d4b586, 0xe962f5fb, 0x535c1974, 0xfdea5909, 0xebc98beb, 0x457fcb96, 0xa2e911cc, 0x0c5f51b1, 0x1a7c8353, 0xb4cac32e, 0xd838aa16, 0x768eea6b, 0x60ad3889, 0xce1b78f4, 0x298da2ae, 0x873be2d3, 0x91183031, 0x3fae704c, +0x85909cc3, 0x2b26dcbe, 0x3d050e5c, 0x93b34e21, 0x7425947b, 0xda93d406, 0xccb006e4, 0x62064699, 0x93af2d53, 0x3d196d2e, 0x2b3abfcc, 0x858cffb1, 0x621a25eb, 0xccac6596, 0xda8fb774, 0x7439f709, 0xce071b86, 0x60b15bfb, 0x76928919, 0xd824c964, +0x3fb2133e, 0x91045343, 0x872781a1, 0x2991c1dc, 0x4563a8e4, 0xebd5e899, 0xfdf63a7b, 0x53407a06, 0xb4d6a05c, 0x1a60e021, 0x0c4332c3, 0xa2f572be, 0x18cb9e31, 0xb67dde4c, 0xa05e0cae, 0x0ee84cd3, 0xe97e9689, 0x47c8d6f4, 0x51eb0416, 0xff5d446b, +0xb153be02, 0x1fe5fe7f, 0x09c62c9d, 0xa7706ce0, 0x40e6b6ba, 0xee50f6c7, 0xf8732425, 0x56c56458, 0xecfb88d7, 0x424dc8aa, 0x546e1a48, 0xfad85a35, 0x1d4e806f, 0xb3f8c012, 0xa5db12f0, 0x0b6d528d, 0x679f3bb5, 0xc9297bc8, 0xdf0aa92a, 0x71bce957, +0x962a330d, 0x389c7370, 0x2ebfa192, 0x8009e1ef, 0x3a370d60, 0x94814d1d, 0x82a29fff, 0x2c14df82, 0xcb8205d8, 0x653445a5, 0x73179747, 0xdda1d73a, 0xbfa791a3, 0x1111d1de, 0x0732033c, 0xa9844341, 0x4e12991b, 0xe0a4d966, 0xf6870b84, 0x58314bf9, +0xe20fa776, 0x4cb9e70b, 0x5a9a35e9, 0xf42c7594, 0x13baafce, 0xbd0cefb3, 0xab2f3d51, 0x05997d2c, 0x696b1414, 0xc7dd5469, 0xd1fe868b, 0x7f48c6f6, 0x98de1cac, 0x36685cd1, 0x204b8e33, 0x8efdce4e, 0x34c322c1, 0x9a7562bc, 0x8c56b05e, 0x22e0f023, +0xc5762a79, 0x6bc06a04, 0x7de3b8e6, 0xd355f89b, 0x9d5b02f2, 0x33ed428f, 0x25ce906d, 0x8b78d010, 0x6cee0a4a, 0xc2584a37, 0xd47b98d5, 0x7acdd8a8, 0xc0f33427, 0x6e45745a, 0x7866a6b8, 0xd6d0e6c5, 0x31463c9f, 0x9ff07ce2, 0x89d3ae00, 0x2765ee7d, +0x4b978745, 0xe521c738, 0xf30215da, 0x5db455a7, 0xba228ffd, 0x1494cf80, 0x02b71d62, 0xac015d1f, 0x163fb190, 0xb889f1ed, 0xaeaa230f, 0x001c6372, 0xe78ab928, 0x493cf955, 0x5f1f2bb7, 0xf1a96bca, ] + +d0x6a0cfe80=[ 0x8e04b6b9, 0x394e99f8, 0xd8200c08, 0x2f50ca02, 0x91e1d3b4, 0x9dc66c77, 0x31b9bc61, 0x9916f62d, 0x3569263b, 0xdb4cae02, 0x30b5af0f, 0xbcd1a8d2, 0x53f83385, 0xae1f6172, 0x9fa6dd13, 0xcaeec5a8, 0x12cec9a0, 0xc7c56905, 0xb52a9e25, 0x69da0877, +0x5dbf3d22, 0x25c75eff, 0x201bd7cb, 0x7ca8f987, 0x0e470ea7, 0x10ae78c4, 0x3a223bf2, 0x65fdb7b4, 0x5624bab1, 0x52f420eb, 0x84932244, 0xd407b3cb, 0x161e53fa, 0x797470b3, 0x010c136e, 0x4786d11b, 0xcbe2d6c6, 0x7ec848e3, 0x237775c1, 0x6d0a922d, +0x4ba16ed8, 0xac7fd016, 0x5fdf8c46, 0x2d307b66, 0xe30e2494, 0xa238deb1, 0x5728a9df, 0x8d6814b3, 0xabc3e846, 0x0c27bfc3, 0xfb5779c9, 0xe895a307, 0xfe8bf0fd, 0xd2b798f5, 0x763f6d7a, 0xddfc853c, 0x2b805058, 0x2a8c4336, 0x73e3e44e, 0x519882e1, +0x90edc0da, 0x7183552a, 0x60213e80, 0x787863dd, 0x05dc8934, 0x4e7de7ec, 0xe062869e, 0x64f1a4da, 0x1d85d469, 0x18595d5d, 0x036ca20a, 0x0a9794fd, 0x6e663027, 0xaacffb28, 0x77337e14, 0xe16e95f0, 0xf41c6400, 0xb8013288, 0x8043b81e, 0x43564b41, +0x36058431, 0x403ae94b, 0xc0795155, 0x6c068143, 0x08f72599, 0xfceb4199, 0x4c1d5688, 0x06b02b3e, 0xd1db3aff, 0xc4a9cb0f, 0xe999b069, 0xf937c8ad, 0x7a18d2b9, 0xb74a2f41, 0xde902736, 0x26abfcf5, 0xd50ba0a5, 0x4aad7db6, 0x5863b416, 0xe7debece, +0xa9a35922, 0xebf9010d, 0x0260b164, 0x612d2dee, 0xa488f58f, 0x227b66af, 0xb90d21e6, 0xad73c378, 0x72eff720, 0xd66702af, 0x1a39ec39, 0x953149ee, 0x3d9e03a2, 0xa584e6e1, 0xbfbd0ad8, 0xfa5b6aa7, 0x87ff804e, 0x68d61b19, 0x4f71f482, 0x6ab6aa7d, +0xb39ab51b, 0x9b764749, 0x981ae543, 0xc5a5d861, 0x425a582f, 0x1572f1f0, 0xc6c97a6b, 0x5a030572, 0xee258839, 0x0f4b1dc9, 0x8bd83f8d, 0xb296a675, 0x0d2bacad, 0x965debe4, 0xd76b11c1, 0xf67cd564, 0x468ac275, 0xc315f35f, 0xaf13721c, 0xe6d2ada0, +0x34653555, 0xed492a33, 0xe20237fa, 0x48cdccd2, 0x33d90d05, 0x3b2e289c, 0xcf324c9c, 0xcc5eee96, 0x7553cf70, 0xef299b57, 0xcd52fdf8, 0x32d51e6b, 0x9cca7f19, 0x11a26baa, 0x596fa778, 0xa334cddf, 0x19554e33, 0x27a7ef9b, 0x09fb36f7, 0x745fdc1e, +0xff87e393, 0xc88e74cc, 0xdcf09652, 0x1c89c707, 0x38428a96, 0x832f1a14, 0x8f08a5d7, 0x4d1145e6, 0x07bc3850, 0xe4b21cc4, 0x943d5a80, 0xf1c0ed34, 0xf510776e, 0x28ecf252, 0x859f312a, 0xa6e844eb, 0x4136fa25, 0xc98267a2, 0x9eaace7d, 0x88b49d87, +0x5cb32e4c, 0x5ed39f28, 0x8223097a, 0x679d06d0, 0xbdddbbbc, 0x1b35ff57, 0x04d09a5a, 0x29e0e13c, 0x928d71be, 0xdf9c3458, 0x7da4eae9, 0xb4268d4b, 0xbb6d9082, 0xf83bdbc3, 0x5b0f161c, 0x634d9c8a, 0xa0586fd5, 0x147ee29e, 0x13c2dace, 0x669115be, +0x6bbab913, 0xc219e031, 0x2e5cd96c, 0xbeb119b6, 0xd92c1f66, 0xeaf51263, 0xa7e45785, 0x45e6607f, 0xa8af4a4c, 0x938162d0, 0x00000000, 0xec45395d, 0x62418fe4, 0x0b9b8793, 0x814fab70, 0xd0d72991, 0x554818bb, 0xf0ccfe5a, 0x44ea7311, 0xfde752f7, +0x3709975f, 0x49c1dfbc, 0x2c3c6808, 0xb1fa047f, 0x5094918f, 0xd3bb8b9b, 0x2117c4a5, 0xb6463c2f, 0x8c6407dd, 0x8ad42ce3, 0xba6183ec, 0x86f39320, 0xf2ac4f3e, 0x89b88ee9, 0x3ffeb2c6, 0xf3a05c50, 0x54440bd5, 0x7fc45b8d, 0xe5be0faa, 0x1ee97663, +0x9751f88a, 0x9a7a5427, 0x708f4644, 0xc175423b, 0x1fe5650d, 0xda40bd6c, 0x3ef2a1a8, 0xb0f61711, 0x7b14c1d7, 0x3c9210cc, 0x17124094, 0xa1547cbb, 0x24cb4d91, 0xf770c60a, 0xce3e5ff2, 0x6f6a2349, 0xd15b45c2, 0xcb21b23a, 0x8ad19983, 0x368ac21f, +0x58b418bc, 0x912cae70, 0xc998b6cc, 0xbd4ad7fe, 0x2c66798e, 0xecf3ef29, 0xf70ed8da, 0xafbac066, 0xf4a6504e, 0xc3ab525a, 0x81f3f177, 0xb4d1bbfc, 0xe747cbb4, 0x8a47d5ea, 0xc09596a7, 0xb6fef363, 0x89791117, 0x99300279, 0x8bc015e1, 0xe7d187dd, +0x503ef8dc, 0x662276aa, 0x370d0214, 0x49ec87b0, 0x6d965237, 0x7f6645af, 0xd2f3cd56, 0x4258a32d, 0x43492f4f, 0x4ad2434d, 0x7555a139, 0xec65a340, 0x41f02bb9, 0xa498a892, 0x3da8aaeb, 0xf61f54b8, 0xca303e58, 0xeedca7b6, 0x9b1f4ae6, 0x34a58a80, +0x0bb4249d, 0xa7302006, 0x5211b043, 0xae3d006d, 0x582254d5, 0x8074317c, 0xad9588f9, 0xc90efaa5, 0x9a0ec684, 0x928426e4, 0x59a594de, 0x022f489f, 0x5933d8b7, 0xdbfeed3d, 0xa58924f0, 0xc33d1e33, 0xa7a66c6f, 0xee4aebdf, 0x77eca5cf, 0x03a88894, +0x497acbd9, 0x4077ebb2, 0x43df6326, 0x24ec99ee, 0x099b6c02, 0x89ef5d7e, 0xbddc9b97, 0x2fcef11a, 0x7c588152, 0x0187c00b, 0x6fb91aa8, 0x27d25d13, 0x3e966e16, 0x01118c62, 0x486b47bb, 0xa51f6899, 0xd3e24134, 0x7d490d30, 0x825b79e3, 0xbccd17f5, +0x7ddf4159, 0x9a988aed, 0xed742f22, 0x649b725c, 0xb5c0379e, 0x2e493111, 0x91bae219, 0xbc5b5b9c, 0x1855bf67, 0x19443305, 0xc8893aae, 0xf5219045, 0x2edf7d78, 0xefcd2bd4, 0xb668bf0a, 0xfd3d3c4c, 0x3d3ee682, 0x7ccecd3b, 0x88fed11c, 0x00000000, +0x74442d5b, 0x1049136e, 0x92126a8d, 0xe4ef4320, 0x033ec4fd, 0xff8438ba, 0x834af581, 0xf4301c27, 0x6ea896ca, 0x99a64e10, 0x5b1c9028, 0x11ced365, 0xe65647d6, 0x6d001e5e, 0x3e00227f, 0xb447f795, 0x26559d18, 0x82cd358a, 0x25fd158c, 0xe6c00bbf, +0x766b65c4, 0xdb68a154, 0x081cac09, 0xfe95b4d8, 0xac1248f2, 0x48fd0bd2, 0x361c8e76, 0x8165bd1e, 0x51b938d7, 0xb7793368, 0x3c2f6ae0, 0x2de1b985, 0xfe03f8b1, 0xf68918d1, 0xcaa67231, 0xf5b7dc2c, 0x4a440f24, 0x9b89068f, 0x4b558346, 0xe4790f49, +0x640d3e35, 0x42ceef44, 0x75c3ed50, 0x7ee185a4, 0x1b6b7b9a, 0x74d26132, 0x3f87e274, 0xd1cd09ab, 0x83dcb9e8, 0x12f01798, 0xac84049b, 0xe5fecf42, 0xc81f76c7, 0x6e3edaa3, 0x35224a8b, 0x00964c69, 0xd04ac9a0, 0x1aecbb91, 0x7e77c9cd, 0xb5567bf7, +0x1377d793, 0xc003dace, 0xc11256ac, 0x26c3d171, 0x80e27d15, 0x3433c6e9, 0x02b904f6, 0x98218e1b, 0xda792d36, 0x4bc3cf2f, 0x90ab6e7b, 0x903d2212, 0x76fd29ad, 0x2744117a, 0xc22c9251, 0xbee25f6a, 0x5b8adc41, 0x6733fac8, 0x2f58bd73, 0x53003c21, +0xd265813f, 0x512f74be, 0x9303e6ef, 0x6c87de55, 0x98b7c272, 0x0a33e496, 0x12665bf1, 0x6f2f56c1, 0x10df5f07, 0x53967048, 0x0aa5a8ff, 0xdaef615f, 0xfcbafc47, 0xef5b67bd, 0xfc2cb02e, 0xd9d1a5a2, 0xbf659f61, 0x5a9b5023, 0x658afe3e, 0xc2bade38, +0xd85665a9, 0x88689d75, 0x090d206b, 0x13e19bfa, 0xf79894b3, 0xad03c490, 0x247ad587, 0x1a7af7f8, 0xbff3d308, 0xd3740d5d, 0xa621ac64, 0x7ff009c6, 0x18c3f30e, 0x35b406e2, 0x9395aa86, 0x256b59e5, 0xaf2c8c0f, 0x2d77f5ec, 0x19d27f6c, 0x777ae9a6, +0x5287fc2a, 0xe568832b, 0xaeab4c04, 0x11589f0c, 0x40e1a7db, 0xc1841ac5, 0xa40ee4fb, 0x6c11923c, 0x3cb92689, 0xd0dc85c9, 0x1bfd37f3, 0xfdab7025, 0xd8c029c0, 0x67a5b6a1, 0x379b4e7d, 0xede2634b, 0x3f11ae1d, 0x5a0d1c4a, 0xff1274d3, 0xcbb7fe53, +0x0b2268f4, 0x651cb257, 0x416667d0, 0xd947e9cb, 0xa6b7e00d, 0xb7ef7f01, 0x8b565988, 0x2cf035e7, 0x66b43ac3, 0xbe741303, 0x088ae060, 0x50a8b4b5, 0xe436ece6, 0x05d098fb, 0xccdcca1f, 0x1ec27c59, 0x8d08d5dc, 0x29f5f3ae, 0x0bd5e8e4, 0x78e6e02b, +0xfaf490bf, 0xc90c52e4, 0x4b1e2270, 0xedd3186f, 0x2e157738, 0xa5e2f325, 0xde2bda34, 0xea339cf9, 0x032fc93a, 0xb3daaea2, 0xfe3bdd13, 0x4fd16fdc, 0xc81387b3, 0x701cc1f5, 0x0f1aa548, 0xe8038094, 0x30d70b61, 0x26ef56e6, 0x77fc4563, 0xf6c1fccd, +0x6edebdac, 0x7ad6fc46, 0xa20277b3, 0x41d41fc3, 0x44048738, 0xaf28ce96, 0x6a11f000, 0x3507939a, 0x60dbcdb3, 0xb80f4646, 0x82127094, 0x06ff51c1, 0xdf340f63, 0x88d84d27, 0x7e19b1ea, 0x04cf4dac, 0xa0326bde, 0xe0f9a14a, 0x61c418e4, 0xf03ead0c, +0x813db9ae, 0x99009436, 0x76e39034, 0x0d2ab925, 0x500cc6d2, 0x382d2abf, 0x7f0664bd, 0x9fffc5f7, 0xf4f1e0a0, 0x693e393a, 0xfc0bc17e, 0x7c29ad87, 0x8c17008b, 0x2d3abe02, 0xa6cd3a1f, 0x9dcfd99a, 0x11d8d911, 0x02301c6d, 0x3ce26713, 0x25c09fdc, +0x7bc92911, 0x89c79870, 0x7d3678d0, 0x710314a2, 0x59e9325b, 0xae371bc1, 0x183d2d98, 0x492e3e1d, 0x28ea26f9, 0x9b30885b, 0x57ec4244, 0x51131385, 0xd9cb5ea2, 0x5ac6fb61, 0x341846cd, 0xcff30325, 0x63f40489, 0x6ceea1c1, 0x0c356c72, 0x523cdabf, +0xff240844, 0x1922f8cf, 0x32e7170c, 0x172788d0, 0x3fcdae29, 0xbddfdebd, 0xbfefc2d0, 0xd6d1fbea, 0x5c39aaa0, 0x56f39713, 0x4de173b1, 0xd8d48bf5, 0x62ebd1de, 0xdc1bc659, 0x6821ec6d, 0x9535f844, 0x79f9357c, 0x4eceba8b, 0x22201b4a, 0xd3016311, +0x84ed2155, 0xa7d2ef48, 0xe606f08b, 0xe3d66870, 0xe91c55c3, 0x42fbd6f9, 0x5e09b6cd, 0xf121785b, 0xeccccd38, 0x1a0d31f5, 0xb43a2a34, 0x85f2f402, 0xc0e9a66d, 0xb715e30e, 0x8e271ce6, 0x1dedb563, 0xcdc31f48, 0x233fce1d, 0x75cc590e, 0x6fc168fb, +0xa8c84a00, 0xd5fe32d0, 0xdd04130e, 0x981f4161, 0x6414801f, 0x2c256b55, 0x13e8c57c, 0x40cbca94, 0x6b0e2557, 0xad18d2fb, 0xf20eb161, 0x46349b55, 0x650b5548, 0xbb208f7c, 0x08fa21de, 0x733308cf, 0x27f083b1, 0xf7de299a, 0x3932ffe8, 0xf8c48cd2, +0x8ae8514a, 0x472b4e02, 0xefe30402, 0xabe7833a, 0x673b4925, 0xfbeb45e8, 0x93caa985, 0xc70922fb, 0x1b12e4a2, 0xb525ff63, 0x90e560bf, 0x87c2e86f, 0xdbfb42cf, 0x53230fe8, 0x31c8de36, 0xc5393e96, 0x74d38c59, 0xbcc00bea, 0x2ada3a94, 0x1fdda90e, +0xf9db5985, 0x0aca3db3, 0xac0707ac, 0x3ed27b7e, 0xa9d79f57, 0x140841ea, 0xaaf8566d, 0x9cd00ccd, 0x9a2f5d0c, 0xd02eaa2b, 0xba3f5a2b, 0x43e403ae, 0xd1317f7c, 0xb1eab2cf, 0xb60a3659, 0x6df17496, 0x86dd3d38, 0x4cfea6e6, 0x58f6e70c, 0x16385d87, +0x151794bd, 0xe52939b1, 0x4a01f727, 0x5f16639a, 0xeefcd155, 0x3b02e385, 0xc2d9ba00, 0x451b526f, 0xc3c66f57, 0xceecd672, 0xf3116436, 0x20100727, 0x66249c72, 0xa12dbe89, 0xbef01787, 0x24df4a8b, 0x37378ff7, 0x09e5f489, 0x830da5c3, 0x92d57cd2, +0xcb3c4e89, 0x80226cf9, 0x4831eb4a, 0x36285aa0, 0xd21eb646, 0x0e05701f, 0x942a2d13, 0xe1e6741d, 0xb2c57bf5, 0xe2c9bd27, 0xb9109311, 0xd7ce2ebd, 0x3dfdb244, 0x00000000, 0xa31da2e4, 0x33f8c25b, 0xe71925dc, 0xca239bde, 0x9ee010a0, 0x011fd557, +0x3a1d36d2, 0x210fd270, 0xf5ee35f7, 0xdae49798, 0xfd141429, 0x722cdd98, 0x5bd92e36, 0xa4fd2672, 0xd4e1e787, 0xc616f7ac, 0x1cf26034, 0xb0f56798, 0x91fab5e8, 0x55dc5e29, 0x8bf7841d, 0x9705e429, 0xc426ebc1, 0x10c70c46, 0x8f38c9b1, 0x2f0aa26f, +0x2bc5efc3, 0xc1f6733a, 0xeb2c49ae, 0x07e08496, 0x5d267ff7, 0x961a317e, 0x54c38b7e, 0x12f7102b, 0x99fa75eb, 0x23777700, 0xd257380f, 0xe3cdaf56, 0x65feac51, 0x12ede059, 0x246a7892, 0xe0659735, 0x7a37dabd, 0x60d2d0e3, 0x00000000, 0xa860e2b2, +0xfc04d9ba, 0xb598e77e, 0x4f187a15, 0x7806a99d, 0x925aa78f, 0x57cc036b, 0xfface1d9, 0xfb19d628, 0x1658d7a8, 0xdd42dd9a, 0x614b9ba0, 0x6df64656, 0xea5c0e12, 0xf288776c, 0x3d274aaf, 0x43a5a7e3, 0xabc8dad1, 0x5ae895de, 0x906bd4af, 0x52e07fd9, +0x66569432, 0xd0664b2f, 0x3e8f72cc, 0x1469a488, 0xf59578fe, 0xe9f43671, 0x28d7a564, 0x3cbe01ec, 0xce367680, 0x0e8caed6, 0xd3ce734c, 0x33abe479, 0xef7072a0, 0x723f30ba, 0x0ba0d264, 0x5fc4e96c, 0xf8b1ee4b, 0x9ee77a79, 0xb401ac3d, 0x47109012, +0x265b0bb2, 0xc8b23251, 0xc63e9c87, 0x50d10cf9, 0x88bfadd1, 0x1c614e8f, 0xe4d0a0c4, 0x2ae6d644, 0x8fa2a243, 0xfa809d6b, 0x55fd704b, 0x859b3b64, 0x7bae91fe, 0x4bad4de4, 0xe6e1d3e4, 0xcfaf3dc3, 0x9a524d88, 0x91f29fec, 0x6e5e7e35, 0x7d2ad52f, +0xcb1a0a32, 0x1ae50a5e, 0x9776db3d, 0xf3113c2f, 0xc28bab76, 0xcc0705a0, 0x4cb04276, 0x74bb746b, 0x0991a144, 0xe86d7d32, 0xb0b49bcc, 0xa2597b95, 0x01994b43, 0x17c19ceb, 0x0cbdddf6, 0xad4c9e00, 0x73a67bf9, 0x1b7c411d, 0x4521e332, 0x84027027, +0xc0bad856, 0x719708d9, 0xb285e8ec, 0x56554828, 0x9f7e313a, 0x4194d4c3, 0xaee4a663, 0x352fa0a8, 0xdf73aeba, 0x637ae880, 0x1374ab1a, 0xf1204f0f, 0xc312e035, 0xe254e415, 0xa06808b5, 0x21460420, 0xf7a40bde, 0x2c629295, 0x2b7f9d07, 0xed410180, +0xca834171, 0x799fe2de, 0xaa519192, 0x9cd60959, 0x3232af3a, 0x8a8edef1, 0xe1fcdc76, 0xdeeae5f9, 0x380b361d, 0x5df59a4c, 0x071d0f92, 0x8b1795b2, 0x7e82ed4c, 0x94dee35e, 0xebc54551, 0xbc09463a, 0xc7a7d7c4, 0x22ee3c43, 0xb9253a88, 0x4d290935, +0xd9f7ea6b, 0x9547a81d, 0xdcdb96d9, 0x2e53e1b5, 0xda5fd208, 0x7cb39e6c, 0x8c0a9a20, 0x58d9e6fe, 0xd1ff006c, 0x5c6cd10f, 0x03a83863, 0x75223f28, 0x831f7fb5, 0xa1f143f6, 0x194d323d, 0x68da3ae4, 0x8d93d163, 0x8e3be900, 0xf0b9044c, 0x18d4797e, +0x1145d83a, 0xd86ea128, 0xd77b44bd, 0x8926e692, 0x34b6ebeb, 0x25f333d1, 0x6467e712, 0x0a399927, 0x3ba30e7e, 0xb12dd08f, 0xd54a379d, 0x9d4f421a, 0xa7750727, 0xe549eb87, 0xf928a508, 0x828634f6, 0x6fc73576, 0xba8d02eb, 0x44b8a871, 0x294eee27, +0x3a3a453d, 0xf63d409d, 0x67cfdf71, 0x2dfbd9d6, 0x052c7cb2, 0x80b747d6, 0x319a9759, 0x6b720287, 0x0808ea07, 0x0d2496b5, 0xfe35aa9a, 0x15f0efcb, 0x694371a7, 0x768a074b, 0x5940adbd, 0x1df805cc, 0xc596a4e4, 0x62e3a3c3, 0xdbc6994b, 0x98633ea8, +0xa4dd3f44, 0xf40c33bd, 0xa5447407, 0x368798cb, 0xfd9d92f9, 0x5379349a, 0x5e5da22f, 0xd6e20ffe, 0x2fcaaaf6, 0x4689db51, 0x4e813156, 0x499c3ec4, 0x48057587, 0x4a3406a7, 0x5b71de9d, 0xacd5d543, 0xbe38351a, 0xcd9e4ee3, 0xaf7ded20, 0x20df4f63, +0xecd84ac3, 0x0f15e595, 0x1fc976ec, 0x86330307, 0x54643b08, 0xc1239315, 0xa9f9a9f1, 0x400d9f80, 0xbb1449a8, 0xc40fefa7, 0x10dc9379, 0x6aeb49c4, 0xeee939e3, 0x514847ba, 0xb7a9945e, 0x371ed388, 0x04b537f1, 0x6c6f0d15, 0x27c240f1, 0x02317320, +0x1e503daf, 0x7f1ba60f, 0x96ef907e, 0x068444d1, 0x87aa4844, 0xa3c030d6, 0xa6ec4c64, 0xb8bc71cb, 0xc92b7912, 0xd4d37cde, 0x93c3eccc, 0x9bcb06cb, 0xb31ca3af, 0x700e439a, 0x423ceca0, 0x3003dc1a, 0x812e0c95, 0xbd900d79, 0xbfa17e59, 0xb630df1d, +0x39927d5e, 0x77134c08, 0x3f16398f, 0xe77898a7, 0xa85f5d2d, 0xf6afa1c7, 0x4d948374, 0xff481ee5, 0xc0c87c90, 0x8d5cffe4, 0x178ceea6, 0x92ca3fe0, 0x7f1bcf1b, 0x05459e2d, 0x3ac5fc58, 0xda4bbc2c, 0x21eb33f1, 0x3fd0fce0, 0xc97f5d27, 0x7f4b518e, +0xe08e4074, 0xe466d14c, 0xe1234f61, 0xdf5ebc94, 0x9ad01142, 0x3e2d6d60, 0x6c7fb085, 0x60dd918a, 0xfa5d1e5d, 0x65c89132, 0x1b2ecfa9, 0xf217ae6a, 0x5a48f347, 0x689721bd, 0xb664923c, 0x0d0f2e1a, 0x0ca2210f, 0x61709e9f, 0xbe7ebc9e, 0x9337ae60, +0x7a0ecfa3, 0x608d0f1f, 0xfa0d80c8, 0xc5dd7c28, 0x64659e27, 0x9e38807a, 0xff188070, 0xbe2e220b, 0x280c8cd3, 0xcdc7528a, 0xbac6b333, 0xe59b40cc, 0x328f4c6f, 0x65980fa7, 0x8849ff5c, 0x84bb40c6, 0x24aeaddc, 0x89e4f049, 0x29f11d53, 0xd6b903b6, +0xc420eda8, 0x4c398c61, 0x7bf35e23, 0xd251928e, 0xd6e99d23, 0x8cf1f0f1, 0x051500b8, 0xf24730ff, 0xace75280, 0x48d11d59, 0xdbe6b339, 0xb28c0304, 0x44733c56, 0x81ae407e, 0xc8d25232, 0x81fedeeb, 0x696ab03d, 0x936730f5, 0x53af4c65, 0x89b46edc, +0x73b9ee14, 0x458eadd6, 0x5bb562c7, 0x01fd9180, 0x45de3343, 0xe93961c3, 0x2d4912fe, 0xfba08fdd, 0x00509e95, 0xc1657385, 0x4dc41de1, 0x16717f26, 0xf3ea3fea, 0x1299ee1e, 0x52024370, 0x7a5e5136, 0x1e6b5184, 0x76aceeac, 0x9f958f6f, 0xcd97cc1f, +0x2cb4837e, 0xdea32d14, 0x9b2d80c2, 0x5be5fc52, 0xa4ade2b7, 0x5f0d6d6a, 0xa015ed1a, 0x17dc7033, 0x1621e1b3, 0xa80fc3b8, 0x7214e101, 0x73e97081, 0x6d822105, 0x2503a2c9, 0x3f806275, 0x0cf2bf9a, 0x56ba4cdd, 0x7eb6c00e, 0xbfd3b38b, 0xa4fd7c22, +0xe0dedee1, 0xa045738f, 0xa1e87c9a, 0x1e3bcf11, 0x20463ce4, 0xb6340ca9, 0xdef3b381, 0xad1ac300, 0x77517f2c, 0xbb3b22b3, 0xb7c99d29, 0x13647f9e, 0x3667dd57, 0xd7449236, 0xbb6bbc26, 0x6c2f2e10, 0x7701e1b9, 0x9e681eef, 0x1a83c0bc, 0x1ad35e29, +0x5f5df3ff, 0x3a9562cd, 0xacb7cc15, 0xfee511f0, 0x80034f6b, 0xec2c617b, 0xc92fc3b2, 0x8d0c6171, 0x6dd2bf90, 0x41663cee, 0xf702aed2, 0x8ca16e64, 0x68c7bf28, 0x4423a2c3, 0x643500b2, 0x978fa1cd, 0x9622aed8, 0x081a2ea2, 0xbf832d1e, 0x09e7bf22, +0xc882cca7, 0x5252dde5, 0x5747dd5d, 0xda1b22b9, 0x3322437a, 0xd3fc9d9b, 0x24fe3349, 0x84ebde53, 0x3372ddef, 0xc470733d, 0x2016a271, 0x492c8cd9, 0xa5507337, 0xed816e6e, 0x363743c2, 0x5ea0627f, 0x409bad6e, 0xc098e205, 0xfeb58f65, 0xc58de2bd, +0x379a4cd7, 0xb3210c11, 0xa9a2ccad, 0x1f96c004, 0x2d198c6b, 0xb79903bc, 0x1fc65e91, 0x9672304d, 0x12c9708b, 0x09b721b7, 0x04e89138, 0xcc6a5d9f, 0x56ead248, 0xfbf01148, 0x9b7d1e57, 0x497c124c, 0x9fc511fa, 0xcc3ac30a, 0x76fc7039, 0x693a2ea8, +0x3b386dd8, 0xb3719284, 0xa1b8e20f, 0x32dfd2fa, 0x01ad0f15, 0xedd1f0fb, 0xdf0e2201, 0x3b68f34d, 0xd3ac030e, 0x3e7df3f5, 0x25533c5c, 0x571743c8, 0x9a808fd7, 0xec7cffee, 0xe5cbde59, 0x72447f94, 0x1334e10b, 0x285c1246, 0x881961c9, 0xd7140ca3, +0xdbb62dac, 0x084ab037, 0xe8c4f043, 0x37cad242, 0xe969ff56, 0x4136a27b, 0xba962da6, 0x8053d1fe, 0x00000000, 0xa9f25238, 0xad4a5d95, 0x29a183c6, 0x97df3f58, 0x929aa175, 0x21bbad64, 0x40cb33fb, 0x04b80fad, 0xf7523047, 0x5a186dd2, 0xe8946ed6, +0x8546d146, 0x53ffd2f0, 0x7ba3c0b6, 0x1b7e513c, 0xa500eda2, 0xc135ed10, 0xf3baa17f, 0x488183cc, 0x5ef0fcea, 0x7ee65e9b, 0x0d5fb08f, 0xe173d1f4, 0x85164fd3, 0x4c6912f4, 0x6120000a, 0x2ce41deb, 0xb2dc9d91, 0xe4364fd9, 0xd2010c1b, 0xf6ff3f52, +0xca3fa62d, 0x54db3175, 0xf4845558, 0x14b33ebc, 0xcaf29fb5, 0x9e29aec0, 0x0607264c, 0xe329f782, 0xe652cc4c, 0xf2837314, 0x78b65b14, 0x54748909, 0x2aa775b5, 0x6fb441b2, 0x17cf233e, 0xd8e93f39, 0xf4e6d4bc, 0xcc97381d, 0x7dafe13e, 0x2c0feb85, +0xe69ff5d4, 0x892bb466, 0xb7f2c6f7, 0x45133407, 0x14d1bf58, 0x03d3a5fe, 0xb244c4a1, 0xf19def72, 0x787b628c, 0x89840c1a, 0x8f4e13ce, 0x510fb2c7, 0xf2e1f2f0, 0x3b0df123, 0xcf449de3, 0x3e144b09, 0x7eb17d58, 0x057b3bce, 0xa05f642d, 0x8f2c922a, +0xb7904713, 0xd88bbedd, 0x3da56f13, 0x46a2101d, 0xd82406a1, 0x00afb87c, 0xcfeb259f, 0x45de0d9f, 0xb48edb75, 0xa6957bf9, 0x516d3323, 0xf150d6ea, 0x4571b5e3, 0x031e9c66, 0xca5d27c9, 0xa63ac385, 0xf132570e, 0x40a53651, 0x78d4daf0, 0x121ba08c, +0x17021aa6, 0x7bca4696, 0xb138d923, 0x9bfd2d72, 0x9e4b2f24, 0xe6304da8, 0x6a60c200, 0xe6fd7430, 0x46c091f9, 0xf7357142, 0x7e1ec524, 0x17609b42, 0x05d483b2, 0x2fbecf9f, 0x12792168, 0x7b65feea, 0xde8c9891, 0x541608ed, 0x2a08cdc9, 0xc9ec03d3, +0xf7f848da, 0xccf5b9f9, 0x2974d04b, 0xf757f0a6, 0x6c67e44c, 0x6acf7a7c, 0x3e76caed, 0x38bcd539, 0x43d92bd3, 0x3ed97291, 0x988130f0, 0x7d62d8a6, 0x38136d45, 0x00cd3998, 0x5708948b, 0xe0376be4, 0x6aadfb98, 0xf42bed24, 0x2f1177e3, 0x6c0565a8, +0xb15a58c7, 0x460da861, 0x11aa8496, 0xdb9522bb, 0x51a00abb, 0x9ee49758, 0xe54c502a, 0xe5e3e856, 0x6f79782a, 0xf79ac93e, 0x0519ba2a, 0x6cc85c30, 0xb1f5e0bb, 0x8a57a9e4, 0x9d988ada, 0x3d68568b, 0xe0fa527c, 0x69b367fe, 0xb2264545, 0x3871eca1, +0x3ebbf375, 0x52be96dd, 0xdb3a9ac7, 0x6caaddd4, 0xe3864ffe, 0x9b3014ea, 0x06a89e30, 0xcc5a0185, 0xde41a109, 0xc98e8237, 0x2f73f607, 0xdd3dbc8b, 0x7b077f0e, 0xe055ea00, 0x7ba8c772, 0xa0f0dc51, 0xa32379af, 0xa6584261, 0x9d55b342, 0x0665a7a8, +0x12b418f0, 0x8af81198, 0xa03de5c9, 0x3ba2495f, 0x7819e368, 0x697e5e66, 0xa546de07, 0x00000000, 0x6a0243e4, 0x437693af, 0x6fd6c056, 0xb4ec5a91, 0x576a156f, 0xe3e4ce1a, 0x8a9a907c, 0xcc388061, 0x11c80572, 0xa0925db5, 0xcf89a47b, 0x89493582, +0x8cff37d4, 0xb73fff6f, 0x147e0724, 0x54b9b091, 0xdeee1975, 0x691cdf82, 0x6f1bf9ce, 0xa58be79f, 0x3dc7eef7, 0xd8468745, 0xb443e2ed, 0x29b9e9d3, 0xdd5f3d6f, 0x8fe1abb2, 0x7d005942, 0x40680fc9, 0x9d3732a6, 0x40c7b7b5, 0x400a8e2d, 0x8f832a56, +0x69d1e61a, 0x11053cea, 0xa38cc1d3, 0x45bc8c7b, 0xca901e51, 0xe58169b2, 0x8c508fa8, 0x982e888c, 0x8c9db630, 0x006281e4, 0x9e8616bc, 0x12d69914, 0x52dc1739, 0x2a6a4c2d, 0x2ca053f9, 0xb2eb7cdd, 0x2cc2d21d, 0xddf08513, 0xe098d398, 0xb4216309, +0xcf261c07, 0x4314124b, 0xa341f84b, 0xb289fd39, 0xc943bbaf, 0x43bbaa37, 0x7dcd60da, 0x9b9fac96, 0x1167bd0e, 0x984c0968, 0x9dfa0b3e, 0x7ed3fcbc, 0x466f2985, 0xdb581b23, 0xf4496cc0, 0xf1ff6e96, 0x2fdc4e7b, 0x2ac5f451, 0x037c1d82, 0x52112ea1, +0xe34b7666, 0xa6f7fa1d, 0xb75d7e8b, 0xe52ed1ce, 0xa5245fe3, 0x05b60256, 0xf22ccb68, 0xde2320ed, 0x3bc0c8bb, 0xf24e4a8c, 0x291651af, 0x8a352800, 0x2c6d6a61, 0xdbf7a35f, 0x3b6f70c7, 0xa3ee4037, 0xb197615f, 0x03b1241a, 0x57a72cf7, 0x8c320e4c, +0xc9213a4b, 0x98e3b114, 0x51c28b5f, 0xa5e9667b, 0x89e68dfe, 0x06ca1fd4, 0x17ada2da, 0x57c5ad13, 0x29db6837, 0x7e7c44c0, 0xdd9204f7, 0x38de54dd, 0x3d0ad76f, 0x141c86c0, 0x9b52950e, 0x5273af45, 0xe75fccb0, 0xdb182e1c, 0x680f8703, 0xab03f7c9, +0x18b4e27e, 0xd1f83771, 0x6a214ea9, 0xbf8d3245, 0xc18205c8, 0x480870e4, 0x50bc929a, 0xe5d1b9b2, 0xe3ab3b85, 0x661b695b, 0x7afbc0b8, 0x2a475222, 0x85b052de, 0x6c5bcc9e, 0xb56d2b28, 0x6e750534, 0x74ef2ee0, 0xaba34b61, 0xe185f22f, 0x2007f7e7, +0xa3cd270e, 0xebc557ea, 0x42e86989, 0x16a00c26, 0xe94b22e8, 0xcd189e92, 0x78d50912, 0x0e14ee58, 0x7a5b7c10, 0xcdb8223a, 0x93105ef8, 0x00000000, 0xe30b872d, 0x46bc2214, 0x52925b30, 0x97e4a9cd, 0x95ca6067, 0x6435a0f1, 0xa98d82cb, 0x5ea87cc2, +0x62ef9e6e, 0x228982e5, 0xc30c70ca, 0x5232e798, 0xa1e3eea4, 0x892ac984, 0xef911c77, 0x8f504bb3, 0x32f3b05c, 0xf991acf9, 0xe7ff7018, 0x4492ebbe, 0xbf2d8eed, 0xdbb892b4, 0x8144a5eb, 0x2c3dd015, 0x4c5c3b79, 0xcf96eb90, 0xf78542a1, 0x8ff0f71b, +0x5c2609c0, 0x56c610ad, 0x0ae0196d, 0x461c9ebc, 0x873e27dc, 0xf9311051, 0x4ed24e7b, 0x40c6a023, 0x70bb657d, 0x5666ac05, 0x5a5c8bf7, 0xa143520c, 0x10da8e11, 0xd3764273, 0xcb621ca5, 0x97441565, 0xf50b37a3, 0xd782b546, 0x06da3e9f, 0xc7f887ff, +0xe9eb9e40, 0x60c157c4, 0xc3accc62, 0x7c81428f, 0xa739d03b, 0x76615be2, 0x3ce75e04, 0x0c3a27f2, 0xf371b594, 0x9da40c08, 0x26ddc978, 0x36a7fbc1, 0xb7e35e2a, 0x83cad0e9, 0x544865af, 0x836a6c41, 0x44325716, 0xa36d9ba6, 0x2ae7ee8a, 0xfd655bcc, +0x3a9ddc33, 0x3813a931, 0x2eb3a517, 0xf15f7c3e, 0xb13960b5, 0x0eb452f0, 0x0a40a5c5, 0x9d04b0a0, 0x4248d521, 0xed1f6975, 0x142e7924, 0xddc21083, 0x7235107f, 0x3c47e2ac, 0x4a8605e6, 0x24f300d2, 0x1600b08e, 0x20a74b4f, 0xd936e7b6, 0xbbd979d8, +0x3a3d609b, 0xf5ab8b0b, 0xcbc2a00d, 0x7875b5ba, 0xf1ffc096, 0x68af3bab, 0xdfecd929, 0x28699b88, 0x0c9a9b5a, 0x48a8cc4c, 0x7295acd7, 0xbda3fbef, 0x4e72f2d3, 0xbd034747, 0xc94cd50f, 0x9950fb3d, 0x9bde8e3f, 0x81e41943, 0x267d75d0, 0x1e6edce1, +0xb5cd9780, 0x5afc375f, 0x701bd9d5, 0x5872425d, 0xe571051a, 0x64951c59, 0x919e2bfa, 0x7e0f378d, 0xb9570cda, 0x58d2fef5, 0xc5d64e55, 0xf725fe09, 0x8dde3eb1, 0xd50cc044, 0xa5171991, 0xd9965b1e, 0xffeb2ece, 0x8ba4bc86, 0xadd9c956, 0xc122b960, +0x00a0bca8, 0x34298ec3, 0xdf4c6581, 0x6a81f201, 0x6061eb6c, 0xfbbf6553, 0x08ced0c7, 0x9b7e3297, 0x1c40154b, 0xe1254e87, 0x18145ed6, 0xb9f7b072, 0x148ec58c, 0x086e6c6f, 0x99f04795, 0x067a8237, 0xa7996c93, 0xaff700fc, 0x4a26b94e, 0xd72209ee, +0xb3b715b7, 0xd3d6fedb, 0xaf57bc54, 0xdd62ac2b, 0x5e08c06a, 0x3489326b, 0x28c92720, 0x3ec997ae, 0x956adccf, 0x1a9a2bd4, 0x32530cf4, 0x76c1e74a, 0x2c9d6cbd, 0x7eaf8b25, 0x6ed5b99c, 0x744f9248, 0x8d7e8219, 0x2453bc7a, 0xc576f2fd, 0x7c21fe27, +0x022ec9aa, 0xad7975fe, 0x9f2a790a, 0x38b31599, 0x36074769, 0x4cfc87d1, 0x898a752c, 0xa92d3e63, 0x40661c8b, 0x22293e4d, 0x04f4f735, 0x107a32b9, 0x6cfb7036, 0x1ce0a9e3, 0xfb1fd9fb, 0x2e1319bf, 0x879e9b74, 0xd1588bd9, 0x028e7502, 0x1a3a977c, +0xb743e282, 0xedbfd5dd, 0xa5b7a539, 0x624f22c6, 0xcf365738, 0x501c2e32, 0x3e692b06, 0xc7583b57, 0x93b0e250, 0xeb65eb42, 0x30dd79f6, 0x1ece6049, 0x1254fb13, 0xb317a91f, 0xf3d1093c, 0x9f8ac5a2, 0xc9ec69a7, 0xd5ac7cec, 0x8510ee76, 0x66bbd5f3, +0x913e9752, 0x04544b9d, 0x307dc55e, 0xfdc5e764, 0xb199dc1d, 0x5c86b568, 0xff4b9266, 0x54e8d907, 0x12f447bb, 0xbb79c570, 0x8b04002e, 0xef31a0df, 0x2dffdf05, 0x733db286, 0xbd26f006, 0xd43b1700, 0x71d4e281, 0x0de992b2, 0xa706a586, 0xd6de556a, +0xc214dab3, 0xed0255b1, 0x7331a0eb, 0xd7344d86, 0x3bd012b6, 0xcd141806, 0x2315055c, 0x201a5fda, 0xc218c8de, 0x5f28756f, 0x92307f04, 0x34dcc26e, 0x64f475b4, 0xbfc3b26c, 0xa6e0af07, 0x9fd5ffdb, 0xb1296835, 0xcd180a6b, 0xf9c4c805, 0x00000000, +0xd8389d5e, 0xe0ebc703, 0x9e3fe737, 0x02e95007, 0x02e5426a, 0x89f62005, 0x1a2c47ed, 0xbfcfa001, 0x48eda030, 0xccf21287, 0x7032e800, 0x6a12bd80, 0x460b6804, 0x0f0cd0d8, 0xbd2ae26b, 0xcffd4801, 0xdad1cd59, 0x52c1e7dd, 0x19231d6b, 0x7ed83259, +0x67fb2f32, 0x8b13626f, 0x5ece7fee, 0xe3e49d85, 0xd9d285b2, 0x9fd9edb6, 0xb0c370d9, 0xee0d0f37, 0x22ff1db0, 0x72d7aa6a, 0xf5cb5036, 0x532bff31, 0xd5dd1d81, 0xe3e88fe8, 0x353ac8ef, 0x2c15c7e9, 0xbe25b8ed, 0x7f322ab5, 0xb22632b3, 0xd6d24707, +0x6a1eafed, 0x67f73d5f, 0xf72e125c, 0x71d8f0ec, 0x1bc65f01, 0xb22a20de, 0x7ed42034, 0x490baab1, 0xe10dcd82, 0x5028b7da, 0x4a08e25a, 0x85f5aa5b, 0x6bf4b701, 0xaaef3734, 0x15209735, 0x9cdaa55d, 0x47ed6285, 0x6bf8a56c, 0x90d53d6e, 0x93d67585, +0x7c31625e, 0x7c3d7033, 0xa5e3e7ec, 0x7dd768df, 0x21f04736, 0x030f5a86, 0xefe717db, 0x36398004, 0xf9c8da68, 0x1bca4d6c, 0x51c2af36, 0xaae32559, 0x5c2b3d84, 0x923c6d69, 0x45043282, 0xc1179258, 0x661d25b3, 0xd9de97df, 0x3bdc00db, 0x5dcd3705, +0x4907b8dc, 0xa405ed6d, 0xa70ab7eb, 0x8af568ee, 0x20164db7, 0x65127f35, 0xcff15a6c, 0xc3fec25f, 0x85f9b836, 0x22f30fdd, 0xf6c40ab0, 0x030348eb, 0xf5c7425b, 0x64f867d9, 0x913f2582, 0xe101dfef, 0x8710e831, 0xccfe00ea, 0xb0cf62b4, 0xdadddf34, +0x86f6e2b0, 0x23191731, 0xa9ec7fdf, 0x48e1b25d, 0x3536da82, 0x01e60a81, 0x2f168f02, 0x913337ef, 0x7f3e38d8, 0x5024a5b7, 0x68fbed87, 0x3a361837, 0xf822c284, 0xa8066733, 0x4be2fab6, 0xd8348f33, 0xa5eff581, 0x0de580df, 0x51cebd5b, 0xa9e06db2, +0x2ef08583, 0x18c90587, 0xd437056d, 0x1623dfde, 0xf7220031, 0x2c19d584, 0x68f7ffea, 0x661137de, 0x01ea18ec, 0x000c126d, 0x88102a84, 0x34d0d003, 0x17c9c732, 0x0eeada59, 0x9d3cafdc, 0xa6ecbd6a, 0x162fcdb3, 0x18c517ea, 0x393942b1, 0xb3cc2a5f, +0xbcc0fa87, 0xce1b4280, 0x21fc555b, 0x0f00c2b5, 0xe20e8569, 0x5ec26d83, 0x38df4830, 0x4beee8db, 0xb1257a58, 0xed0e47dc, 0x36359269, 0x6911f56b, 0xa80a755e, 0xbccce8ea, 0x44ee2a6e, 0xee011d5a, 0x9d30bdb1, 0xf42148da, 0x89fa3268, 0x2efc97ee, +0xab093db5, 0x8af97a83, 0xe0e7d56e, 0xece45f30, 0x46077a69, 0xf42d5ab7, 0xf6c818dd, 0xa409ff00, 0x450820ef, 0xd7385feb, 0x2df3cd68, 0x72dbb807, 0x37df8a85, 0x192f0f06, 0x47e170e8, 0x9e33f55a, 0x393550dc, 0xfac780ee, 0xfacb9283, 0x37d398e8, +0xf82ed0e9, 0x881c38e9, 0xfb218a6f, 0xefeb05b6, 0x44e23803, 0x871cfa5c, 0x5dc12568, 0x52cdf5b0, 0x7ddb7ab2, 0xb3c03832, 0x38d35a5d, 0x651e6d58, 0x0c038a5e, 0x5f246702, 0x90d92f03, 0x5c272fe9, 0x0ee6c834, 0x2f1a9d6f, 0x0c0f9833, 0x14ca8fd9, +0x86faf0dd, 0xe2029704, 0xc11b8035, 0x14c69db4, 0xc0fd8ab4, 0x703efa6d, 0xece84d5d, 0x93da67e8, 0xdb37c7d8, 0xbe29aa80, 0xfb2d9802, 0x8413a0da, 0x17c5d55f, 0x841fb2b7, 0x9cd6b730, 0x8b1f7002, 0xc0f198d9, 0x691de706, 0x5327ed5c, 0xab052fd8, +0xc3f2d032, 0x152c8558, 0x3a3a0a5a, 0x1a205580, 0xd5d10fec, 0x4a04f037, 0xce1750ed, 0xdb3bd5b5, 0x4772a637, 0xcf05de4c, 0xc5a0f7e3, 0x2ac20f73, 0x2f09854a, 0x018c33b5, 0x00000000, 0x824e79b3, 0x6789a88c, 0x988acc41, 0x59f1aa49, 0x24209f50, +0x20fb0ebb, 0x3a3fbb49, 0xad47fcf9, 0x0ff28bf1, 0xa99c6d12, 0x3ee42aa2, 0xb8edea9d, 0x88eb501c, 0x97e46fd7, 0xbcaa5311, 0x5ca60817, 0x3bb388fc, 0xd096c9e0, 0x78869747, 0x2f95ad2d, 0xd186d232, 0xbd2660a4, 0xeeeecb25, 0x6ca0b296, 0x24bcb737, +0xf1e1f4ee, 0x9906fff4, 0x9ddd6e1f, 0x58e1b19b, 0xce15c59e, 0xfbd8f526, 0x835e6261, 0xa77efd31, 0xdf644211, 0xbc367b76, 0xa7e2d556, 0x72bf968f, 0x4c5bbc2d, 0xa88c76c0, 0x77741cb6, 0xd55d43d9, 0xf06dc75b, 0x0aa529af, 0xeb25411c, 0x43a937dc, +0x93a3d65b, 0x63523967, 0x6c3c9af1, 0xa2295f6f, 0x5c3a2070, 0x83c24a06, 0x781abf20, 0x8d20da25, 0x0f6ea396, 0x43351fbb, 0xe11c40d4, 0x73af8d5d, 0x3006ba81, 0xcbde4fa7, 0xee72e342, 0xd4d1706c, 0xa8105ea7, 0x2e85b6ff, 0xdb23fb9d, 0x92b3cd89, +0x0b291a1a, 0x96f47405, 0xfa54c693, 0x4cc7944a, 0x01101bd2, 0x8dbcf242, 0x69f710c8, 0xe00c5b06, 0x35cd30b8, 0xb2d4eb55, 0xaccbcf4c, 0xc0f755bd, 0xb71f616c, 0x009c2867, 0x76640764, 0x6db0a944, 0x2e199e98, 0xfe8f5778, 0xfe137f1f, 0xe44be28a, +0x9816e426, 0x922fe5ee, 0xa9004575, 0x318a8934, 0xdaafc828, 0xeffed0f7, 0x8c30c1f7, 0xf42a7ed7, 0x1e1f2419, 0x21eb1569, 0x3441030d, 0x3ff43170, 0x7d4d1d7e, 0x2a5e2714, 0xb69352d9, 0x977847b0, 0x6d2c8123, 0x3e7802c5, 0xcf99f62b, 0xeaa972a9, +0x671580eb, 0xf0f1ef3c, 0xb9fdf14f, 0x57133a6a, 0x3aa3932e, 0x5d2a3ba2, 0x63ce1100, 0xb871c2fa, 0x896763a9, 0x96685c62, 0x0a3901c8, 0x535483e6, 0x8609c03f, 0x04db91eb, 0x8785f38a, 0x46fe9582, 0x8695e858, 0x7333a53a, 0x2bd214a1, 0xfac8eef4, +0x1b488647, 0x62de0ad2, 0xdbbfd3fa, 0x3b2fa09b, 0x309a92e6, 0xdee871a4, 0x569f09df, 0xea355ace, 0x560321b8, 0x142625d1, 0x3116a153, 0xc06b7dda, 0xc4b0ec31, 0x77e834d1, 0x49903614, 0xb3c4f087, 0xb358d8e0, 0x1e830c7e, 0xcb4267c0, 0xbdba48c3, +0xf5a64d62, 0xde7459c3, 0xb961d928, 0x2b4e3cc6, 0x0e7eb844, 0x1a589d95, 0x0557a25e, 0xb783490b, 0x3f681917, 0xf4b656b0, 0x624222b5, 0xc1e74e6f, 0xd44d580b, 0x1ac4b5f2, 0x587d99fc, 0x89fb4bce, 0x578f120d, 0x42250469, 0x21773d0e, 0x206726dc, +0x1171878f, 0x8719dbed, 0xce89edf9, 0x68e70b1a, 0x53c8ab81, 0x0447b98c, 0x355118df, 0x0ee29023, 0x999ad793, 0xd11afa55, 0x15363e03, 0x4d4ba7ff, 0xb60f7abe, 0xd00ae187, 0x42b92c0e, 0xfb44dd41, 0x66059b39, 0x25acace5, 0xa2b57708, 0x9c515daa, +0xa66ee6e3, 0xa3a56cda, 0x10fdb43a, 0xca527c12, 0xc42cc456, 0x5db613c5, 0xebb9697b, 0x8877787b, 0x696b38af, 0xa6f2ce84, 0x76f82f03, 0xe55bf958, 0x7c5d06ac, 0xf17ddc89, 0x52449834, 0xc17b6608, 0x34dd2b6a, 0x7dd13519, 0x9d414678, 0xb248c332, +0xc53cdf84, 0x1bd4ae20, 0xac57e72b, 0x10619c5d, 0xda33e04f, 0xd5c16bbe, 0x48802dc6, 0x687b237d, 0x52d8b053, 0xe5c7d13f, 0xe18068b3, 0x11edafe8, 0x4662bde5, 0x1f9317ac, 0x79968c95, 0x1f0f3fcb, 0x6699b35e, 0x490c1e73, 0xf53a6505, 0x4dd78f98, +0x481c05a1, 0xff9f4caa, 0x7223bee8, 0x05cb8a39, 0xdff86a76, 0xa33944bd, 0xcace5475, 0xef62f890, 0x14ba0db6, 0xff0364cd, 0x596d822e, 0x47ee8e50, 0x0bb5327d, 0x790aa4f2, 0x7cc12ecb, 0xe4d7caed, 0x82d251d4, 0x9ccd75cd, 0x15aa1664, 0x8cace990, +0xaddbd49e, 0xe0907361, 0x933ffe3c, 0x25308482, 0x59307445, 0x0031ed66, 0x52b1dd07, 0x59019923, 0x2bb94b06, 0x9b57d6af, 0xaa4855ba, 0x0ddd4a64, 0xd411c682, 0x9a5a30b0, 0x583d925a, 0x75e9d71c, 0x492b1e6d, 0x0b81a942, 0x1df7cd2a, 0x1dc6204c, +0xb7bf9890, 0x8a415a98, 0x311f8315, 0xf8f988bd, 0x1cfa2b35, 0x2038e244, 0x3ba2212e, 0x42aab72f, 0x62a3b80d, 0x2de5a820, 0xa1f8119e, 0x1ccbc653, 0x44f65409, 0xff9960e2, 0xc8ebedb7, 0x4e4bf632, 0x65c35052, 0x26640162, 0xe8e2e295, 0xd27cc8c2, +0x5e509c1a, 0x54dcd347, 0x580c7f3c, 0xefb3e7ac, 0xe25f40ae, 0x6913fc29, 0xf9f46ea2, 0x9c06d396, 0x2ab4ad19, 0xde9d89df, 0xc9d7e6ce, 0xd4202be4, 0xdeac64b9, 0x2104e93d, 0x639fb374, 0xf5152fbf, 0x91ea7494, 0x11168c37, 0x4826f872, 0x7e687e5e, +0x3b93cc48, 0xf37821ff, 0x879c10fc, 0x9d0b3589, 0x0760e85f, 0xe4324eee, 0xc536a7d3, 0x90e7928b, 0x9b663bc9, 0x0a8c4f5d, 0x8c1db9be, 0x4396bc56, 0xc267a2ea, 0xd9cc8ce6, 0xf42924c6, 0x45fbb216, 0xf524c2d9, 0x44c7b96f, 0x81c0f3da, 0x2ce84e3f, +0xe403a388, 0xf418c9a0, 0x6292556b, 0x4e7a1b54, 0x3023886c, 0x101b6a28, 0x364e862c, 0xad28bde5, 0x013c0b79, 0xe9ef048a, 0xb6b27e8f, 0xf275c7e0, 0x2655ec04, 0xd3712edd, 0x7e599338, 0xac255bfa, 0x681e1a36, 0xad195083, 0xa7951fde, 0x48171514, +0xe53fa8f1, 0xc35ba993, 0x00000000, 0x6e42f910, 0xdf906fc0, 0x79397b67, 0x90d67fed, 0x2a85407f, 0xe26eadc8, 0x96bb71ad, 0x8b7d51e1, 0x07510539, 0x3dfec208, 0x1a972575, 0xa7a4f2b8, 0xcf8b05e8, 0x3cc2c971, 0xd51c209d, 0x491af30b, 0x55e0d83e, +0xa698f9c1, 0xbb5ed98d, 0xd9fd6180, 0x87adfd9a, 0x1647890e, 0x79089601, 0x174a6f11, 0xee8fecd5, 0xe352a6b1, 0x8691f6e3, 0xc43b41cc, 0x010de61f, 0xdfa182a6, 0x1b9ac36a, 0xef820aca, 0x367f6b4a, 0x3dcf2f6e, 0x9a6bddd6, 0x64ceb64d, 0xbb6f34eb, +0xc5074ab5, 0x4f77fd4b, 0xb68393e9, 0xba533f92, 0xf9c583c4, 0x066d0e40, 0x6f7ef269, 0xcfbae88e, 0x0bb04424, 0x45ca5f70, 0x8a70b7fe, 0xb1e37bb6, 0xb0df70cf, 0x2769e77d, 0x86a01b85, 0xfe9486fd, 0xaa79b8dc, 0xbd023aab, 0x11276151, 0x2dd44546, +0x4f46102d, 0x16766468, 0x52803061, 0x8b4cbc87, 0x538dd67e, 0xab45b3a5, 0x97b697b2, 0xa6a914a7, 0xa1c9fcf8, 0x6e731476, 0xbc3e31d2, 0x97877ad4, 0xab745ec3, 0xe3634bd7, 0xac14b69c, 0xbd33d7cd, 0xd8f0879f, 0x80cd15c5, 0x429b5a49, 0x72b8d225, +0xb1d296d0, 0x968a9ccb, 0x6922114f, 0x9d3ad8ef, 0x73b5343a, 0x682ff750, 0xd52dcdfb, 0x3012650a, 0x8d105fa1, 0x53bc3b18, 0x5f5d7a05, 0x5e61717c, 0x0abda23b, 0x0deca702, 0xd8c16af9, 0x3aafc731, 0xceb70e91, 0x74d5dc65, 0x64ff5b2b, 0x65f2bd34, +0x7805701e, 0x2cd9a359, 0xf2442a86, 0x9c373ef0, 0x7f659841, 0x80fcf8a3, 0xba62d2f4, 0x1bab2e0c, 0x63ae5e12, 0x312e6e73, 0x2135045b, 0xc36a44f5, 0xf8c865db, 0x20090f22, 0x7384d95c, 0x177b8277, 0x6f4f1f0f, 0x0ce1411d, 0xb0ee9da9, 0xe50e4597, +0xfea56b9b, 0x0cd0ac7b, 0x8c2c54d8, 0x37728d55, 0x3cf32417, 0xc2564f8c, 0x102a874e, 0x2b88a660, 0xb78e75f6, 0xd340c3bb, 0xc9e60ba8, 0x74e43103, 0x43a75130, 0x8d21b2c7, 0xc8da00d1, 0xe8d30ff3, 0xa0f5f781, 0x91db99f2, 0xbc0fdcb4, 0x5f6c9763, +0x7f547527, 0x27580a1b, 0x81f11ebc, 0x54ed3e21, 0xd24d25a4, 0x78349d78, 0x75d83a7a, 0x37436033, 0x72893f43, 0xa0c41ae7, 0x3a9e2a57, 0xf349cc99, 0xc40aacaa, 0x55d13558, 0xeebe01b3, 0xffa88d84, 0xce86e3f7, 0x065ce326, 0x1aa6c813, 0xe9dee9ec, +0xd8d80151, 0xd15381c9, 0x4aaa43d1, 0xba9e3b81, 0x551778dd, 0x4751b35e, 0xb7fc8bf1, 0x2c0549e9, 0xa841b0fd, 0x2c1ed3ca, 0x5c05b8ba, 0x09901abb, 0xb77e512d, 0xa1ca3065, 0x21feb966, 0x6f248aa0, 0x517c92e9, 0x33b872e5, 0xf4440847, 0xba077b7e, +0xb30e213a, 0xc7e7e081, 0xf4dd48b8, 0x7dfb01dc, 0x1bd6d138, 0x96023297, 0x3a33f27d, 0xfd4d5203, 0xc38c0ab5, 0x89a493b8, 0xa1d1aa46, 0x92f0985c, 0x84c623c8, 0xcef520e6, 0x4a33032e, 0xba85a1a2, 0x516708ca, 0xc7fc7aa2, 0x1f247bf3, 0xd523f1de, +0x3751420d, 0xa5389aae, 0x80adc9fc, 0xa8c36a21, 0x74708144, 0x1bcd4b1b, 0xca1c100e, 0x4eda33c6, 0xe26929f0, 0x9bf9c218, 0x6fa6507c, 0x8444f914, 0xb38cfbe6, 0x28ec7901, 0x6fbdca5f, 0x12c4115f, 0xaca88015, 0x58f71271, 0xac2a5ac9, 0x25955352, +0xe602c3c4, 0x04e930e8, 0x9269d8a3, 0x8dd4e3af, 0x7d624123, 0xa5ba4072, 0xa523008d, 0x00000000, 0xf9bff8c8, 0xd1481bea, 0x250c13ad, 0x2517898e, 0xca8550f1, 0xa8d8f002, 0x0d62b070, 0x009940ff, 0xc77ea07e, 0x7990ebe8, 0x04707017, 0x4ec1a9e5, +0xc30ed069, 0x9b6082e7, 0xb7e711d2, 0x9f0b68d3, 0x662dd0e4, 0xac31c0ea, 0x798b71cb, 0x3edac295, 0x7d79db00, 0xbe6c914a, 0x550ce2fe, 0xd85adb8d, 0x9b7b18c4, 0x4a28990d, 0x66364ac7, 0xf4c6d29b, 0x1246cb83, 0xd5a12b02, 0x8d4da350, 0x893dd347, +0xba1ce15d, 0x9f92282c, 0x62df7a2f, 0x16b46148, 0x802f1320, 0x70822b8f, 0xca9ecad2, 0x9619a8b4, 0x92724280, 0x474a297d, 0x16affb6b, 0xdc3131b9, 0xd5386bfd, 0x66b4901b, 0x5c876266, 0x89264964, 0xdca87146, 0xe2f0690f, 0x7de09bff, 0xfdcf88df, +0x2c9c0916, 0x5c1e2299, 0x3ab128a1, 0x701b6b70, 0xd84141ae, 0xce77fa3a, 0xf93d2214, 0xca078a2d, 0xb315bb19, 0x5875c8ad, 0x28f7e322, 0xacb31a36, 0x21e52345, 0xa153709a, 0x287539fe, 0xef89435c, 0xceeebac5, 0x37d398d1, 0x89bf099b, 0xbe770b69, +0xf02fe273, 0x58ec8852, 0x8dcf798c, 0xeb7be997, 0x4e437339, 0x746b1b67, 0xbef5d1b5, 0x2c879335, 0x4ab1d9f2, 0xebf9334b, 0xe272b3d3, 0x47c8f3a1, 0xdcb3eb65, 0xef0b9980, 0xc3979096, 0x2167f999, 0x9be2583b, 0x9680e84b, 0x74f25b98, 0xdc2aab9a, +0xa148eab9, 0x558e3822, 0x0de06aac, 0x333aa839, 0xb39761c5, 0xfd56c820, 0xe2ebf32c, 0xb765cb0e, 0x7099b1ac, 0x1636bb94, 0x001b9a23, 0x7909ab17, 0xef92d97f, 0x8d563973, 0x80b653df, 0x47d36982, 0xe61959e7, 0xf0b6a28c, 0xf0ad38af, 0x66af0a38, +0xbeee4b96, 0x125d51a0, 0x80348903, 0x1fbd3b0c, 0x0d792a53, 0x51e5d216, 0x286ea3dd, 0x37c802f2, 0x3aaab282, 0xf45f9264, 0x845f6337, 0x3e43826a, 0xa85a2ade, 0x1f3fe1d0, 0xe69b833b, 0xebe2a968, 0x6bcdba48, 0x098b8098, 0x3e581849, 0x0912c067, +0x4321c349, 0x43a31995, 0xa5a1da51, 0x6b4f6094, 0x3a28685e, 0x162d21b7, 0xd1d15b15, 0x12df8b7c, 0x9f89b20f, 0xce6c6019, 0xef1003a3, 0x046bea34, 0xc7653a5d, 0x09095a44, 0x9f10f2f0, 0xf0347850, 0x3321321a, 0x7000f153, 0x62c4e00c, 0xd1cac136, +0x6b54fab7, 0x62463ad0, 0x586e528e, 0x43b883b6, 0x625da0f3, 0xe6801918, 0x5595a201, 0x33a3e8c6, 0x4e58e91a, 0x1b4f91c7, 0xd8c39b72, 0xf926b837, 0x74e9c1bb, 0x92eb027f, 0x258ec971, 0x84ddb9eb, 0x0082dadc, 0x3ec158b6, 0xf9a462eb, 0xd5bab121, +0x374ad82e, 0xeb6073b4, 0x5c9cf845, 0x6f3f1083, 0xfdd412fc, 0xc3154a4a, 0x217c63ba, 0x969b7268, 0x79123134, 0x04f2aacb, 0x6bd6206b, 0x0dfbf08f, 0x1b540be4, 0x1fa6a12f, 0x433a596a, 0x51fe4835, 0xb7aad39f, 0x8d768afc, 0x288ba0cd, 0xd05c8ba9, +0x4eb15e71, 0x25e32d3a, 0xeae6b787, 0xc26d174a, 0x3b55a4bd, 0xe6429cfa, 0x80786246, 0xdcdb9ecd, 0xa5fd2a31, 0x363d294a, 0x746d0712, 0x28a89ed4, 0xf8b14e29, 0x75c7c4d5, 0x5d093f4c, 0x0066654d, 0x9eceebc1, 0xf938b3f7, 0x1ef3d2d3, 0xa59b4f7c, +0x6b52734b, 0xea80d2ca, 0xf8d72b64, 0x1e95b79e, 0x4f7df8fb, 0xc3c7d48d, 0xbaa43b25, 0x0d0ee8ba, 0xeac5899e, 0xd1f6486e, 0x37d2b1d9, 0x8d10efb1, 0x5007d7f6, 0xe607c7ae, 0x5ca3fc8b, 0xc3828fd9, 0xf5fafdc7, 0xe624f9b7, 0x6b341606, 0x00000000, +0x51ad1431, 0x37f18fc0, 0xdc9ec599, 0x1ed0ecca, 0x37b4d494, 0xf95ed6ba, 0x1eb68987, 0x5c80c292, 0xe78e3a70, 0x12319ce3, 0xa5de1428, 0xa4318cbb, 0x0ca42b7d, 0x25c01323, 0x1f3f7459, 0xbb2dc6fb, 0x67903d7b, 0x00455b54, 0x2449eefd, 0xc3e4ea94, +0x25854877, 0xa97a3f55, 0xf8f4157d, 0x13b8613d, 0x9e8bb095, 0xdd34065e, 0x67d5662f, 0x01cca68a, 0x6619c0a5, 0xb6667515, 0xd07fb5b0, 0x28edc580, 0x805b5c5f, 0x1f591114, 0x0c871564, 0xa91c5a18, 0x8d55b4e5, 0xa474d7ef, 0xc20b7207, 0x518e2a28, +0xd03aeee4, 0xd1b3133a, 0x8cff7722, 0x0d688df7, 0x4ed73b3c, 0xa8d0fc92, 0x81f19f98, 0x29470647, 0x81d2a181, 0xa412b2a2, 0x43bfb6cb, 0x740b625f, 0x5ce6a7df, 0xb7ef88cb, 0xb789ed86, 0x242f8bb0, 0x922f9be8, 0xba87053c, 0xcf63fff0, 0xceaf597a, +0x13de0470, 0xf5bfa693, 0x5d6f5a01, 0xeaa3ecd3, 0xdcf8a0d4, 0xe7ad0469, 0xdd715d0a, 0x75a1a198, 0x1f7a2f0d, 0x1212a2fa, 0x1257f9ae, 0x42502e58, 0x43faed9f, 0x51cb717c, 0x78c92c6f, 0x01ef9893, 0x4215750c, 0xf4365b4d, 0xeb6f4a59, 0x67b30362, +0xce8c6763, 0xdd173847, 0x667fa5e8, 0x78ea1276, 0x139b5f24, 0xc3a1b1c0, 0x93c0037b, 0xa457e9f6, 0x4f5ec6e2, 0x01aac3c7, 0x93e33d62, 0x240cb5a9, 0x3b33c1f0, 0x9f642806, 0x93a66636, 0x3678721e, 0x4e926068, 0x926ac0bc, 0xd1902d23, 0xdcbdfb80, +0xa959014c, 0x13fd3a69, 0xdd526313, 0xbac25e68, 0x5024e9ef, 0x43d9d386, 0x7940d1b1, 0x0d4bb3ee, 0xe7cb6124, 0xe7e85f3d, 0x3a990237, 0x0ce17029, 0xcf40c1e9, 0xceea022e, 0x803d3912, 0x9f024d4b, 0xbb0ef8e2, 0xf4503e00, 0x246ad0e4, 0x50428ca2, +0xd019d0fd, 0xa5b87165, 0xbae16071, 0xb6454b0c, 0x9ea88e8c, 0xcec93c37, 0x5d2a0155, 0xa8b699df, 0x1f1c4a40, 0xe661a2e3, 0x8cba2c76, 0x6b714d52, 0x7926b4fc, 0xc2284c1e, 0xb6232e41, 0x78af4922, 0x920ca5f1, 0xf97de8a3, 0x2964385e, 0x361e1753, +0xf4730019, 0x3b769aa4, 0xbb4ba3b6, 0x9eedd5d8, 0x9249fea5, 0xa93f6401, 0x7963efa8, 0xb7ccb6d2, 0x4f38a3af, 0x67f65836, 0xc24e2953, 0x6b17281f, 0xf4156554, 0x42364b15, 0x3aba3c2e, 0xa8f3c28b, 0xf5d9c3de, 0x51e84f65, 0x788c773b, 0xbb689daf, +0x439c88d2, 0x801e070b, 0x0189fdde, 0x5061b2bb, 0xf59c988a, 0xcf059abd, 0xeb4c7440, 0xa895a7c6, 0x9f47161f, 0x2921630a, 0xeb092f14, 0x4ef40525, 0x1274c7b7, 0xf8927030, 0x3adc5963, 0x28cefb99, 0xb6001058, 0xf91b8dee, 0x75e4facc, 0x8197fad5, +0x74285c46, 0x6adb8e95, 0x9385582f, 0x3b10ffe9, 0x75829f81, 0x663afebc, 0xcf26a4a4, 0x25a6766e, 0x0cc24e30, 0xeb2a110d, 0x665c9bf1, 0x4f1b9db6, 0x0d2dd6a3, 0x3797ea8d, 0x29025d13, 0x365b4c07, 0x8d33d1a8, 0x79058ae5, 0x81b4c4cc, 0x42731041, +0x6a9ed5c1, 0x5d4c6418, 0xd1d57677, 0x00233e19, 0x8cdc493b, 0x5cc599c6, 0x744e390b, 0x3aff677a, 0x9f217352, 0x6af8b08c, 0x8c99126f, 0x6abdebd8, 0xb68b5e52, 0x2609e58a, 0xcba736a1, 0xa8a74d72, 0x12d97488, 0x3825f6aa, 0x5a135f6c, 0x12885506, +0x6fa43df5, 0x8fc95b63, 0x94bd795b, 0x6bcadef8, 0x9d102feb, 0xa06de859, 0x0051218e, 0xa535d941, 0x3d2ce63c, 0x5b258d79, 0x2ff592b4, 0xf2b4121e, 0xe8f6e233, 0x13efa69d, 0x2afc8222, 0x046ee30d, 0x90d39a56, 0xc7037087, 0x7c4b9b68, 0x6ec3ce6e, +0x6ff51c7b, 0x57d0ead1, 0xa564f8cf, 0x9082bbd8, 0xa15b3a4c, 0x273f379f, 0xf7ec2306, 0x62678848, 0x17814590, 0x49add87f, 0x16b79785, 0xedfff2a5, 0x34d09102, 0x98481ef3, 0xff26862d, 0xec98013e, 0x91e54843, 0x78257865, 0x09ad56b0, 0x1e7d32ae, +0xe535578e, 0x1f1ac135, 0xe99111a8, 0x4d921afc, 0x00000000, 0x8f987aed, 0xb7ecadc9, 0xe452a415, 0x3c4b15a7, 0xfb1944ae, 0xdd10a124, 0x16e6b60b, 0x3874d724, 0x836d1d45, 0x3481b08c, 0xadff7c6a, 0xc635a292, 0xd848903c, 0x5e2c9def, 0x489b0a6a, +0x91b469cd, 0x22670687, 0x2ec340a1, 0xf3d3e185, 0x2b9b71b9, 0x94ec58d5, 0xc36d938a, 0xf2e53390, 0x276e1611, 0x0dc3b5bd, 0xc33cb204, 0xcf98f422, 0xe8a7c3bd, 0x8703fe48, 0xd4bdf794, 0x7913aa70, 0xcac0c53a, 0x05091096, 0x56e638c4, 0x53ef2852, +0xc664831c, 0x958bab4e, 0x446e6dc2, 0x9c26fdfe, 0xceae2637, 0x52d9fa47, 0x75b7ec56, 0xe15bb483, 0xdc267331, 0xceff07b9, 0x2e92612f, 0x8ac04bf5, 0x089b84a5, 0xf68bd09d, 0x22362709, 0x833c3ccb, 0xac988ff1, 0xb6da7fdc, 0xd0823517, 0x2fa4b33a, +0x74d01fcd, 0x6236a9c6, 0x95da8ac0, 0xbe41fb79, 0x9d410e65, 0xb3824ec4, 0x86640dd3, 0x820aeede, 0x30ef5381, 0x3d7dc7b2, 0x13be8713, 0x53be09dc, 0xe03c4718, 0x2658c404, 0x4cf5e967, 0x71d90f5b, 0xba2f1874, 0xfa7eb735, 0x676e98de, 0x0cf567a8, +0xadae5de4, 0xe403859b, 0x17d0641e, 0x4ca4c8e9, 0x1a13d1a3, 0xc20a6011, 0x71882ed5, 0x1b742238, 0x41677d54, 0x8752dfc6, 0x4558bfd7, 0x7c1abae6, 0xbb19ca61, 0xd97e4229, 0x39420531, 0x1f4be0bb, 0x75e6cdd8, 0xa9919f67, 0x86352c5d, 0x043fc283, +0xd819b1b2, 0x4051af41, 0x30be720f, 0x997ecce6, 0xd0d31499, 0xb7bd8c47, 0x5b74acf7, 0xc25b419f, 0xa9c0bee9, 0xdd4180aa, 0x56b7194a, 0xa4522ada, 0x0d929433, 0xedaed32b, 0x825bcf50, 0xecc920b0, 0x0136d215, 0x8a916a7b, 0x6e92efe0, 0xd5da040f, +0x45099e59, 0xfb486520, 0x63515a5d, 0x1b2503b6, 0x2bca5037, 0xa10a1bc2, 0x673fb950, 0x1a42f02d, 0x787459eb, 0x63007bd3, 0x40008ecf, 0x2351d492, 0xb3d36f4a, 0xca91e4b4, 0x7d2c68f3, 0xf6daf113, 0x3c1a3429, 0xd1e5c68c, 0x05583118, 0x98193f7d, +0xe10a950d, 0x4dc33b72, 0xbf2608e2, 0x7d7d497d, 0xbf77296c, 0x6aad2d63, 0xfe4175b6, 0xcbf6172f, 0xa03cc9d7, 0x35e64317, 0xcfc9d5ac, 0x08caa52b, 0x992fed68, 0x6b9bff76, 0x0ca44626, 0x5a427ee2, 0xd92f63a7, 0x9c77dc70, 0xbb48ebef, 0x79428bfe, +0x8bf699e0, 0x3188a01a, 0x8eff8976, 0xb2b49cd1, 0xe06d6696, 0x41365cda, 0xba7e39fa, 0x8eaea8f8, 0x443f4c4c, 0xa8f66cfc, 0xe9c03026, 0x48ca2be4, 0xe5647600, 0xfa2f96bb, 0xff77a7a3, 0x5f4b6e74, 0xbe10daf7, 0x09fc773e, 0x49fcf9f1, 0xc7525109, +0x5f1a4ffa, 0x31d98194, 0x66096b45, 0xfe105438, 0x6afc0ced, 0x5e7dbc61, 0x5781cb5f, 0xd4ecd61a, 0x1e2c1320, 0xd58b2581, 0x70befcc0, 0x5288dbc9, 0xb2e5bd5f, 0x66584acb, 0x74813e43, 0xdc7752bf, 0x35b76299, 0xa4030b54, 0x0167f39b, 0x70efdd4e, +0x8ba7b86e, 0xd1b4e702, 0x391324bf, 0xf7bd0288, 0xf382c00b, 0x2aada3ac, 0x2300f51c, 0xacc9ae7f, 0x34490269, 0xb25124f8, 0xc6bf974f, 0x8970e5c4, 0xcdde27cc, 0xfae09e59, 0x7cf8b8c8, 0xdabc892d, 0x68edadd5, 0x08160b7f, 0x67856e80, 0x4049c591, +0x178cdaae, 0x6ce4de03, 0x8581e922, 0xc1c15f65, 0x64f2d57c, 0xeef58b44, 0x5b3413d9, 0xda52fd62, 0x8e0e2dee, 0xad258166, 0x47d979f4, 0xa2a3367c, 0xd244f61d, 0xd64d85cb, 0x781fbf51, 0x70e7c061, 0xf97951ea, 0xe19d4811, 0xba472f87, 0x5843a825, +0xe6e3803b, 0x304071bf, 0xeafcf892, 0x136bdd37, 0x7c16cc87, 0xb930947b, 0xbea0281e, 0x0790bc65, 0x60fba6aa, 0x676b1acf, 0xe98b436e, 0xc2b6e499, 0x33d9be0c, 0x2c436fdd, 0x0f86b71a, 0x9e124b25, 0xbdd793e2, 0x2b3da7f7, 0xed8230b8, 0x284a1c0b, +0xf5885d0c, 0x9af54cbc, 0x86182691, 0xc9392055, 0xe20487a2, 0x9194fc3f, 0xd9cb32d1, 0xe2eaf3ed, 0x23c5d8c7, 0xea128cdd, 0x04e70799, 0x180a6db4, 0xd1dd39ae, 0x6015d2e5, 0xcd305383, 0x917a8870, 0x00000000, 0xbe4e5c51, 0xfd9e5673, 0x2722df5e, +0xd1334de1, 0x9a1b38f3, 0x4f2106c4, 0x18e419fb, 0x43d00a22, 0x7f8f0334, 0x82115547, 0x24bb10ed, 0x38567ac0, 0xfee9ed8f, 0x5bda6796, 0x3cb17d59, 0xee1bff0b, 0x0399cfb3, 0xc5c82cb3, 0x82ff2108, 0x5f3d600f, 0x8d799612, 0x08f87f30, 0x7400c7f8, +0x28a46844, 0x38b80e8f, 0xa5ddfe56, 0x96ea3415, 0x27ccab11, 0x54b2a4c3, 0xadcbf529, 0x3fc6c6a5, 0x3bcfb573, 0xa1d48d80, 0x14fb6152, 0x4fcf728b, 0x0377bbfc, 0x9604405a, 0x77777c04, 0x205c1774, 0x0b8fc4cc, 0x9573fba6, 0xaab53d03, 0xde5b8eb4, +0x0b61b083, 0xd53a3e37, 0x8ae92a77, 0x40a7b1de, 0x8a075e38, 0x9efc3f6a, 0x7f61777b, 0x572b6b70, 0xd6a3f184, 0x63626919, 0x4cb8c977, 0x996c830f, 0xe9653721, 0x1385a978, 0xdd2c3548, 0x7799084b, 0x44aec208, 0xae523a9a, 0x245564a2, 0xb9dee034, +0xa9c286ff, 0x5c4adbf3, 0xf6ffe6f0, 0x6b9a1629, 0x2cad1b92, 0x53cc6ce9, 0xb52fecd2, 0x86f652de, 0x1415151d, 0xc9d7541a, 0x6c0aaa4c, 0x0f68c355, 0x856f9d6d, 0x78f1cb1e, 0xdeb5fafb, 0x4b287512, 0xc651e300, 0xe60df474, 0x737e0fd2, 0x232bac88, +0xb2bf50b7, 0x30ae05f0, 0x485fceee, 0x37d0cdda, 0x4bc6015d, 0xc12f2b2a, 0xb6b62361, 0xf16f5a95, 0xf1812eda, 0x3b21c13c, 0x48b1baa1, 0x9982f740, 0xb5c1989d, 0x8d97e25d, 0xcaa0efe6, 0x959d8fe9, 0x34a77626, 0x9d8b8496, 0x101c66cb, 0xf5662943, +0x0cf10ce6, 0xb1c8eb4b, 0xd5d44a78, 0x1b7dd648, 0x73907b9d, 0x6f9365ff, 0xfe0799c0, 0x57c51f3f, 0xcea99c30, 0x74eeb3b7, 0xc52658fc, 0x532218a6, 0x7b8670e2, 0x4440b647, 0x1ced6a2d, 0xa24d4233, 0xddc24107, 0x1f9ad1d1, 0xe1733c5e, 0xce47e87f, +0xe5943bc7, 0xca4e9ba9, 0xa64431e5, 0xb1269f04, 0x6f7d11b0, 0xa13af9cf, 0x81889af4, 0x7009b42e, 0x0c1f78a9, 0x8ee059a1, 0x641ca133, 0x5055a35a, 0x433e7e6d, 0x4c56bd38, 0xaebc4ed5, 0x5ca4afbc, 0x373eb995, 0x5fd31440, 0x545cd08c, 0xa92cf2b0, +0x2bd3d3b8, 0x077ec82a, 0xfd70223c, 0x1c031e62, 0x1f74a59e, 0x47370dbb, 0x1762aee1, 0xf2f69526, 0x3f28b2ea, 0xe57a4f88, 0x58addc6a, 0x040973d6, 0xd2aa8252, 0x6b746266, 0x1b93a207, 0x92e347c3, 0xf61192bf, 0x7b6804ad, 0x10f21284, 0xa6aa45aa, +0xa5338a19, 0x20b2633b, 0x899e918b, 0xf218e169, 0xb658572e, 0x920d338c, 0x638c1d56, 0x8166eebb, 0xf99725a5, 0xfa0eea16, 0x3337ca43, 0xbaa95bc8, 0xd925469e, 0x2f34d421, 0x9d65f0d9, 0x2fdaa06e, 0x50bbd715, 0xed6c44f7, 0xc25890d6, 0xaa5b494c, +0x3c5f0916, 0x00ee744f, 0x6803d99a, 0xbd39e7ad, 0xe0a1935c, 0x711edd51, 0x2860ceaf, 0x7afd5065, 0x378dfed2, 0xa2590227, 0x3e090952, 0x65106018, 0xfb2711d9, 0x3938152e, 0xd8a45242, 0xadd13deb, 0xaae02197, 0x6ef3ed2c, 0x175413cd, 0x258f8bd7, +0xf592fa25, 0x295d1a9f, 0x885eb63c, 0x8a39cc88, 0x3c6e73e6, 0xe3fb3dd8, 0xff4ca321, 0x4b7c66fb, 0x41a23fff, 0x67771aac, 0x848c2774, 0x79a7fee1, 0xd72c6d8e, 0x86eb5dc0, 0x9d6ddf45, 0xa9ba8f13, 0x7712151d, 0x617bd2e0, 0x27e8f163, 0xd54b173a, +0xa103aca3, 0x055666c8, 0xbc89e66a, 0xa455ca6b, 0x046bb2f8, 0x1d8a4ac9, 0x75756fa9, 0x70230961, 0xa8875b23, 0xed4ed624, 0x2d36a867, 0x97b38641, 0xf9406b6d, 0x6a985fd4, 0xd27a0b46, 0x19e1f831, 0x529d9eca, 0x4826c87f, 0x46932383, 0x9b611709, +0xd120a5c2, 0xdac328f6, 0x51c7304e, 0x45c98d07, 0x762fc12d, 0xbfd348ee, 0x3f34dd62, 0xfc160da5, 0xb50d11ea, 0xcecd95bf, 0x7cf19829, 0xfe717711, 0xeb421e68, 0x491b1c4f, 0x00000000, 0x2a07b41b, 0x1abb56b5, 0x34d75056, 0xf7f58091, 0x10650fb1, +0xafb6475f, 0xb166a312, 0xc145aa73, 0x44f45937, 0x7e96e29d, 0x0eb5ebfc, 0x789a2ad1, 0x983bb98d, 0x93d834b9, 0x24b25fe7, 0x013dd430, 0xf87dbf5d, 0x26d52553, 0x1158db81, 0x08b923b0, 0x8c3504c4, 0x6da943a8, 0xcb9bf377, 0xe19c476c, 0xf39e3269, +0xc0787e43, 0x7dcc4c19, 0xc21f04f7, 0x5d15a106, 0x642db428, 0x91bf4e0d, 0x80e7958c, 0x90829a3d, 0x62217c64, 0xc749623f, 0x7379a7e5, 0x409febcf, 0x4e2a0033, 0xd476c30a, 0x55ac82b6, 0x33e64c2a, 0x8963620c, 0xb23c0d96, 0xdea89a0e, 0x0ade5904, +0xcff0418f, 0xa5681e5b, 0x02677ab4, 0x664ace9c, 0xe2c6e9e8, 0x631ca854, 0xf2a3e659, 0x8d08d0f4, 0xa70f64ef, 0xe92564dc, 0x8f6faa40, 0xea7fca58, 0x3a62bbaa, 0x2f51d2d3, 0x4f17d403, 0x3805c11e, 0x35ea8466, 0xabddf5a7, 0x3d53a7d6, 0x7bc08455, +0xf4af2e15, 0xd9998672, 0x1cb79ef9, 0xd347df76, 0xae8b936f, 0x2383439b, 0xef29ac90, 0xc322d0c7, 0x5f72dbb2, 0xe7908f20, 0x21e4392f, 0xcaa62747, 0x9f0aa5f1, 0xb430c5da, 0x6ba58be4, 0xacece9db, 0x94e928c5, 0xd01d71f2, 0xf1f948dd, 0x5e4f0f82, +0x0cd29148, 0x30bce2ae, 0x6c949798, 0xe5f7f594, 0x1fed307d, 0xe818b0ec, 0xbbb8fa16, 0x0be38d34, 0xb05b7722, 0xb8e25492, 0x7fab36ad, 0x07311c7c, 0x12027505, 0xcd973b3b, 0xa364d617, 0x15336979, 0x81da41bc, 0xccaaef0b, 0xdbfefcc6, 0x8280ef38, +0x133fa135, 0x2e6c06e3, 0x140ebd49, 0x56f62c32, 0x18dc2c01, 0x5843c7ce, 0x4d70aeb7, 0x9a5cc339, 0xc9fc89c3, 0x68ff2560, 0xb9df80a2, 0xc413ccbb, 0x22be97ab, 0xc674b60f, 0x2c0b7c57, 0xba852e26, 0x95d4fcf5, 0x0984f780, 0x54915686, 0x3b5f6f9a, +0x57cbf802, 0xec730214, 0xddf2348a, 0x1b868285, 0x035aae84, 0x2b3a602b, 0x50fae47e, 0x7448bb99, 0xb301d9a6, 0xf0c49ced, 0x4a41b2cb, 0x69c2f150, 0xd611b9be, 0xb657bf6e, 0x5b19694a, 0x83bd3b08, 0x604606d0, 0x42f8917b, 0x92e5e089, 0x8e527e70, +0x9c500b75, 0xc8c15df3, 0x3181369e, 0xb76a6b5e, 0x0def4578, 0xfd2bd995, 0xf6c854a1, 0xdf954e3e, 0x47aef7b3, 0x36b02ae2, 0x0f883fcc, 0x20d9ed1f, 0x99066dbd, 0x1ed0e44d, 0xbeee9cde, 0x32db981a, 0xfa1ac5e9, 0x43c5454b, 0xe6ad5b10, 0x4c4d7a87, +0x060cc84c, 0xdccfe0ba, 0x87d689f0, 0xbdb4325a, 0xa632b0df, 0x5c287536, 0x1669c7fd, 0xee1478a0, 0x9e3771c1, 0x6fce391c, 0x5a24bd7a, 0xe4ca21a4, 0x968e5271, 0xc52e188b, 0xa03e7893, 0x724473d5, 0x53a04afa, 0x597e13fe, 0x85b1f344, 0x8b0418b8, +0x8fab38d6, 0xabf03019, 0x08ca8d53, 0xec1f65f8, 0xc55c1beb, 0xc936ea93, 0x5144866e, 0x4f25d8b2, 0x4791983d, 0x7561437d, 0x4e575f16, 0x71bff28a, 0x98726cfd, 0x6fdeac56, 0x20fb74e4, 0xfaca7bab, 0x1307e5dc, 0x6eac2bf2, 0x424363b2, 0x6b7ed07d, +0x1e615edc, 0x3b361c6b, 0xf6a08ad3, 0xff664df8, 0xb13112ee, 0x7807f87d, 0x7ca78456, 0xe5a76f0f, 0xf7acc0ab, 0xe4d5e8ab, 0xd62533eb, 0x9900eb59, 0xfbb8fc0f, 0x120bafa4, 0x54e8b03d, 0x423dae6e, 0x6a729a05, 0xfbc631d3, 0xc4505193, 0xa2483aee, +0xaa82b7bd, 0xcd9696b8, 0xbd5be396, 0xb5efa319, 0x676aecd9, 0x3b48d1b7, 0xd2854fc0, 0x8a070e85, 0xc0f02db8, 0x010c4a78, 0xaafc7a61, 0x0d1876dc, 0x3e9a2a38, 0x9cacdd0a, 0x00000000, 0xe9cd9e77, 0xe5d9a2d3, 0xf200f6f8, 0x7413c4d9, 0x09c6c72b, +0x25298f6b, 0x3ee4e7e4, 0xd757b44f, 0x1bb3a553, 0x66186b7d, 0x0c6af178, 0x4b85a499, 0x70cd752e, 0xbd252e4a, 0x58fc8c99, 0x4af7233d, 0xd7297993, 0xde917364, 0xf6de470f, 0x2831f9b7, 0xdfe3f4c0, 0x46e31f99, 0x2cef4840, 0xda4fc293, 0x5c5cf0b2, +0x82b34e0a, 0x2425c513, 0x6ed2e62e, 0x2085b938, 0x372220cf, 0x3a449bcf, 0xb9fb9fbd, 0x0d66bb00, 0xfe14ca5c, 0x8ed9bf72, 0xd3f7c864, 0xe9b353ab, 0x4e2992ca, 0x91ca660a, 0x82cd83d6, 0x94665059, 0x255742b7, 0x7cd9498a, 0x4bfb6945, 0x1abfef2b, +0x4f5b156e, 0x83c1c9ae, 0xc948274f, 0xcde85b64, 0x21f73e9c, 0x8b758921, 0x08b4408f, 0x90b8e1ae, 0x71c13f56, 0x59f0c6e1, 0x787935a1, 0x8a79c359, 0x16d51e53, 0x2de30238, 0xb8891819, 0x05ac3653, 0x67142105, 0xa236f732, 0x1e1f9300, 0xda310f4f, +0x375ced13, 0x751f8ea1, 0xa79ac161, 0x746d0905, 0x1f6d14a4, 0xf27e3b24, 0x62c6da8a, 0x3f966040, 0x5c223d6e, 0xaf2e81ee, 0xa6968b19, 0x04deb1f7, 0xed6de25c, 0x362e6ab7, 0x007ecddc, 0xe8c1d40f, 0x503601ca, 0x29437e13, 0xf372715c, 0xb8f7d5c5, +0x79757fd9, 0x956a1a21, 0xcce4111c, 0xdeefbeb8, 0x8ea772ae, 0xa3447096, 0xd65bfe37, 0x05d2fb8f, 0x866dfffd, 0x1bcd688f, 0xe8bf19d3, 0x5d50baca, 0xf30cbc80, 0x70b3b8f2, 0xb9855261, 0xa6e846c5, 0xaf504c32, 0x598e0b3d, 0x9da09772, 0x7dabce2e, +0xb5916ec5, 0x55e4fa45, 0xc42e9c4f, 0x63b45d2e, 0xe0759480, 0xb4e3e961, 0xae22cb96, 0xe4ab2577, 0xbc296432, 0xae5c064a, 0xc8446d37, 0x91b4abd6, 0x871f7859, 0x980ca121, 0xb043954a, 0xcc9adcc0, 0xc522d637, 0x790bb205, 0x12756278, 0x245b08cf, +0x8761b585, 0x559a3799, 0x9dde5aae, 0x2189f340, 0x9514d7fd, 0x2d9dcfe4, 0xec61a824, 0x17a799f7, 0x6fa0618a, 0x1f13d978, 0x09b80af7, 0x997e2685, 0x9cd210d6, 0x17d9542b, 0xf7d20d77, 0x4331e416, 0xb49d24bd, 0x513a4bb2, 0x62b81756, 0x13792800, +0x6a0c57d9, 0x5d2e7716, 0x83bf0472, 0xed132f80, 0x54967de1, 0xbc57a9ee, 0x469dd245, 0x16abd38f, 0xdf9d391c, 0xab8efdc5, 0xd2fb821c, 0x284f346b, 0xfab4b677, 0x47ef55e1, 0x3fe8ad9c, 0x6b001da1, 0x58824145, 0x94189d85, 0x6666a6a1, 0x33825ce4, +0x32f0db40, 0x5048cc16, 0x328e169c, 0xa7e40cbd, 0x3a3a5613, 0x7dd503f2, 0xc182aa1c, 0xff188024, 0x293db3cf, 0x04a07c2b, 0xc83aa0eb, 0xb03d5896, 0x017287a4, 0x1ac122f7, 0xdb4388eb, 0xfe6a0780, 0x434f29ca, 0x0c143ca4, 0xa33abd4a, 0x2c91859c, +0xe00b595c, 0xd38905b8, 0x33fc9138, 0xb14fdf32, 0x3650a76b, 0xdb3d4537, 0x8b0b44fd, 0xc1fc67c0, 0xe1071324, 0x63ca90f2, 0x4a89eee1, 0x8fd5f50a, 0xe179def8, 0x90c62c72, 0xc08ee064, 0x86133221, ] + +d0x6a0d3e80=[ 0xb3, 0x76, 0xd4, 0x73, 0x77, 0x7a, 0x01, 0x52, 0xf9, 0xd6, 0x1d, 0xb4, 0xb8, 0x1a, 0x3d, 0x3e, 0x4f, 0xcc, 0xac, 0x9a, 0x54, 0x80, 0x08, 0x57, 0x1f, 0x7b, 0x9d, 0x63, 0xfa, 0xf5, 0x8f, 0x0a, 0x37, 0xa0, 0xee, 0xe5, 0x7f, 0x9c, 0x82, 0x14, +0xaf, 0x5f, 0x6e, 0xa5, 0x8b, 0xd2, 0x83, 0x3f, 0x53, 0xae, 0x44, 0x68, 0x2a, 0x86, 0x4a, 0xe0, 0x0b, 0xc8, 0xa2, 0xa6, 0x30, 0x95, 0x25, 0x38, 0x32, 0x07, 0x18, 0xc4, 0xc1, 0xb0, 0x48, 0xb9, 0x49, 0xd7, 0xd9, 0xea, 0x17, 0x46, 0x9b, 0x36, +0xf6, 0x13, 0x71, 0x93, 0x88, 0xa1, 0x23, 0xc2, 0xe7, 0x9f, 0x16, 0x74, 0xaa, 0xd5, 0xb6, 0x72, 0x65, 0xb2, 0x26, 0x78, 0xfc, 0xc5, 0x2c, 0x64, 0xa9, 0x92, 0xd3, 0xcd, 0xcb, 0xb5, 0x29, 0x96, 0x98, 0xf1, 0xa3, 0xe8, 0xb1, 0xf4, 0x51, 0xad, +0x3c, 0xbd, 0x00, 0x5b, 0xdc, 0x55, 0xab, 0x8a, 0x58, 0x6f, 0xf8, 0x7c, 0x6c, 0xf0, 0x7e, 0x19, 0xc7, 0xe9, 0xba, 0xed, 0x62, 0xd8, 0x43, 0xe2, 0x28, 0x0d, 0x59, 0x39, 0x04, 0xca, 0x90, 0x0f, 0x99, 0x47, 0xeb, 0x6b, 0x89, 0x27, 0x5a, 0x84, +0x4b, 0x3b, 0x06, 0xef, 0x42, 0x56, 0xa7, 0x40, 0xf2, 0x33, 0x45, 0x7d, 0xff, 0x24, 0xf3, 0x9e, 0x60, 0x97, 0xde, 0x11, 0xc9, 0x2f, 0x5c, 0xda, 0x50, 0xe1, 0x4e, 0x0e, 0xe4, 0x91, 0x79, 0x2d, 0x05, 0x6a, 0x3a, 0x12, 0xc0, 0xdf, 0xcf, 0x85, +0xbe, 0x09, 0x22, 0x61, 0xbc, 0x31, 0x75, 0x5e, 0x2b, 0x21, 0xdd, 0x6d, 0x15, 0x35, 0x41, 0x87, 0x8d, 0xfe, 0x1b, 0xbf, 0x8e, 0x5d, 0xa8, 0x03, 0x34, 0xec, 0x0c, 0x02, 0xf7, 0x67, 0xc6, 0x66, 0x20, 0x70, 0x1e, 0x8c, 0xfd, 0x10, 0xd1, 0xd0, +0x94, 0xe3, 0xbb, 0x2e, 0x81, 0x4d, 0xce, 0x1c, 0xc3, 0xdb, 0xb7, 0xfb, 0x69, 0xe6, 0x4c, 0xa4, 0xf9, 0xfd, 0xab, 0x84, 0x16, 0x5b, 0xee, 0xaf, 0xf1, 0x1e, 0x2a, 0x15, 0x49, 0x38, 0x60, 0x9c, 0x8b, 0x07, 0x96, 0xf0, 0xd5, 0x74, 0x9f, 0xea, +0xbb, 0xcc, 0x6a, 0x42, 0xb1, 0xd2, 0x93, 0x9b, 0xa7, 0xd3, 0x7f, 0x6c, 0x31, 0x7d, 0x55, 0xe2, 0x32, 0xae, 0x87, 0x01, 0xfc, 0x12, 0xfb, 0x89, 0x85, 0x28, 0x58, 0xd1, 0x18, 0x44, 0xa5, 0x86, 0x0a, 0x2e, 0x41, 0xa1, 0x92, 0x6f, 0xc5, 0x62, +0xb0, 0xf5, 0x06, 0xf7, 0x0d, 0xe9, 0xe1, 0xf8, 0xdc, 0x8a, 0xc3, 0xb9, 0xb2, 0x1b, 0x17, 0xd4, 0xd6, 0xe7, 0x37, 0x94, 0x21, 0x4e, 0x4c, 0xd9, 0x51, 0x05, 0x34, 0x8e, 0xf6, 0xb4, 0x6e, 0x7c, 0x61, 0xe6, 0x4f, 0xb5, 0xad, 0x4b, 0xc4, 0xa3, +0x36, 0x75, 0x6b, 0x73, 0xc7, 0xfa, 0x54, 0x43, 0xda, 0x1f, 0xc1, 0xed, 0x69, 0xf4, 0xcf, 0x95, 0x46, 0x50, 0xb8, 0x9e, 0x53, 0x72, 0x5d, 0x0c, 0xc0, 0x00, 0x14, 0x80, 0xd0, 0xdf, 0x3d, 0x81, 0x13, 0x4d, 0x52, 0xb7, 0x91, 0xde, 0xf2, 0xc8, +0xbf, 0x7e, 0x83, 0x03, 0x63, 0x66, 0x2c, 0x10, 0x0f, 0x8d, 0x68, 0xa2, 0x78, 0xbe, 0x59, 0xc9, 0x99, 0x4a, 0x76, 0x77, 0xca, 0x3f, 0xac, 0x65, 0xef, 0xe3, 0x97, 0x25, 0x09, 0xe0, 0x79, 0x5c, 0x64, 0x8f, 0x27, 0xfe, 0x88, 0xb3, 0xa4, 0xc6, +0xdd, 0x82, 0x5f, 0xbc, 0x22, 0x08, 0xb6, 0xd8, 0xa9, 0xa0, 0x20, 0x35, 0xdb, 0x39, 0x47, 0x90, 0xbd, 0xe4, 0xa8, 0x2d, 0xba, 0xa6, 0x04, 0x8c, 0x48, 0xe8, 0xeb, 0xcb, 0x6d, 0x23, 0x3b, 0xcd, 0x70, 0xce, 0x71, 0x19, 0x7b, 0x57, 0x24, 0x1c, +0x3a, 0x5a, 0x26, 0x56, 0x1a, 0xe5, 0xec, 0x3c, 0x67, 0x11, 0x9a, 0x45, 0x2f, 0xc2, 0x98, 0x33, 0x3e, 0xf3, 0xd7, 0xaa, 0x9d, 0x0b, 0xff, 0x2b, 0x02, 0x7a, 0x40, 0x5e, 0x30, 0x0e, 0x29, 0x1d, 0xef, 0xc0, 0x40, 0xfa, 0x3d, 0x0c, 0x0a, 0xe5, +0x4c, 0x23, 0xee, 0x9f, 0x5f, 0x1e, 0xf9, 0xeb, 0x49, 0xac, 0x07, 0x27, 0x6e, 0xd0, 0xba, 0x7a, 0x6d, 0xf0, 0xbf, 0xb0, 0x4a, 0x70, 0x7e, 0x88, 0x22, 0x21, 0xf4, 0xa3, 0x12, 0xe6, 0x41, 0x05, 0x2e, 0x64, 0x79, 0xa5, 0xbb, 0x13, 0x51, 0xca, +0x83, 0x62, 0x96, 0x26, 0x2d, 0xbc, 0x4d, 0x4b, 0x34, 0xea, 0xb1, 0x4f, 0x38, 0x3a, 0x4e, 0xfd, 0x09, 0x16, 0x91, 0xa4, 0xa0, 0x39, 0x95, 0x67, 0x3f, 0x9d, 0xb2, 0x9c, 0xcc, 0x47, 0xb5, 0x87, 0x85, 0x2b, 0x48, 0x2c, 0x5c, 0x15, 0x7c, 0xc7, +0x6f, 0x46, 0x17, 0x1d, 0x56, 0x0e, 0x3e, 0xfc, 0xb6, 0x9e, 0x45, 0xb4, 0x92, 0xc4, 0xd8, 0x54, 0x6a, 0xc3, 0x59, 0xf8, 0x69, 0x61, 0x44, 0x5d, 0x5e, 0xde, 0x8e, 0x0b, 0x89, 0x80, 0x6b, 0xe9, 0xd4, 0x36, 0x7f, 0xb9, 0xbe, 0x82, 0xa2, 0x2a, +0xce, 0x73, 0x35, 0x60, 0xe0, 0x24, 0x84, 0x20, 0x0f, 0x65, 0xc1, 0xe3, 0x7d, 0xe2, 0x3b, 0x0d, 0x10, 0xd7, 0x06, 0x63, 0xa6, 0xf5, 0x1c, 0x98, 0x18, 0x03, 0xdd, 0x08, 0xb8, 0x93, 0x1b, 0x28, 0x74, 0xc6, 0xe7, 0x9a, 0xec, 0x94, 0x32, 0xe1, +0x6c, 0x52, 0x5a, 0xaf, 0xd6, 0xf3, 0x2f, 0xfb, 0xbd, 0xae, 0xaa, 0x8c, 0xb3, 0x76, 0x1a, 0x86, 0x42, 0xdf, 0x25, 0xcb, 0xb7, 0x00, 0x53, 0x02, 0xc8, 0x11, 0x8f, 0x50, 0x8d, 0xed, 0xfe, 0xa1, 0x30, 0xcf, 0x19, 0x33, 0x55, 0x37, 0x72, 0xd9, +0xc9, 0x29, 0x8b, 0x71, 0xa7, 0xe4, 0xf6, 0x5b, 0xc2, 0xff, 0xad, 0xf1, 0x3c, 0x9b, 0x66, 0x01, 0x43, 0xf7, 0xcd, 0x7b, 0x1f, 0xd1, 0xdb, 0x58, 0x81, 0xdc, 0x31, 0xab, 0xe8, 0x97, 0x04, 0x77, 0xd2, 0xd5, 0xa8, 0xd3, 0x57, 0xda, 0x14, 0x8a, +0x99, 0xa9, 0x68, 0x90, 0x75, 0x78, 0xf2, 0xc5, 0x64, 0x7d, 0x81, 0x93, 0x2a, 0x9a, 0xf0, 0x94, 0x4a, 0x61, 0xaa, 0xa7, 0xec, 0x35, 0xd5, 0x67, 0x71, 0xe1, 0x03, 0xbf, 0x9f, 0xfe, 0x95, 0xf9, 0x50, 0xc3, 0xc0, 0xe7, 0x08, 0x10, 0xdd, 0xf1, +0xd0, 0xaf, 0x83, 0x1c, 0x73, 0x60, 0x66, 0x86, 0xc4, 0x32, 0x8d, 0x05, 0x3f, 0x0a, 0x13, 0x44, 0x51, 0xf7, 0xa8, 0x5b, 0xe3, 0xfd, 0x84, 0xf4, 0xb3, 0x4f, 0x7c, 0x09, 0x41, 0xf8, 0xb7, 0x3d, 0x2b, 0x2e, 0x3a, 0x75, 0x59, 0xfc, 0xee, 0x3c, +0x65, 0xf2, 0xea, 0x78, 0x74, 0xf3, 0x48, 0x5e, 0xc6, 0x6f, 0x58, 0x37, 0x30, 0xa1, 0xa4, 0xed, 0x5c, 0x89, 0x5a, 0xa2, 0x6c, 0x33, 0xe5, 0x36, 0x18, 0xd7, 0x0f, 0x8e, 0x14, 0xd9, 0xca, 0xbc, 0x25, 0x68, 0x1d, 0x7e, 0x49, 0x24, 0x79, 0x40, +0xce, 0x54, 0x4b, 0x69, 0xff, 0x63, 0x15, 0xb8, 0x06, 0x72, 0x20, 0xc2, 0xb0, 0x29, 0x7b, 0x8f, 0x47, 0xa3, 0xdb, 0x99, 0x9b, 0x43, 0x22, 0xe9, 0x2f, 0xa0, 0xad, 0x07, 0x4d, 0xa6, 0xba, 0xb6, 0x56, 0x90, 0x19, 0x16, 0xc1, 0x85, 0xcc, 0x3e, +0xe2, 0x88, 0x1f, 0x42, 0x21, 0x62, 0x23, 0xe6, 0x28, 0x97, 0x98, 0x8c, 0xc9, 0xbd, 0x4e, 0x6a, 0xd2, 0x9c, 0xa9, 0xb5, 0x7f, 0x34, 0xdf, 0x6e, 0xae, 0x9e, 0x5d, 0x46, 0x02, 0x7a, 0xe0, 0x80, 0xcf, 0xbe, 0x87, 0x26, 0x96, 0x2d, 0x0b, 0x0d, +0x27, 0x1b, 0x4c, 0x76, 0x11, 0x12, 0x1e, 0x01, 0x38, 0x0e, 0xc8, 0xbb, 0x91, 0x6b, 0xcd, 0xeb, 0x2c, 0xef, 0x82, 0x17, 0x45, 0xcb, 0x31, 0x77, 0x00, 0x52, 0xc7, 0xac, 0x3b, 0xd8, 0xfa, 0xfb, 0xa5, 0x92, 0xb9, 0x8a, 0xf6, 0x8b, 0xc5, 0x1a, +0xf5, 0xb4, 0xd4, 0xdc, 0x70, 0xde, 0xb2, 0x53, 0xe8, 0x39, 0xab, 0xb1, 0xd1, 0x57, 0x5f, 0xd6, 0x6d, 0x55, 0xd3, 0x04, 0xe4, 0x9d, 0x0c, 0xda, 0x89, 0x7a, 0xb5, 0x54, 0xe6, 0x5a, 0x84, 0xa2, 0x88, 0xf1, 0xb1, 0xce, 0xd1, 0x32, 0xad, 0xb4, +0x6c, 0x7f, 0xfd, 0xc5, 0xe2, 0x52, 0x26, 0x74, 0x9e, 0x96, 0x49, 0x39, 0xac, 0xdf, 0x7c, 0x10, 0x8f, 0x99, 0x3b, 0x34, 0x59, 0x60, 0xf7, 0xec, 0x3d, 0xd9, 0xd4, 0x8b, 0xff, 0x40, 0xb0, 0x29, 0x1a, 0xcf, 0x24, 0xfc, 0x70, 0x75, 0x9a, 0xee, +0xc8, 0x3a, 0x2f, 0xbd, 0x8d, 0xed, 0xcb, 0xa8, 0x71, 0xaf, 0xd8, 0x6d, 0xfa, 0x14, 0xc7, 0x67, 0x81, 0x4f, 0x57, 0xef, 0x0b, 0x87, 0xa7, 0x4a, 0x7b, 0x25, 0x78, 0xe5, 0xba, 0x50, 0x7d, 0x83, 0x27, 0x1c, 0x44, 0x12, 0x56, 0xf9, 0xab, 0x28, +0xde, 0xfe, 0x53, 0x21, 0xa9, 0x6e, 0x30, 0xeb, 0xdc, 0x77, 0x86, 0xe0, 0xd3, 0x58, 0x46, 0xa1, 0x95, 0x65, 0x22, 0x47, 0xcd, 0x97, 0x8c, 0x69, 0x68, 0x63, 0xb2, 0x80, 0x09, 0x73, 0xdb, 0xb9, 0xbe, 0x0c, 0x94, 0x01, 0x79, 0x2e, 0xbf, 0xa5, +0xd5, 0xe9, 0x85, 0x9d, 0x04, 0x33, 0x8e, 0x37, 0x08, 0x9b, 0x5d, 0x5e, 0xe1, 0x1d, 0x51, 0x2c, 0x07, 0x41, 0xea, 0xe7, 0xaa, 0x23, 0xb6, 0x3e, 0xd0, 0xf2, 0x6b, 0xda, 0x9c, 0xf3, 0x1f, 0x13, 0xdd, 0x66, 0x61, 0xae, 0x82, 0xc1, 0x4b, 0x4e, +0xbb, 0x76, 0x4d, 0x3c, 0x06, 0xa3, 0xd2, 0xb8, 0xf4, 0xe8, 0x3f, 0x92, 0x9f, 0x35, 0x64, 0x2d, 0x4c, 0x48, 0x2b, 0x15, 0x0f, 0xe3, 0x16, 0xca, 0x2a, 0xd7, 0xc0, 0xc9, 0xbc, 0xfb, 0x0d, 0x93, 0x72, 0x38, 0xf6, 0x8a, 0x55, 0xa0, 0x11, 0x45, +0xd6, 0x5b, 0xf5, 0xe4, 0xb3, 0x31, 0xc6, 0x20, 0x6a, 0x03, 0x5f, 0x0a, 0xcc, 0xf8, 0xb7, 0x98, 0x42, 0x19, 0x00, 0xc2, 0x17, 0x02, 0x36, 0x91, 0x1e, 0xa4, 0x6f, 0xa6, 0x7e, 0xc3, 0x90, 0x5c, 0x62, 0x05, 0x0e, 0xc4, 0x43, 0x1b, 0x18, 0xf0, +0x37, 0x7b, 0x18, 0x39, 0x6d, 0xbb, 0x1f, 0x7e, 0xc0, 0xfc, 0x49, 0xc1, 0x2b, 0xe5, 0x23, 0xa0, 0xdd, 0x99, 0xc2, 0x36, 0xbd, 0xec, 0xd6, 0x61, 0x1c, 0x17, 0xeb, 0x0c, 0xab, 0xb7, 0x03, 0x06, 0x8f, 0xef, 0x8e, 0xd1, 0xe1, 0xb9, 0xdb, 0x19, +0x91, 0x32, 0x11, 0x2e, 0x87, 0x08, 0xe9, 0x68, 0x7a, 0x3d, 0x71, 0x60, 0xe6, 0x05, 0xbe, 0xce, 0x31, 0x02, 0xd0, 0xfb, 0x9a, 0x75, 0x80, 0xb1, 0xb0, 0x85, 0x0d, 0x12, 0x96, 0xca, 0x66, 0x5b, 0x5e, 0xb2, 0xe7, 0x9b, 0x74, 0xc8, 0x0b, 0x33, +0x9e, 0x89, 0x47, 0x64, 0x73, 0xa1, 0xe3, 0xa8, 0xc6, 0xd7, 0x52, 0x5d, 0x40, 0xfd, 0x65, 0x30, 0xb3, 0x43, 0xd2, 0x09, 0x6a, 0xa7, 0x41, 0x4d, 0xd9, 0x21, 0xde, 0xee, 0x44, 0xb5, 0x04, 0x2c, 0xea, 0x58, 0x8c, 0xf1, 0xa6, 0x78, 0x01, 0xff, +0xf3, 0x84, 0xe0, 0xa5, 0x83, 0x25, 0x7f, 0x14, 0xbf, 0x79, 0x29, 0xcb, 0x34, 0x82, 0x8a, 0x3e, 0xed, 0x9f, 0x0f, 0x55, 0x7c, 0xcd, 0x0a, 0xaf, 0x56, 0x8b, 0xc4, 0x3f, 0x6f, 0xb8, 0x26, 0xb6, 0x53, 0x50, 0x8d, 0xda, 0x4e, 0xd3, 0xa2, 0x4c, +0x24, 0x70, 0x4b, 0x4f, 0x97, 0xc5, 0x81, 0x72, 0x10, 0xcf, 0xf6, 0x2f, 0xe2, 0xe8, 0xb4, 0x9d, 0x77, 0x6c, 0xd5, 0x00, 0x3c, 0x13, 0xa4, 0x1e, 0xd8, 0x90, 0x59, 0x57, 0x28, 0xc3, 0xdc, 0xaa, 0x6b, 0x15, 0x46, 0x16, 0x07, 0x48, 0x54, 0x1a, +0xf7, 0x6e, 0xc7, 0x35, 0x0e, 0xa9, 0x45, 0x22, 0x62, 0x94, 0x86, 0xbc, 0x9c, 0x38, 0xdf, 0x1b, 0xcc, 0x2a, 0x51, 0xac, 0xf9, 0x95, 0xad, 0xd4, 0x20, 0x2d, 0x4a, 0x7d, 0xae, 0xf8, 0x76, 0xfa, 0xe4, 0xf4, 0xa3, 0x5a, 0x5c, 0x42, 0x92, 0x93, +0x98, 0xfe, 0x67, 0x1d, 0x3a, 0xf5, 0x63, 0xc9, 0x69, 0xba, 0x27, 0x5f, 0x88, 0x3b, 0xf0, 0xf2, 0xe0, 0x94, 0xdf, 0x04, 0xcb, 0x3e, 0xb2, 0xe5, 0x28, 0x4d, 0xc9, 0xc6, 0x3a, 0xa9, 0xbf, 0xbb, 0x9b, 0xe8, 0xff, 0x73, 0xf5, 0x1d, 0x10, 0x15, +0x9c, 0xa7, 0xe6, 0x9f, 0xd4, 0x79, 0xb5, 0x77, 0x03, 0x82, 0xb1, 0x25, 0x0b, 0xcf, 0xbd, 0xfc, 0x6a, 0xdd, 0x9d, 0x0c, 0x5d, 0x5c, 0x45, 0x68, 0x50, 0x89, 0xb8, 0x1a, 0xa0, 0x83, 0x26, 0xed, 0xce, 0x35, 0x11, 0x64, 0xfa, 0xca, 0x47, 0xc7, +0x39, 0x0d, 0x4b, 0xee, 0xf4, 0xd2, 0x52, 0xac, 0x1e, 0x3c, 0x81, 0x3b, 0x27, 0x92, 0x8c, 0xb4, 0xd8, 0x46, 0xab, 0x23, 0x55, 0xea, 0x70, 0x0a, 0x49, 0x51, 0x5e, 0x4f, 0xc5, 0x6e, 0x97, 0x65, 0x22, 0x72, 0x18, 0x5a, 0xe9, 0xc2, 0x2b, 0x95, +0xb0, 0xc8, 0xd9, 0x71, 0x5b, 0x7a, 0x98, 0x12, 0x99, 0xa4, 0x84, 0x2a, 0xa8, 0xde, 0x54, 0x14, 0x29, 0x42, 0xa1, 0xf8, 0xad, 0x19, 0xaf, 0x06, 0x67, 0x7b, 0xfe, 0xa5, 0xd0, 0x86, 0x3f, 0x40, 0x01, 0x59, 0x58, 0x1b, 0x9a, 0xf6, 0xa3, 0x4e, +0xd6, 0xd5, 0x88, 0xb6, 0x07, 0xf7, 0xcc, 0xda, 0x38, 0x6c, 0x7c, 0x66, 0xef, 0x02, 0xb9, 0x7e, 0xba, 0xd7, 0x41, 0x56, 0x31, 0x1f, 0x3d, 0xe2, 0xcd, 0x48, 0x8e, 0x76, 0xaa, 0x69, 0x2e, 0xf3, 0xc3, 0xd1, 0x5f, 0xfb, 0x7f, 0x17, 0xf2, 0x7d, +0x74, 0xbc, 0x08, 0x16, 0xe7, 0xe1, 0x91, 0xc0, 0x63, 0x05, 0x53, 0xc1, 0x8f, 0xb3, 0x61, 0xec, 0xae, 0x37, 0x43, 0x21, 0xf0, 0xb7, 0xe4, 0x6d, 0xbe, 0x60, 0x57, 0x44, 0xfd, 0x4c, 0x6f, 0xa6, 0x36, 0x8a, 0xe3, 0x09, 0xc4, 0xeb, 0xf9, 0x93, +0x32, 0x2f, 0x75, 0x9e, 0x6b, 0x0f, 0x24, 0x78, 0x2c, 0x8d, 0x85, 0x33, 0xf1, 0x30, 0x2d, 0x8b, 0x62, 0xa2, 0x13, 0x20, 0x96, 0xdb, 0x34, 0x4a, 0x80, 0x0e, 0x90, 0xdc, 0x1c, 0x87, 0x00, 0xd3, 0xc8, 0xc7, 0x0d, 0xe0, 0x60, 0x2c, 0x6b, 0xc2, +0xb4, 0x75, 0x80, 0xf8, 0x20, 0x8d, 0xd8, 0x8c, 0x6d, 0x5b, 0x45, 0x4b, 0x64, 0xa8, 0xbc, 0xb1, 0x5a, 0xbd, 0x5f, 0xbe, 0xf5, 0xc0, 0x6e, 0x99, 0x26, 0x86, 0xfc, 0xa3, 0x3b, 0xfe, 0x46, 0x31, 0x9a, 0x78, 0xe5, 0x0c, 0x1f, 0xf9, 0x3e, 0x4f, +0x00, 0x50, 0xd6, 0xb2, 0x5e, 0x5d, 0xdc, 0x34, 0x56, 0x29, 0x88, 0x53, 0x8a, 0xca, 0xff, 0xcc, 0x73, 0xe2, 0xeb, 0x36, 0x77, 0x9d, 0xc5, 0x37, 0x97, 0xd0, 0xe4, 0xc6, 0x69, 0x59, 0x25, 0xed, 0xcf, 0x7d, 0xae, 0xbb, 0x87, 0xb8, 0x8e, 0x74, +0x2a, 0x44, 0xd4, 0x22, 0xdb, 0xd3, 0x18, 0x42, 0x6c, 0x7c, 0xf0, 0xad, 0x3a, 0xef, 0xdd, 0x72, 0x84, 0x3f, 0x4d, 0xa1, 0xc3, 0x19, 0xf3, 0x07, 0x06, 0x32, 0xf7, 0xcb, 0x04, 0x16, 0x3d, 0x1e, 0x24, 0xfb, 0x38, 0xac, 0x1b, 0x61, 0xb3, 0xa0, +0x49, 0x54, 0x9c, 0xb7, 0xd1, 0xa2, 0x01, 0xf1, 0x89, 0xde, 0xd9, 0x82, 0x76, 0x08, 0x35, 0x9b, 0x48, 0xb5, 0x7a, 0x15, 0x81, 0x47, 0xce, 0x58, 0x8b, 0x17, 0x40, 0x05, 0x4c, 0x12, 0x63, 0x03, 0x79, 0x66, 0x9f, 0x33, 0xfd, 0xf6, 0x62, 0xd2, +0xe6, 0x8f, 0x39, 0x0e, 0x0f, 0x90, 0xba, 0xf2, 0xe8, 0xab, 0x14, 0x10, 0x43, 0x1a, 0x6a, 0xb9, 0x70, 0x51, 0xb0, 0x11, 0x98, 0x71, 0xe1, 0xda, 0xf4, 0x92, 0x09, 0x2f, 0x93, 0x4a, 0xa5, 0xcd, 0xc4, 0x85, 0x1d, 0x0a, 0x23, 0xea, 0xc9, 0x41, +0x7b, 0xe3, 0xee, 0xaa, 0xdf, 0x96, 0xd5, 0xa9, 0x2b, 0x30, 0x95, 0x2d, 0x67, 0x9e, 0x0b, 0x91, 0x4e, 0x57, 0x55, 0x27, 0x3c, 0xec, 0x52, 0x68, 0xbf, 0x1c, 0xc1, 0x21, 0x02, 0x7f, 0xaf, 0x65, 0x5c, 0xa4, 0xd7, 0xfa, 0xa7, 0xb6, 0xe9, 0x83, +0x13, 0xa6, 0x7e, 0xe7, 0x2e, 0x28, 0x94, 0x6f, 0x8b, 0xad, 0xbf, 0x96, 0xfe, 0x59, 0x27, 0x21, 0xf2, 0x9a, 0xa8, 0x67, 0x52, 0xc2, 0xb2, 0x07, 0xa7, 0x2c, 0xb7, 0x64, 0xb4, 0xe3, 0xfd, 0x02, 0xa2, 0x73, 0x6a, 0x6e, 0x5d, 0x23, 0xc4, 0x20, +0xa1, 0x7f, 0x4c, 0xb6, 0x38, 0x83, 0xeb, 0x5c, 0x56, 0xd7, 0xb0, 0xa5, 0x54, 0x8e, 0xc8, 0x74, 0x05, 0x5a, 0x0b, 0xa3, 0x84, 0xba, 0x34, 0x01, 0x93, 0xe4, 0xd3, 0xc9, 0x98, 0xda, 0xcf, 0x28, 0xf8, 0x57, 0x12, 0x0c, 0xb9, 0x1c, 0x41, 0x2f, +0xa9, 0xf4, 0x45, 0xff, 0xa0, 0x04, 0x3a, 0x32, 0xe9, 0x9d, 0xd6, 0xd8, 0x60, 0x86, 0x79, 0xf7, 0x4d, 0x8d, 0xd9, 0xd4, 0xdb, 0x39, 0x53, 0x36, 0x76, 0x06, 0x9e, 0xb3, 0xc7, 0x0e, 0xec, 0x3e, 0x7e, 0x8f, 0x99, 0xf3, 0x70, 0x31, 0xef, 0x6c, +0x6f, 0x9f, 0x18, 0x3c, 0x5f, 0x19, 0x30, 0x11, 0x26, 0x0d, 0xe7, 0x65, 0x9b, 0xe0, 0x13, 0xdc, 0x61, 0x4b, 0xee, 0xed, 0x43, 0x3b, 0xce, 0xfc, 0xf1, 0x92, 0xe5, 0xb5, 0x8a, 0xde, 0x44, 0x63, 0x2d, 0xbc, 0xb8, 0xdf, 0x40, 0x4a, 0x68, 0x7b, +0x66, 0x8c, 0x5e, 0x89, 0xaa, 0x00, 0x2a, 0xbe, 0x4e, 0x51, 0x25, 0xd0, 0x50, 0xcb, 0x35, 0x55, 0x7a, 0x71, 0xab, 0xe6, 0x87, 0x14, 0xd2, 0x97, 0x78, 0x29, 0x9c, 0xd5, 0xf0, 0x10, 0x1f, 0xe1, 0xcd, 0xf5, 0xd1, 0x49, 0x22, 0xe8, 0xe2, 0x6d, +0x80, 0x0a, 0x81, 0x7c, 0x3f, 0x77, 0x94, 0x82, 0x3d, 0xfa, 0xbb, 0x7d, 0x91, 0xa6, 0xf6, 0x48, 0xc6, 0x16, 0x1e, 0xaf, 0xc0, 0xc1, 0xca, 0x72, 0x5b, 0x42, 0xea, 0x2e, 0x69, 0x46, 0x47, 0xdd, 0x4f, 0x03, 0xa4, 0x1d, 0x90, 0x17, 0xae, 0x75, +0x2b, 0x24, 0x0f, 0x08, 0xc5, 0xcc, 0x58, 0x6b, 0xc3, 0x88, 0x85, 0xb1, 0xfb, 0x33, 0xf9, 0x1a, 0x62, 0xac, 0x1b, 0x09, 0x15, 0x37, 0xbd, 0x95, 0x56, 0x33, 0xa9, 0x77, 0x45, 0x23, 0x10, 0x2b, 0x4a, 0xd9, 0x66, 0xd7, 0x43, 0x7f, 0x8c, 0x21, +0x34, 0x8a, 0xde, 0x8f, 0xa6, 0x7b, 0xb1, 0xf1, 0x9f, 0xdd, 0xec, 0xf2, 0xf6, 0x0e, 0x8e, 0x20, 0x97, 0x51, 0x0a, 0xea, 0x02, 0x95, 0x79, 0xaf, 0xc4, 0xb3, 0xb4, 0xda, 0xff, 0xac, 0x68, 0xdb, 0x30, 0x3d, 0xcb, 0x70, 0x8b, 0x1e, 0xbf, 0x72, +0xe6, 0xed, 0xd5, 0x6d, 0x83, 0xa3, 0xc0, 0x5d, 0x65, 0x42, 0xfc, 0xb7, 0x5a, 0x60, 0x48, 0xd4, 0x88, 0xf3, 0x53, 0x7a, 0xfe, 0xc1, 0xa7, 0x4e, 0x75, 0x91, 0x3b, 0x4b, 0x5c, 0x89, 0x1a, 0xfb, 0xfd, 0xf4, 0x0c, 0x6b, 0xd6, 0xaa, 0x9c, 0xf5, +0xdc, 0xd8, 0x4d, 0x84, 0x8d, 0x00, 0x05, 0xc7, 0x28, 0x27, 0x35, 0x26, 0xee, 0x7c, 0xba, 0xc3, 0x14, 0x44, 0xf0, 0x38, 0xc9, 0x4c, 0x1f, 0x22, 0xb8, 0x93, 0x98, 0x9e, 0x6e, 0xad, 0x47, 0x31, 0x17, 0xa8, 0xa0, 0xcc, 0xbb, 0x96, 0x25, 0x03, +0x5b, 0xc5, 0xb0, 0xe8, 0x36, 0x62, 0x2c, 0x18, 0x7d, 0x08, 0x76, 0x9d, 0x57, 0x64, 0xbe, 0x2f, 0x3c, 0xbc, 0xe9, 0xb5, 0x2e, 0x50, 0xce, 0xe3, 0x0d, 0xae, 0x6f, 0xf9, 0xa5, 0xa2, 0x01, 0x0b, 0xb6, 0x40, 0xc2, 0x07, 0xeb, 0x3a, 0x80, 0x52, +0x16, 0xfa, 0xe1, 0x2d, 0x4f, 0xcd, 0xb2, 0x15, 0x1d, 0x06, 0x87, 0x37, 0x9b, 0xf8, 0x29, 0xca, 0x73, 0xf7, 0x92, 0x90, 0x24, 0x61, 0xe2, 0x32, 0x3e, 0x2a, 0x86, 0xe7, 0xbd, 0x5f, 0x82, 0x78, 0xa4, 0x41, 0xd1, 0x3f, 0xa1, 0x46, 0x04, 0xab, +0x13, 0xef, 0xd3, 0xdf, 0x49, 0x7e, 0x11, 0x58, 0x9a, 0x12, 0x85, 0xc6, 0xc8, 0xd2, 0xb9, 0x1c, 0x19, 0x63, 0x09, 0xe4, 0x5e, 0x99, 0x94, 0x6a, 0x59, 0x69, 0xe5, 0x81, 0x39, 0x74, 0x54, 0x55, 0xe0, 0x1b, 0x6c, 0x71, 0xcf, 0x0f, 0x67, 0xd0, +0xa0, 0xee, 0x86, 0xef, 0x3f, 0x4d, 0x55, 0xc2, 0x17, 0xd3, 0xb9, 0xaa, 0x7b, 0x78, 0xda, 0x64, 0x68, 0x11, 0x43, 0x82, 0xf5, 0x28, 0x26, 0x3e, 0x87, 0xe0, 0x0f, 0x95, 0xde, 0x18, 0x47, 0x75, 0x6d, 0x3a, 0x3b, 0xfb, 0xbb, 0x1f, 0x79, 0x5f, +0x3c, 0x66, 0x98, 0x8c, 0x4f, 0x00, 0xf8, 0x34, 0xfc, 0x1e, 0xd2, 0x59, 0xa2, 0x05, 0x22, 0x7f, 0xcd, 0x36, 0xf3, 0x7a, 0x91, 0xfd, 0xf4, 0xad, 0x90, 0x8a, 0x61, 0x40, 0xa4, 0x89, 0x8d, 0x31, 0x14, 0xf1, 0xa9, 0x5d, 0xe5, 0x20, 0x0b, 0xb6, +0x0e, 0x2a, 0x85, 0x62, 0x81, 0x94, 0x03, 0xd1, 0xa6, 0x88, 0x72, 0xfa, 0x1d, 0x6e, 0x4e, 0x12, 0x2e, 0xb2, 0xeb, 0xbe, 0x01, 0x21, 0x37, 0x73, 0x7d, 0xb5, 0xc6, 0xfe, 0x13, 0x80, 0x1b, 0x57, 0xbc, 0xc3, 0x69, 0x54, 0x2d, 0x8f, 0x9f, 0xa3, +0x27, 0xed, 0xc5, 0x8e, 0xe8, 0x6f, 0xdd, 0xd6, 0x39, 0x15, 0xb4, 0xc8, 0x6b, 0x35, 0xc0, 0x16, 0xc9, 0x52, 0x09, 0x06, 0x67, 0x45, 0xcf, 0x9e, 0xe6, 0x74, 0xba, 0x99, 0x70, 0x30, 0xc4, 0xd8, 0x9a, 0x93, 0x44, 0x5b, 0xcc, 0x2c, 0x76, 0xb8, +0x2b, 0x41, 0x7c, 0xcb, 0x9b, 0x33, 0xe2, 0x7e, 0xf0, 0x50, 0x29, 0x48, 0x56, 0xd0, 0xae, 0x42, 0x08, 0xf2, 0x49, 0xca, 0xe7, 0x65, 0xe1, 0xd4, 0xe4, 0xf9, 0x97, 0x92, 0xdf, 0x60, 0x9c, 0x8b, 0xf6, 0x53, 0x02, 0x6a, 0xa7, 0xd9, 0x51, 0x25, +0xa8, 0x46, 0xf7, 0xc1, 0xbd, 0x4b, 0xb0, 0x6c, 0xce, 0x5e, 0xbf, 0x10, 0xec, 0x0a, 0x0d, 0xdc, 0x07, 0xb3, 0x5a, 0x19, 0xd5, 0x4c, 0x2f, 0xaf, 0xac, 0x96, 0xd7, 0x9d, 0x38, 0xa5, 0xc7, 0x58, 0x0c, 0x5c, 0xe9, 0xff, 0xab, 0x1a, 0x77, 0xe3, +0x83, 0x71, 0x24, 0xa1, 0x32, 0x84, 0xb1, 0x1c, 0xb7, 0x4a, 0x04, 0x23, 0xea, 0x3d, 0xdb, 0x63, 0x0e, 0xee, 0xab, 0x80, 0x7b, 0x9e, 0x27, 0x7f, 0x1a, 0x20, 0x9b, 0x35, 0xc0, 0x67, 0x96, 0x51, 0x0f, 0xc4, 0xe6, 0xa8, 0x8c, 0x66, 0x37, 0xd1, +0x19, 0x98, 0xb9, 0x3e, 0x25, 0x62, 0x78, 0xd8, 0x8a, 0xe5, 0xed, 0x74, 0xa6, 0x59, 0x70, 0xb4, 0xc9, 0xa9, 0xe1, 0x8b, 0xe4, 0xd5, 0xb6, 0x14, 0x5b, 0x41, 0x3f, 0xdc, 0x85, 0xc5, 0xb1, 0x8e, 0xc1, 0xad, 0xbe, 0x42, 0xbc, 0xec, 0x28, 0x46, +0xb5, 0xca, 0xb8, 0x0a, 0x6a, 0xc2, 0x55, 0x7d, 0xd7, 0xd4, 0xe2, 0xea, 0xfe, 0x4a, 0xa4, 0x81, 0x47, 0xa3, 0xc7, 0x76, 0xe8, 0x7e, 0xf2, 0x09, 0x3c, 0xf1, 0x97, 0x05, 0x24, 0x61, 0xaa, 0x87, 0x9a, 0x0b, 0xce, 0x2c, 0xa0, 0x2d, 0x90, 0x0d, +0x36, 0x06, 0x7a, 0xbf, 0x92, 0x4c, 0x60, 0x69, 0xeb, 0x6d, 0x7c, 0x17, 0x5e, 0x94, 0x57, 0xa7, 0x22, 0xb2, 0x1b, 0x91, 0xde, 0xac, 0xf4, 0xaf, 0x5f, 0x86, 0x12, 0x8d, 0xf6, 0xd9, 0x68, 0xe3, 0x15, 0x54, 0x03, 0x1c, 0x6e, 0x0c, 0xcc, 0x71, +0x84, 0xcf, 0xf8, 0xba, 0x63, 0x8f, 0xa5, 0x48, 0x44, 0xd3, 0xbd, 0xcb, 0x58, 0xf7, 0x38, 0x6c, 0x9c, 0x16, 0xe7, 0xae, 0x00, 0x3d, 0x95, 0xc6, 0x5d, 0x1e, 0xd6, 0xcd, 0xf5, 0x4b, 0x73, 0x5a, 0x89, 0xdb, 0x01, 0x88, 0x79, 0x77, 0x07, 0x93, +0x26, 0x9f, 0xff, 0x43, 0x2a, 0xdd, 0xda, 0xf9, 0xd2, 0xdf, 0x32, 0x21, 0x39, 0x3b, 0x50, 0xd0, 0x11, 0xf0, 0x08, 0x34, 0x1f, 0x18, 0xb3, 0x04, 0xef, 0xf3, 0xb7, 0x6f, 0x64, 0x45, 0x65, 0xfd, 0x56, 0x40, 0xe0, 0x2f, 0xfb, 0xa2, 0xc3, 0x3a, +0x1d, 0xe9, 0x30, 0x99, 0x53, 0x9d, 0x10, 0x2e, 0xfc, 0xa1, 0x49, 0x31, 0x82, 0xc8, 0x23, 0x75, 0x4e, 0x4f, 0x83, 0x52, 0x2b, 0x4d, 0x02, 0x6b, 0x5c, 0x29, 0x13, 0x72, 0x33, 0xfa, 0xb0, 0xbb, 0x1e, 0xca, 0x61, 0x77, 0xc7, 0xff, 0x95, 0xa4, +0x62, 0x4d, 0xa1, 0xee, 0x10, 0x96, 0xe6, 0x13, 0x4f, 0x98, 0x9e, 0xc8, 0x9b, 0x30, 0xb0, 0x37, 0xc2, 0x4b, 0xdb, 0xf1, 0xda, 0xf2, 0xe2, 0xe7, 0x9c, 0xd7, 0xe8, 0x2a, 0x05, 0x88, 0x5a, 0x7d, 0x8c, 0x33, 0x1d, 0x1a, 0x75, 0x7f, 0x3e, 0x52, +0x5c, 0x0f, 0xc0, 0x53, 0x80, 0x31, 0x6b, 0xd8, 0xfe, 0x00, 0x26, 0x47, 0x93, 0x87, 0x0a, 0xcd, 0xce, 0x03, 0xa5, 0xf4, 0xd3, 0x6d, 0x4c, 0xd9, 0x65, 0x28, 0xed, 0x08, 0xd5, 0x3b, 0x40, 0x41, 0xbe, 0xb7, 0xb3, 0x70, 0xdf, 0xa9, 0xc5, 0xa2, +0xcc, 0x90, 0x1b, 0xf8, 0x94, 0xf7, 0x86, 0x06, 0xbf, 0x8d, 0x6c, 0xa7, 0x84, 0x22, 0xa0, 0x6e, 0x3a, 0x8e, 0x8b, 0x21, 0xa6, 0x1f, 0xef, 0xc1, 0xdc, 0x2f, 0xd0, 0x14, 0x11, 0x8a, 0xbc, 0x64, 0xe3, 0x69, 0x17, 0xcb, 0xde, 0x63, 0x15, 0x9a, +0x49, 0xab, 0x78, 0x02, 0xc4, 0x29, 0x9d, 0x67, 0xaa, 0x07, 0xd6, 0xb8, 0x3d, 0x4a, 0xa3, 0x9f, 0x01, 0x97, 0x55, 0x73, 0xd4, 0x16, 0xdd, 0x7e, 0x27, 0x23, 0x83, 0xb9, 0xfa, 0x66, 0x20, 0xe9, 0x99, 0x35, 0xd1, 0xbb, 0x19, 0x4e, 0x82, 0x7b, +0x09, 0xf9, 0xae, 0xea, 0xf5, 0x6a, 0x3c, 0x89, 0x43, 0x76, 0x81, 0xc6, 0xb5, 0x5d, 0x79, 0x24, 0x51, 0x2e, 0x72, 0xa8, 0x2b, 0x25, 0x0e, 0xfc, 0xe5, 0xf0, 0x45, 0xec, 0xe0, 0x3f, 0xb6, 0x50, 0x8f, 0xac, 0x0b, 0x54, 0x60, 0x68, 0xbd, 0x7c, +0xb2, 0xcf, 0x0c, 0x2d, 0x12, 0x7a, 0x57, 0x38, 0x18, 0x59, 0xad, 0xf3, 0xb1, 0xc3, 0x32, 0xe1, 0xc9, 0xd2, 0xfb, 0x85, 0x6f, 0x42, 0xb4, 0x04, 0x58, 0x5e, 0x36, 0x5f, 0x0d, 0x71, 0xba, 0x91, 0xeb, 0x44, 0xf6, 0x92, 0x1c, 0x2c, 0xaf, 0x48, +0x39, 0xe4, 0x5b, 0x56, 0x46, 0xfd, 0x34, 0x74, 0x51, 0x99, 0xf5, 0x24, 0x98, 0xfd, 0xc8, 0x81, 0x88, 0x03, 0x29, 0x0b, 0x08, 0x90, 0x7d, 0xf3, 0x47, 0xee, 0x28, 0xfc, 0xa8, 0x21, 0x3d, 0x63, 0x41, 0xd4, 0x8f, 0x62, 0xbc, 0x20, 0x5b, 0xdb, +0x3f, 0xae, 0x01, 0x7a, 0xf7, 0xed, 0xc3, 0x7b, 0xf0, 0xb6, 0x69, 0x83, 0x6e, 0xf4, 0x17, 0xbf, 0x38, 0xf9, 0x7c, 0xfa, 0x85, 0x2e, 0xe4, 0x8b, 0xad, 0x48, 0x87, 0x2a, 0xa3, 0x35, 0xcd, 0x0e, 0xc0, 0xd1, 0x44, 0x16, 0xec, 0x5a, 0x1b, 0xef, +0xb3, 0xb1, 0x75, 0x8d, 0xaa, 0x46, 0x3a, 0x43, 0xe7, 0xfb, 0x6a, 0x0d, 0x27, 0x26, 0x1f, 0x68, 0x9c, 0x4b, 0x11, 0x30, 0xea, 0xb5, 0x02, 0x2d, 0x39, 0xa0, 0xa4, 0xf1, 0xe1, 0x8a, 0xbb, 0xab, 0x1d, 0xcb, 0x54, 0xaf, 0x40, 0x95, 0x06, 0x5e, +0x37, 0x33, 0x31, 0xd2, 0x04, 0x55, 0x8e, 0x6c, 0x56, 0x7e, 0x0a, 0xd9, 0x2f, 0xc9, 0x0c, 0x34, 0x71, 0x18, 0xac, 0x13, 0xeb, 0xb8, 0x5f, 0x3b, 0x9e, 0xb0, 0xd3, 0x4c, 0xa7, 0x4f, 0xe6, 0x3e, 0x25, 0x3c, 0xc1, 0xff, 0x49, 0x6d, 0x50, 0xc4, +0x22, 0x60, 0xce, 0x1e, 0x09, 0x1a, 0x5c, 0xde, 0x6f, 0xdf, 0x82, 0x0f, 0x67, 0x73, 0xcc, 0x8c, 0xb4, 0x7f, 0x05, 0xa9, 0x32, 0x4d, 0x65, 0xb9, 0x70, 0xba, 0xa2, 0xd6, 0x9b, 0x64, 0x84, 0x96, 0x9d, 0x5d, 0x74, 0x94, 0x92, 0xa6, 0xb7, 0x53, +0x9f, 0x91, 0x45, 0xca, 0x12, 0xdc, 0x15, 0x42, 0xd5, 0x2b, 0x9a, 0x97, 0xf8, 0x86, 0xc2, 0x89, 0xa1, 0x57, 0xbd, 0x80, 0xe9, 0xe5, 0x61, 0x07, 0xc6, 0xda, 0x2c, 0x76, 0x93, 0x4a, 0xf6, 0x19, 0xf2, 0xc7, 0x14, 0xd0, 0x77, 0xdd, 0x10, 0xe0, +0x66, 0xd7, 0xbe, 0x59, 0x52, 0x79, 0xe2, 0xe8, 0x23, 0x1c, 0x4e, 0xa5, 0xc5, 0x58, 0x6b, 0xe3, 0xfe, 0x72, 0xb2, 0x00, 0xcf, 0xd8, 0x78, 0x36, 0xb8, 0x40, 0x16, 0x34, 0x4b, 0x30, 0x4e, 0x1b, 0x38, 0x45, 0x26, 0xdc, 0xe6, 0x13, 0x8c, 0xd0, +0x77, 0x11, 0xaa, 0x3e, 0x33, 0xd7, 0x51, 0x1f, 0x2d, 0xd4, 0x93, 0x3c, 0x7d, 0xf7, 0xa6, 0xca, 0x86, 0x15, 0x06, 0xa0, 0xc7, 0xbb, 0xd6, 0x0c, 0x9d, 0xb9, 0xe3, 0xef, 0x74, 0x63, 0x4a, 0x7e, 0x43, 0xfd, 0xa8, 0xfe, 0x55, 0x6f, 0x2a, 0x22, +0x2e, 0xa5, 0xbf, 0xbd, 0x0e, 0x97, 0x36, 0xa7, 0x14, 0xd3, 0x3d, 0x89, 0x20, 0x3b, 0x35, 0x68, 0xd8, 0x27, 0x31, 0xac, 0xb7, 0x6e, 0x0a, 0x19, 0xec, 0xa1, 0xcb, 0xce, 0x2c, 0x8f, 0x4c, 0x59, 0x58, 0x1e, 0x62, 0xb4, 0xde, 0xcf, 0xe7, 0x2f, +0x12, 0xe9, 0xf0, 0x1a, 0x10, 0xc1, 0x56, 0x04, 0xf9, 0x8b, 0xed, 0x83, 0x76, 0x60, 0xc4, 0xb2, 0x66, 0xee, 0xb6, 0xa4, 0x8a, 0x08, 0x44, 0xab, 0x09, 0x4d, 0x0b, 0xb0, 0x5e, 0xc5, 0x00, 0xc2, 0xb3, 0x50, 0xfa, 0x7c, 0x2b, 0xc6, 0xfc, 0xdd, +0x9c, 0x1d, 0x90, 0x02, 0xf8, 0x0f, 0x67, 0x6c, 0xea, 0xe0, 0x0d, 0xd1, 0x61, 0x05, 0x9e, 0xc9, 0x3a, 0x80, 0xdf, 0x5a, 0x85, 0xf4, 0x95, 0x53, 0xe1, 0x24, 0xe8, 0x88, 0x6d, 0xda, 0x25, 0x47, 0xbc, 0xc3, 0xc0, 0xeb, 0x5f, 0x91, 0x7a, 0x29, +0x3f, 0xf3, 0x4f, 0x07, 0x28, 0x8d, 0x75, 0x18, 0x9a, 0x5b, 0x7b, 0x7f, 0x78, 0xaf, 0x37, 0xa2, 0x21, 0xc8, 0x79, 0x84, 0x57, 0x49, 0x96, 0x8e, 0x69, 0x81, 0x5d, 0x23, 0x98, 0x32, 0x5c, 0x48, 0xa3, 0x42, 0x1c, 0x03, 0x9f, 0x41, 0x46, 0xe4, +0x64, 0xcd, 0x73, 0x6b, 0x99, 0xb1, 0x17, 0xf2, 0x82, 0xe5, 0xbe, 0x6a, 0x39, 0x94, 0x54, 0x87, 0xf6, 0x52, 0x65, 0xfb, 0xad, 0x9b, 0xd5, 0xe2, 0x92, 0xd9, 0xa9, 0x71, 0xb5, 0xf5, 0x01, 0xf1, 0x70, 0xcc, 0xae, 0xdb, 0xd2, 0x72, 0xba, 0xff, +0xcf, 0xbe, 0x26, 0x07, 0x12, 0xa6, 0x46, 0x00, 0x93, 0x4d, 0xca, 0xde, 0xcc, 0x36, 0x31, 0x57, 0x80, 0xf7, 0xc0, 0x83, 0xef, 0xf5, 0x08, 0xbb, 0x05, 0xce, 0xa9, 0x2a, 0x28, 0x72, 0xd8, 0x99, 0xa4, 0x51, 0x10, 0x5e, 0xaa, 0xb5, 0x98, 0x70, +0xe5, 0xfe, 0x56, 0x9e, 0xd9, 0x5c, 0x1e, 0xfd, 0x62, 0x89, 0x8d, 0x84, 0x44, 0x2d, 0x7a, 0x49, 0x1a, 0x82, 0x27, 0xd5, 0xb6, 0x8e, 0x34, 0x11, 0x38, 0x64, 0x32, 0xd6, 0x86, 0x67, 0x0b, 0x75, 0x94, 0xc9, 0x50, 0x41, 0x4c, 0xf6, 0x90, 0x16, +0xb3, 0xc7, 0x04, 0x35, 0x19, 0x17, 0x39, 0x4a, 0xa3, 0x4f, 0x52, 0x54, 0xff, 0x3c, 0x9d, 0x3a, 0xab, 0x6d, 0x3f, 0xd2, 0x7f, 0xb8, 0x25, 0xf3, 0xe0, 0x42, 0x30, 0x9a, 0x73, 0x0e, 0x15, 0x81, 0xc2, 0x9c, 0x18, 0x60, 0xae, 0xc5, 0xe9, 0xdb, +0x13, 0xa2, 0x3e, 0xba, 0x3b, 0xeb, 0x47, 0x7b, 0xb1, 0xe4, 0x2f, 0xa5, 0xf4, 0x5d, 0xdd, 0x20, 0xb2, 0xa1, 0xf8, 0x5b, 0x2b, 0x21, 0x8f, 0x1d, 0xb0, 0x97, 0x55, 0x0d, 0x92, 0xc6, 0xc3, 0x5f, 0xda, 0xf9, 0x71, 0x68, 0x33, 0x0a, 0x1b, 0xdf, +0x14, 0x43, 0x66, 0x91, 0x03, 0xfc, 0x6b, 0x6e, 0x8a, 0x6f, 0xf0, 0xee, 0xbd, 0x45, 0xd3, 0x7c, 0xcd, 0xd0, 0xdc, 0xd1, 0x2c, 0xe1, 0xb4, 0x74, 0x0f, 0x9f, 0xe3, 0x48, 0x9b, 0x2e, 0x53, 0xa7, 0xe8, 0x8c, 0xec, 0xe7, 0x6c, 0xf1, 0xfa, 0xb7, +0x0c, 0x24, 0xea, 0xf2, 0x78, 0x5a, 0xb9, 0x40, 0x76, 0xad, 0x7d, 0xe2, 0x6a, 0xed, 0x77, 0xfb, 0x95, 0x69, 0x4e, 0x1f, 0xbc, 0x61, 0x4b, 0x02, 0x23, 0x58, 0xa8, 0xc4, 0x8b, 0x29, 0x3d, 0xd4, 0x79, 0xa0, 0x1c, 0x09, 0x85, 0x59, 0x87, 0x06, +0x96, 0x65, 0x63, 0xcb, 0xe6, 0xbf, 0xd7, 0x88, 0xc8, 0x01, 0xc1, 0x37, 0x7e, 0xac, 0x22, 0xaf, ] From 9ae77c438fcc6d47ae882abd8f7000bea90c4b50 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 25 Jun 2023 17:22:51 +0200 Subject: [PATCH 125/154] Update CI to create an automatic beta release --- .github/workflows/main.yml | 44 ++++++++++++++++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 46 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 899539a0..01e5bc94 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,8 +9,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + - name: Package run: python3 make_release.py + - name: Upload uses: actions/upload-artifact@v2 with: @@ -18,3 +20,45 @@ jobs: path: | DeDRM_tools_*.zip DeDRM_tools.zip + + - name: Delete old release + uses: cb80/delrel@latest + with: + tag: autorelease + token: ${{ github.token }} + + - name: Delete old tag + uses: dev-drprasad/delete-tag-and-release@v1.0 + with: + tag_name: autorelease + github_token: ${{ github.token }} + delete_release: true + + - name: Prepare release + run: cp DeDRM_tools.zip DeDRM_alpha_${{ github.sha }}.zip + + - name: Auto-release + id: autorelease + uses: softprops/action-gh-release@v1 + with: + tag_name: autorelease + token: ${{ github.token }} + name: Automatic alpha release with latest changes + body: | + This release is automatically generated by Github for each commit. + + This means, every time a change is made to this repo, this release will be updated to contain an untested copy of the plugin at that stage. This will contain the most up-to-date code, but it's not tested at all and may be broken. + + Last update based on Git commit ${{ github.sha }}. + prerelease: true + draft: true + files: DeDRM_alpha_${{ github.sha }}.zip + + - name: Make release public + uses: irongut/EditRelease@v1.2.0 + with: + token: ${{ github.token }} + id: ${{ steps.autorelease.outputs.id }} + draft: false + prerelease: true + diff --git a/README.md b/README.md index 94366a9d..9f4fd315 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ DeDRM tools for ebooks This is a fork of Apprentice Harper's version of the DeDRM tools. Apprentice Harper said that the original version of the plugin [is no longer maintained](https://github.com/apprenticeharper/DeDRM_tools#no-longer-maintained), so I've taken over, merged a bunch of open PRs, and added a ton more features and bugfixes. +The latest stable (released) version is v10.0.3 which [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3). The latest `master` build (will be automatically updated with every code change, may be unstable) [can be found here](https://github.com/noDRM/DeDRM_tools/releases/tag/autorelease). + Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0. The v10.0.0 versions of this plugin should both work with Calibre 5.x (Python 3) as well as Calibre 4.x and lower (Python 2). If you encounter issues with this plugin in Calibre 4.x or lower, please open a bug report. From 815f880e347a20c1802ea8ddc72d4a22762d0e44 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 25 Jun 2023 18:51:46 +0200 Subject: [PATCH 126/154] Disable auto-prerelease again (#358) --- .github/workflows/main.yml | 83 +++++++++++++++++++------------------- README.md | 2 +- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 01e5bc94..0cfcf2cc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,44 +21,45 @@ jobs: DeDRM_tools_*.zip DeDRM_tools.zip - - name: Delete old release - uses: cb80/delrel@latest - with: - tag: autorelease - token: ${{ github.token }} - - - name: Delete old tag - uses: dev-drprasad/delete-tag-and-release@v1.0 - with: - tag_name: autorelease - github_token: ${{ github.token }} - delete_release: true - - - name: Prepare release - run: cp DeDRM_tools.zip DeDRM_alpha_${{ github.sha }}.zip - - - name: Auto-release - id: autorelease - uses: softprops/action-gh-release@v1 - with: - tag_name: autorelease - token: ${{ github.token }} - name: Automatic alpha release with latest changes - body: | - This release is automatically generated by Github for each commit. - - This means, every time a change is made to this repo, this release will be updated to contain an untested copy of the plugin at that stage. This will contain the most up-to-date code, but it's not tested at all and may be broken. - - Last update based on Git commit ${{ github.sha }}. - prerelease: true - draft: true - files: DeDRM_alpha_${{ github.sha }}.zip - - - name: Make release public - uses: irongut/EditRelease@v1.2.0 - with: - token: ${{ github.token }} - id: ${{ steps.autorelease.outputs.id }} - draft: false - prerelease: true - +# - name: Delete old release +# uses: cb80/delrel@latest +# with: +# tag: autorelease +# token: ${{ github.token }} +# +# - name: Delete old tag +# uses: dev-drprasad/delete-tag-and-release@v1.0 +# with: +# tag_name: autorelease +# github_token: ${{ github.token }} +# delete_release: true +# +# - name: Prepare release +# run: cp DeDRM_tools.zip DeDRM_alpha_${{ github.sha }}.zip +# +# - name: Auto-release +# id: autorelease +# uses: softprops/action-gh-release@v1 +# with: +# tag_name: autorelease +# token: ${{ github.token }} +# name: Automatic alpha release with latest changes +# body: | +# This release is automatically generated by Github for each commit. +# +# This means, every time a change is made to this repo, this release will be updated to contain an untested copy of the plugin at that stage. This will contain the most up-to-date code, but it's not tested at all and may be broken. +# +# Last update based on Git commit ${{ github.sha }}. +# prerelease: true +# draft: true +# files: DeDRM_alpha_${{ github.sha }}.zip +# +# - name: Make release public +# uses: irongut/EditRelease@v1.2.0 +# with: +# token: ${{ github.token }} +# id: ${{ steps.autorelease.outputs.id }} +# draft: false +# prerelease: true +# +# \ No newline at end of file diff --git a/README.md b/README.md index 9f4fd315..4e912924 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ DeDRM tools for ebooks This is a fork of Apprentice Harper's version of the DeDRM tools. Apprentice Harper said that the original version of the plugin [is no longer maintained](https://github.com/apprenticeharper/DeDRM_tools#no-longer-maintained), so I've taken over, merged a bunch of open PRs, and added a ton more features and bugfixes. -The latest stable (released) version is v10.0.3 which [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3). The latest `master` build (will be automatically updated with every code change, may be unstable) [can be found here](https://github.com/noDRM/DeDRM_tools/releases/tag/autorelease). +The latest stable (released) version is v10.0.3 which [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3). Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0. From 2a1413297ec0ca38d2803b45e3a5b3b44964657c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 2 Aug 2023 07:30:39 +0200 Subject: [PATCH 127/154] Add warning to the standalone code --- DeDRM_plugin/standalone/__init__.py | 12 ++++++++++++ DeDRM_plugin/standalone/jsonconfig.py | 11 +++++++++++ DeDRM_plugin/standalone/passhash.py | 11 +++++++++++ DeDRM_plugin/standalone/remove_drm.py | 11 +++++++++++ 4 files changed, 45 insertions(+) diff --git a/DeDRM_plugin/standalone/__init__.py b/DeDRM_plugin/standalone/__init__.py index e5149bc2..60b615bf 100644 --- a/DeDRM_plugin/standalone/__init__.py +++ b/DeDRM_plugin/standalone/__init__.py @@ -7,6 +7,18 @@ # Copyright © 2021 NoDRM +""" + +NOTE: This code is not functional (yet). I started working on it a while ago +to make a standalone version of the plugins that could work without Calibre, +too, but for now there's only a rough code structure and no working code yet. + +Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll +change in the future. + +""" + + OPT_SHORT_TO_LONG = [ ["c", "config"], ["e", "extract"], diff --git a/DeDRM_plugin/standalone/jsonconfig.py b/DeDRM_plugin/standalone/jsonconfig.py index a4149bfe..b7603df6 100644 --- a/DeDRM_plugin/standalone/jsonconfig.py +++ b/DeDRM_plugin/standalone/jsonconfig.py @@ -8,6 +8,17 @@ # Taken from Calibre code - Copyright © 2008, Kovid Goyal kovid@kovidgoyal.net, GPLv3 +""" + +NOTE: This code is not functional (yet). I started working on it a while ago +to make a standalone version of the plugins that could work without Calibre, +too, but for now there's only a rough code structure and no working code yet. + +Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll +change in the future. + +""" + #@@CALIBRE_COMPAT_CODE@@ import sys, os, codecs, json diff --git a/DeDRM_plugin/standalone/passhash.py b/DeDRM_plugin/standalone/passhash.py index f7bf565f..028828d3 100644 --- a/DeDRM_plugin/standalone/passhash.py +++ b/DeDRM_plugin/standalone/passhash.py @@ -8,6 +8,17 @@ # Copyright © 2021 NoDRM +""" + +NOTE: This code is not functional (yet). I started working on it a while ago +to make a standalone version of the plugins that could work without Calibre, +too, but for now there's only a rough code structure and no working code yet. + +Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll +change in the future. + +""" + #@@CALIBRE_COMPAT_CODE@@ import os, sys diff --git a/DeDRM_plugin/standalone/remove_drm.py b/DeDRM_plugin/standalone/remove_drm.py index 8273b973..a67bc6f4 100644 --- a/DeDRM_plugin/standalone/remove_drm.py +++ b/DeDRM_plugin/standalone/remove_drm.py @@ -8,6 +8,17 @@ # Copyright © 2021 NoDRM +""" + +NOTE: This code is not functional (yet). I started working on it a while ago +to make a standalone version of the plugins that could work without Calibre, +too, but for now there's only a rough code structure and no working code yet. + +Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll +change in the future. + +""" + #@@CALIBRE_COMPAT_CODE@@ import os, sys From b9bad26d4b6efa43efdafd8b060f33ea1d945f36 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 2 Aug 2023 07:39:35 +0200 Subject: [PATCH 128/154] Prepare release candidate v10.0.9 --- .github/ISSUE_TEMPLATE/QUESTION.yml | 8 ++++---- CHANGELOG.md | 10 +++++++++- DeDRM_plugin/DeDRM_Help.htm | 6 ++++-- DeDRM_plugin/__init__.py | 3 ++- DeDRM_plugin/__version.py | 2 +- Obok_plugin/__init__.py | 4 ++-- Obok_plugin/obok/obok.py | 4 ++-- Obok_plugin/obok_dedrm_Help.htm | 2 +- 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/QUESTION.yml b/.github/ISSUE_TEMPLATE/QUESTION.yml index d738b2c3..08477d1d 100644 --- a/.github/ISSUE_TEMPLATE/QUESTION.yml +++ b/.github/ISSUE_TEMPLATE/QUESTION.yml @@ -10,16 +10,16 @@ body: id: calibre-version attributes: label: Which version of Calibre are you running? - description: "Example: 5.32" - placeholder: "5.32" + description: "Example: 6.23" + placeholder: "6.23" validations: required: true - type: input id: plugin-version attributes: label: Which version of the DeDRM plugin are you running? - description: "Example: v10.0.0" - placeholder: "v10.0.0" + description: "Example: v10.0.2" + placeholder: "v10.0.2" validations: required: true - type: input diff --git a/CHANGELOG.md b/CHANGELOG.md index cb0ecbcd..51478fb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,7 +67,11 @@ List of changes since the fork of Apprentice Harper's repository: - Fix Nook Study key retrieval code (partially fixes #50). - Make the plugin work on Calibre 6 (Qt 6). (fixes #54 and #98) If you're running Calibre 6 and you notice any issues, please open a bug report. -## Fixes on master (not yet released): +## Fixes in v10.0.9 (RC for v10.1.0, 2023-08-02): + +Note that versions v10.0.4(s), v10.0.5(s) and v10.0.6(s) were released by other people in various forks, so I have decided to make a larger version jump so there are no conflicting version numbers / different builds with the same version number. + +This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be major issues / bugs, but since a lot of code has changed in the last year I wanted to get some "extended testing" before this becomes v10.1.0. - Fix a bug introduced with #48 that breaks DeDRM'ing on Calibre 4 (fixes #101). - Fix some more Calibre-6 bugs in the Obok plugin (should fix #114). @@ -92,3 +96,7 @@ List of changes since the fork of Apprentice Harper's repository: - Two bugfixes for Amazon DeDRM from Satuoni ( https://github.com/noDRM/DeDRM_tools/issues/315#issuecomment-1508305428 ) and andrewc12 ( https://github.com/andrewc12/DeDRM_tools/commit/d9233d61f00d4484235863969919059f4d0b2057 ) that might make the plugin work with newer versions. - Fix font decryption not working with some books (fixes #347), thanks for the patch @bydioeds. - Fix a couple unicode errors for Python2 in Kindle and Nook code. + +## Fixes on master (not yet released): + +- (none) diff --git a/DeDRM_plugin/DeDRM_Help.htm b/DeDRM_plugin/DeDRM_Help.htm index 5d851592..f658c1c6 100644 --- a/DeDRM_plugin/DeDRM_Help.htm +++ b/DeDRM_plugin/DeDRM_Help.htm @@ -17,7 +17,7 @@ -

        DeDRM Plugin (v10.0.3)

        +

        DeDRM Plugin (v10.0.9 / v10.1.0 RC1)

        This plugin removes DRM from ebooks when they are imported into calibre. If you already have DRMed ebooks in your calibre library, you will need to remove them and import them again.

        @@ -26,6 +26,8 @@

        DeDRM Plugin (v10.0.3)

        Installation

        You have obviously managed to install the plugin, as otherwise you wouldn’t be reading this help file. However, you should also delete any older DRM removal plugins, as this DeDRM plugin replaces the five older plugins: Kindle and Mobipocket DeDRM (K4MobiDeDRM), Ignoble Epub DeDRM (ignobleepub), Inept Epub DeDRM (ineptepub), Inept PDF DeDRM (ineptepub) and eReader PDB 2 PML (eReaderPDB2PML).

        +

        This plugin (in versions v10.0.0 and above) will automatically replace the older 7.X and below versions from Apprentice Alf and Apprentice Harper.

        +

        Configuration

        On Windows and Mac, the keys for ebooks downloaded for Kindle for Mac/PC and Adobe Digital Editions are automatically generated. If all your DRMed ebooks can be opened and read in Kindle for Mac/PC and/or Adobe Digital Editions on the same computer on which you are running calibre, you do not need to do any configuration of this plugin. On Linux, keys for Kindle for PC and Adobe Digital Editions need to be generated separately (see the Linux section below).

        @@ -60,7 +62,7 @@

        Credits:

      • And probably many more.
      -

      For additional help read the FAQs at NoDRM's GitHub repository (or the corresponding FAQs at Apprentice Harpers’s GitHub repository). You can open issue reportsrelated to this fork at NoDRM's GitHub repository.

      +

      For additional help read the FAQs at NoDRM's GitHub repository (or the corresponding FAQs at Apprentice Harpers’s GitHub repository). You can open issue reports related to this fork at NoDRM's GitHub repository.

      Linux Systems Only

      diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 9204600b..9098817a 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -5,7 +5,7 @@ # __init__.py for DeDRM_plugin # Copyright © 2008-2020 Apprentice Harper et al. -# Copyright © 2021 NoDRM +# Copyright © 2021-2023 NoDRM __license__ = 'GPL v3' __docformat__ = 'restructuredtext en' @@ -82,6 +82,7 @@ # 10.0.0 - First forked version by NoDRM. See CHANGELOG.md for details. # 10.0.1 - Fixes a bug in the watermark code. # 10.0.2 - Fix Kindle for Mac & update Adobe key retrieval +# For changes made in 10.0.3 and above, see the CHANGELOG.md file """ Decrypt DRMed ebooks. diff --git a/DeDRM_plugin/__version.py b/DeDRM_plugin/__version.py index ab2ebb0f..e83b3a41 100644 --- a/DeDRM_plugin/__version.py +++ b/DeDRM_plugin/__version.py @@ -4,7 +4,7 @@ #@@CALIBRE_COMPAT_CODE@@ PLUGIN_NAME = "DeDRM" -__version__ = '10.0.3' +__version__ = '10.0.9' PLUGIN_VERSION_TUPLE = tuple([int(x) for x in __version__.split(".")]) PLUGIN_VERSION = ".".join([str(x)for x in PLUGIN_VERSION_TUPLE]) diff --git a/Obok_plugin/__init__.py b/Obok_plugin/__init__.py index f752d5cd..864ded37 100644 --- a/Obok_plugin/__init__.py +++ b/Obok_plugin/__init__.py @@ -3,7 +3,7 @@ print_function) __license__ = 'GPL v3' -__version__ = '10.0.3' +__version__ = '10.0.9' __docformat__ = 'restructuredtext en' ##################################################################### @@ -20,7 +20,7 @@ PLUGIN_NAME = 'Obok DeDRM' PLUGIN_SAFE_NAME = PLUGIN_NAME.strip().lower().replace(' ', '_') PLUGIN_DESCRIPTION = _('Removes DRM from Kobo kepubs and adds them to the library.') -PLUGIN_VERSION_TUPLE = (10, 0, 3) +PLUGIN_VERSION_TUPLE = (10, 0, 9) PLUGIN_VERSION = '.'.join([str(x) for x in PLUGIN_VERSION_TUPLE]) HELPFILE_NAME = PLUGIN_SAFE_NAME + '_Help.htm' PLUGIN_AUTHORS = 'Anon' diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index dc0a30d7..603e7739 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -168,8 +168,8 @@ """Manage all Kobo books, either encrypted or DRM-free.""" from __future__ import print_function -__version__ = '10.0.1' -__about__ = "Obok v{0}\nCopyright © 2012-2022 Physisticated et al.".format(__version__) +__version__ = '10.0.9' +__about__ = "Obok v{0}\nCopyright © 2012-2023 Physisticated et al.".format(__version__) import sys import os diff --git a/Obok_plugin/obok_dedrm_Help.htm b/Obok_plugin/obok_dedrm_Help.htm index 4d1247e1..9ccb736e 100644 --- a/Obok_plugin/obok_dedrm_Help.htm +++ b/Obok_plugin/obok_dedrm_Help.htm @@ -8,7 +8,7 @@

      Obok DeDRM Plugin

      -

      (version 10.0.2)

      +

      (version 10.0.9 / 10.1.0 RC1)

      Installation:

      From 7f6dd84389522ae87ace95ac03680db9c5275f9c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 2 Aug 2023 16:55:41 +0200 Subject: [PATCH 129/154] Fix PDF decryption of ancient 40-bit RC4 with R=2 --- CHANGELOG.md | 2 +- DeDRM_plugin/ineptpdf.py | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51478fb8..b1e58168 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,4 +99,4 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj ## Fixes on master (not yet released): -- (none) +- Fix a bug where decrypting a 40-bit RC4 pdf with R=2 didn't work. diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index ab481303..e227ddcf 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1369,11 +1369,12 @@ def process_with_aes(self, key, encrypt, data, repetitions = 1, iv = None): keylen = len(key) iv = bytes([0x00]*keylen) + aes = AES.new(key, AES.MODE_CBC, iv) + if not encrypt: - plaintext = AES.new(key,AES.MODE_CBC,iv, True).decrypt(data) + plaintext = aes.decrypt(data) return plaintext else: - aes = AES.new(key, AES.MODE_CBC, iv, False) new_data = bytes(data * repetitions) crypt = aes.encrypt(new_data) return crypt @@ -1478,14 +1479,23 @@ def check_user_password_V4(self, password, docid, param): EncMetadata = b'True' if (EncMetadata == ('False' or 'false') or V < 4) and R >= 4: hash.update(codecs.decode(b'ffffffff','hex')) + + # Finish hash: + hash = hash.digest() + if R >= 3: # 8 for _ in range(50): - hash = hashlib.md5(hash.digest()[:length//8]) - key = hash.digest()[:length//8] + hash = hashlib.md5(hash[:length//8]).digest() + if R == 2: + # R=2 only uses first five bytes. + key = hash[:5] + else: + key = hash[:length//8] + if R == 2: # Algorithm 3.4 - u1 = ARC4.new(key).decrypt(password) + u1 = ARC4.new(key).decrypt(self.PASSWORD_PADDING) elif R >= 3: # Algorithm 3.5 hash = hashlib.md5(self.PASSWORD_PADDING) # 2 @@ -1498,6 +1508,7 @@ def check_user_password_V4(self, password, docid, param): k = b''.join(bytes([c ^ i]) for c in key ) x = ARC4.new(k).decrypt(x) u1 = x+x # 32bytes total + if R == 2: is_authenticated = (u1 == U) else: From e82d2b5c9cd799f0c4a1349dbcf0487a115fecaa Mon Sep 17 00:00:00 2001 From: NoDRM Date: Wed, 2 Aug 2023 18:13:42 +0200 Subject: [PATCH 130/154] Fix PDF decryption for 256-bit AES with V=5 --- CHANGELOG.md | 1 + DeDRM_plugin/ineptpdf.py | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b1e58168..3bb9848d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,3 +100,4 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj ## Fixes on master (not yet released): - Fix a bug where decrypting a 40-bit RC4 pdf with R=2 didn't work. +- Fix a bug where decrypting a 256-bit AES pdf with V=5 didn't work. diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index e227ddcf..7802d87c 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -1366,8 +1366,7 @@ def recover_encryption_key_with_password(self, password, docid, param): def process_with_aes(self, key, encrypt, data, repetitions = 1, iv = None): if iv is None: - keylen = len(key) - iv = bytes([0x00]*keylen) + iv = bytes(bytearray(16)) aes = AES.new(key, AES.MODE_CBC, iv) @@ -1395,10 +1394,18 @@ def hash_V5(self, password, salt, userdata, param): raise Exception("K1 < 32 ...") #def process_with_aes(self, key: bytes, encrypt: bool, data: bytes, repetitions: int = 1, iv: bytes = None): E = self.process_with_aes(K[:16], True, K1, 64, K[16:32]) - K = (hashlib.sha256, hashlib.sha384, hashlib.sha512)[sum(E) % 3](E).digest() + E = bytearray(E) + + E_mod_3 = 0 + for i in range(16): + E_mod_3 += E[i] + + E_mod_3 %= 3 + + K = (hashlib.sha256, hashlib.sha384, hashlib.sha512)[E_mod_3](E).digest() if round_number >= 64: - ch = int.from_bytes(E[-1:], "big", signed=False) + ch = E[-1:][0] # get last byte if ch <= round_number - 32: done = True From e509b7d520d044a830c5e56ac75493142d05445d Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 3 Aug 2023 10:50:06 +0200 Subject: [PATCH 131/154] Fix python2 issues in kgenpids and kindlekey --- CHANGELOG.md | 1 + DeDRM_plugin/kgenpids.py | 33 +++++++++++++++++++++++---------- DeDRM_plugin/kindlekey.py | 12 +++++++++--- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bb9848d..b5537cdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -101,3 +101,4 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix a bug where decrypting a 40-bit RC4 pdf with R=2 didn't work. - Fix a bug where decrypting a 256-bit AES pdf with V=5 didn't work. +- Fix bugs in kgenpids.py and kindlekey.py that caused it to fail on Python 2 (#380). diff --git a/DeDRM_plugin/kgenpids.py b/DeDRM_plugin/kgenpids.py index 31cb6a5c..d11c3dab 100644 --- a/DeDRM_plugin/kgenpids.py +++ b/DeDRM_plugin/kgenpids.py @@ -53,11 +53,17 @@ def SHA1(message): def encode(data, map): result = b'' for char in data: - value = char + if sys.version_info[0] == 2: + value = ord(char) + else: + value = char + Q = (value ^ 0x80) // len(map) R = value % len(map) - result += bytes([map[Q]]) - result += bytes([map[R]]) + + result += bytes(bytearray([map[Q]])) + result += bytes(bytearray([map[R]])) + return result # Hash the bytes in data and then encode the digest with the characters in map @@ -84,8 +90,11 @@ def decode(data,map): def getTwoBitsFromBitField(bitField,offset): byteNumber = offset // 4 bitPosition = 6 - 2*(offset % 4) - return bitField[byteNumber] >> bitPosition & 3 - + if sys.version_info[0] == 2: + return ord(bitField[byteNumber]) >> bitPosition & 3 + else: + return bitField[byteNumber] >> bitPosition & 3 + # Returns the six bits at offset from a bit field def getSixBitsFromBitField(bitField,offset): offset *= 3 @@ -97,7 +106,8 @@ def encodePID(hash): global charMap3 PID = b'' for position in range (0,8): - PID += bytes([charMap3[getSixBitsFromBitField(hash,position)]]) + PID += bytes(bytearray([charMap3[getSixBitsFromBitField(hash,position)]])) + return PID # Encryption table used to generate the device PID @@ -134,7 +144,7 @@ def generateDevicePID(table,dsn,nbRoll): index = (index+1) %8 for counter in range (0,8): index = ((((pid[counter] >>5) & 3) ^ pid[counter]) & 0x1f) + (pid[counter] >> 7) - pidAscii += bytes([charMap4[index]]) + pidAscii += bytes(bytearray([charMap4[index]])) return pidAscii def crc32(s): @@ -150,7 +160,7 @@ def checksumPid(s): for i in (0,1): b = crc & 0xff pos = (b // l) ^ (b % l) - res += bytes([charMap4[pos%l]]) + res += bytes(bytearray([charMap4[pos%l]])) crc >>= 8 return res @@ -161,14 +171,17 @@ def pidFromSerial(s, l): crc = crc32(s) arr1 = [0]*l for i in range(len(s)): - arr1[i%l] ^= s[i] + if sys.version_info[0] == 2: + arr1[i%l] ^= ord(s[i]) + else: + arr1[i%l] ^= s[i] crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff] for i in range(l): arr1[i] ^= crc_bytes[i&3] pid = b"" for i in range(l): b = arr1[i] & 0xff - pid += bytes([charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))]]) + pid += bytes(bytearray([charMap4[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))]])) return pid diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 14e4ed18..e8a0e65b 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -115,11 +115,17 @@ def primes(n): def encode(data, map): result = b'' for char in data: - value = char + if sys.version_info[0] == 2: + value = ord(char) + else: + value = char + Q = (value ^ 0x80) // len(map) R = value % len(map) - result += bytes([map[Q]]) - result += bytes([map[R]]) + + result += bytes(bytearray([map[Q]])) + result += bytes(bytearray([map[R]])) + return result # Hash the bytes in data and then encode the digest with the characters in map From bc089ee46d3e5bbb458bc0dd7a503962495f9e2c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 3 Aug 2023 20:01:38 +0200 Subject: [PATCH 132/154] More Python2 bugfixes --- CHANGELOG.md | 3 ++- DeDRM_plugin/__init__.py | 14 +++++++++++--- DeDRM_plugin/alfcrypto.py | 22 ++++++++++++++++++---- DeDRM_plugin/erdr2pml.py | 20 +++++++++++++++----- DeDRM_plugin/kgenpids.py | 4 ++++ DeDRM_plugin/kindlekey.py | 9 +++++++-- DeDRM_plugin/mobidedrm.py | 22 ++++++++++++++++++---- 7 files changed, 75 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5537cdf..c10dc196 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -101,4 +101,5 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix a bug where decrypting a 40-bit RC4 pdf with R=2 didn't work. - Fix a bug where decrypting a 256-bit AES pdf with V=5 didn't work. -- Fix bugs in kgenpids.py and kindlekey.py that caused it to fail on Python 2 (#380). +- Fix bugs in kgenpids.py, alfcrypto.py, mobidedrm.py and kindlekey.py that caused it to fail on Python 2 (#380). +- Fix some bugs (Python 2 and Python 3) in erdr2pml.py (untested). diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 9098817a..983ecc80 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -96,7 +96,10 @@ #@@CALIBRE_COMPAT_CODE@@ try: - import __version + try: + from . import __version + except: + import __version except: print("#############################") print("Failed to load the DeDRM plugin") @@ -134,8 +137,10 @@ class FileTypePlugin: except: config_dir = "" - -import utilities +try: + from . import utilities +except: + import utilities PLUGIN_NAME = __version.PLUGIN_NAME @@ -915,6 +920,9 @@ def KindleMobiDecrypt(self,path_to_ebook): # perhaps we need to get a new default Kindle for Mac/PC key defaultkeys = [] print("{0} v{1}: Failed to decrypt with error: {2}".format(PLUGIN_NAME, PLUGIN_VERSION,e.args[0])) + + traceback.print_exc() + print("{0} v{1}: Looking for new default Kindle Key after {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, time.time()-self.starttime)) try: diff --git a/DeDRM_plugin/alfcrypto.py b/DeDRM_plugin/alfcrypto.py index ecb79166..3b9f319c 100644 --- a/DeDRM_plugin/alfcrypto.py +++ b/DeDRM_plugin/alfcrypto.py @@ -8,6 +8,7 @@ # pbkdf2.py Copyright © 2009 Daniel Holth # pbkdf2.py This code may be freely used and modified for any purpose. +import sys import hmac from struct import pack import hashlib @@ -25,7 +26,10 @@ def PC1(self, key, src, decryption=True): raise Exception("PC1: Bad key length") wkey = [] for i in range(8): - wkey.append(key[i*2]<<8 | key[i*2+1]) + if sys.version_info[0] == 2: + wkey.append(ord(key[i*2])<<8 | ord(key[i*2+1])) + else: + wkey.append(key[i*2]<<8 | key[i*2+1]) dst = bytearray(len(src)) for i in range(len(src)): temp1 = 0; @@ -37,7 +41,12 @@ def PC1(self, key, src, decryption=True): sum2 = (sum2+sum1)&0xFFFF temp1 = (temp1*20021+1)&0xFFFF byteXorVal ^= temp1 ^ sum2 - curByte = src[i] + + if sys.version_info[0] == 2: + curByte = ord(src[i]) + else: + curByte = src[i] + if not decryption: keyXorVal = curByte * 257; curByte = ((curByte ^ (byteXorVal >> 8)) ^ byteXorVal) & 0xFF @@ -45,7 +54,12 @@ def PC1(self, key, src, decryption=True): keyXorVal = curByte * 257; for j in range(8): wkey[j] ^= keyXorVal; - dst[i] = curByte + + if sys.version_info[0] == 2: + dst[i] = chr(curByte) + else: + dst[i] = curByte + return bytes(dst) class Topaz_Cipher(object): @@ -103,7 +117,7 @@ def pbkdf2(self, passwd, salt, iter, keylen): def xorbytes( a, b ): if len(a) != len(b): raise Exception("xorbytes(): lengths differ") - return bytes([x ^ y for x, y in zip(a, b)]) + return bytes(bytearray([x ^ y for x, y in zip(a, b)])) def prf( h, data ): hm = h.copy() diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 1ec99932..7d87aa75 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -79,12 +79,16 @@ #@@CALIBRE_COMPAT_CODE@@ -from utilities import SafeUnbuffered +try: + from utilities import SafeUnbuffered + from argv_utils import unicode_argv +except: + from . import utilities, argv_utils iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -from argv_utils import unicode_argv + import cgi import logging @@ -141,14 +145,20 @@ def sanitizeFileName(name): def fixKey(key): def fixByte(b): + if sys.version_info[0] == 2: + b = ord(b) + return b ^ ((b ^ (b<<1) ^ (b<<2) ^ (b<<3) ^ (b<<4) ^ (b<<5) ^ (b<<6) ^ (b<<7) ^ 0x80) & 0x80) - return bytes([fixByte(a) for a in key]) + return bytes(bytearray([fixByte(a) for a in key])) def deXOR(text, sp, table): - r='' + r=b'' j = sp for i in range(len(text)): - r += chr(ord(table[j]) ^ ord(text[i])) + if sys.version_info[0] == 2: + r += chr(ord(table[j]) ^ ord(text[i])) + else: + r += bytes(bytearray([table[j] ^ text[i]])) j = j + 1 if j == len(table): j = 0 diff --git a/DeDRM_plugin/kgenpids.py b/DeDRM_plugin/kgenpids.py index d11c3dab..670ed935 100644 --- a/DeDRM_plugin/kgenpids.py +++ b/DeDRM_plugin/kgenpids.py @@ -190,6 +190,10 @@ def getKindlePids(rec209, token, serialnum): if isinstance(serialnum,str): serialnum = serialnum.encode('utf-8') + if sys.version_info[0] == 2: + if isinstance(serialnum,unicode): + serialnum = serialnum.encode('utf-8') + if rec209 is None: return [serialnum] diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index e8a0e65b..6297959d 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -62,7 +62,12 @@ class RegError(Exception): # Routines common to Mac and PC -from utilities import SafeUnbuffered +try: + from utilities import SafeUnbuffered + from argv_utils import unicode_argv +except: + from . import utilities, argv_utils + try: from calibre.constants import iswindows, isosx @@ -70,7 +75,7 @@ class RegError(Exception): iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -from argv_utils import unicode_argv + class DrmException(Exception): pass diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 03748362..36d30c46 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -124,7 +124,11 @@ def getSizeOfTrailingDataEntry(ptr, size): if size <= 0: return result while True: - v = ptr[size-1] + if sys.version_info[0] == 2: + v = ord(ptr[size-1]) + else: + v = ptr[size-1] + result |= (v & 0x7F) << bitpos bitpos += 7 size -= 1 @@ -140,7 +144,10 @@ def getSizeOfTrailingDataEntry(ptr, size): # if multibyte data is included in the encryped data, we'll # have already cleared this flag. if flags & 1: - num += (ptr[size - num - 1] & 0x3) + 1 + if sys.version_info[0] == 2: + num += (ord(ptr[size - num - 1]) & 0x3) + 1 + else: + num += (ptr[size - num - 1] & 0x3) + 1 return num @@ -299,7 +306,10 @@ def parseDRM(self, data, count, pidlist): for pid in pidlist: bigpid = pid.encode('utf-8').ljust(16,b'\0') temp_key = PC1(keyvec1, bigpid, False) - temp_key_sum = sum(temp_key) & 0xff + if sys.version_info[0] == 2: + temp_key_sum = sum(map(ord,temp_key)) & 0xff + else: + temp_key_sum = sum(temp_key) & 0xff found_key = None for i in range(count): verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) @@ -315,7 +325,11 @@ def parseDRM(self, data, count, pidlist): # Then try the default encoding that doesn't require a PID pid = '00000000' temp_key = keyvec1 - temp_key_sum = sum(temp_key) & 0xff + if sys.version_info[0] == 2: + temp_key_sum = sum(map(ord,temp_key)) & 0xff + else: + temp_key_sum = sum(temp_key) & 0xff + for i in range(count): verification, size, type, cksum, cookie = struct.unpack('>LLLBxxx32s', data[i*0x30:i*0x30+0x30]) if cksum == temp_key_sum: From d388ae72fd797efcef3da2b4ff8694cfaa4431cb Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 3 Aug 2023 20:14:33 +0200 Subject: [PATCH 133/154] More Py2 fixes --- DeDRM_plugin/kindlekey.py | 11 ++++++++--- DeDRM_plugin/kindlepid.py | 11 +++++++---- DeDRM_plugin/mobidedrm.py | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 6297959d..4e128c9a 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -243,9 +243,14 @@ def GetUserName(): # replace any non-ASCII values with 0xfffd for i in range(0,len(buffer)): - if buffer[i]>"\u007f": - #print "swapping char "+str(i)+" ("+buffer[i]+")" - buffer[i] = "\ufffd" + if sys.version_info[0] == 2: + if buffer[i]>u"\u007f": + #print "swapping char "+str(i)+" ("+buffer[i]+")" + buffer[i] = u"\ufffd" + else: + if buffer[i]>"\u007f": + #print "swapping char "+str(i)+" ("+buffer[i]+")" + buffer[i] = "\ufffd" # return utf-8 encoding of modified username #print "modified username:"+buffer.value return buffer.value.encode('utf-8') diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index 24e0fe82..a034e409 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -33,7 +33,7 @@ def checksumPid(s): for i in (0,1): b = crc & 0xff pos = (b // l) ^ (b % l) - res += letters[pos%l] + res += bytes(bytearray([letters[pos%l]])) crc >>= 8 return res @@ -43,16 +43,19 @@ def pidFromSerial(s, l): arr1 = [0]*l for i in range(len(s)): - arr1[i%l] ^= s[i] + if sys.version_info[0] == 2: + arr1[i%l] ^= ord(s[i]) + else: + arr1[i%l] ^= s[i] crc_bytes = [crc >> 24 & 0xff, crc >> 16 & 0xff, crc >> 8 & 0xff, crc & 0xff] for i in range(l): arr1[i] ^= crc_bytes[i&3] - pid = '' + pid = b"" for i in range(l): b = arr1[i] & 0xff - pid+=letters[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))] + pid+=bytes(bytearray([letters[(b >> 7) + ((b >> 5 & 3) ^ (b & 0x1f))]])) return pid diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 36d30c46..5989e8bc 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -113,7 +113,7 @@ def checksumPid(s): for i in (0,1): b = crc & 0xff pos = (b // l) ^ (b % l) - res += letters[pos%l] + res += bytes(bytearray([letters[pos%l]])) crc >>= 8 return res From 53996cf49c504264a3632576f15fc492dd371860 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 3 Aug 2023 20:45:06 +0200 Subject: [PATCH 134/154] More Python2 fixes --- DeDRM_plugin/__calibre_compat_code.py | 2 +- DeDRM_plugin/adobekey.py | 4 ++-- DeDRM_plugin/config.py | 2 +- DeDRM_plugin/epubtest.py | 4 ++-- DeDRM_plugin/erdr2pml.py | 7 ++----- DeDRM_plugin/ignoblekeyGenPassHash.py | 4 ++-- DeDRM_plugin/ignoblekeyNookStudy.py | 4 ++-- DeDRM_plugin/ineptepub.py | 5 ++--- DeDRM_plugin/ineptpdf.py | 4 ++-- DeDRM_plugin/k4mobidedrm.py | 4 ++-- DeDRM_plugin/kindlekey.py | 7 ++----- DeDRM_plugin/kindlepid.py | 8 ++++---- DeDRM_plugin/mobidedrm.py | 24 +++++++++++++++++------- DeDRM_plugin/topazextract.py | 6 +++--- 14 files changed, 44 insertions(+), 41 deletions(-) diff --git a/DeDRM_plugin/__calibre_compat_code.py b/DeDRM_plugin/__calibre_compat_code.py index a535a424..85eae0c7 100644 --- a/DeDRM_plugin/__calibre_compat_code.py +++ b/DeDRM_plugin/__calibre_compat_code.py @@ -15,6 +15,6 @@ sys.path.insert(0, os.path.join(config_dir, "plugins", "DeDRM.zip")) # Explicitly set the package identifier so we are allowed to import stuff ... -#__package__ = "DeDRM_plugin" +__package__ = "calibre_plugins.dedrm" #@@CALIBRE_COMPAT_CODE_END@@ diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 4994dd00..7dc76710 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -46,8 +46,8 @@ -from utilities import SafeUnbuffered -from argv_utils import unicode_argv +from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv try: diff --git a/DeDRM_plugin/config.py b/DeDRM_plugin/config.py index 82ee89f3..19b40fda 100755 --- a/DeDRM_plugin/config.py +++ b/DeDRM_plugin/config.py @@ -29,7 +29,7 @@ from __init__ import PLUGIN_NAME, PLUGIN_VERSION from __version import RESOURCE_NAME as help_file_name -from utilities import uStrCmp +from .utilities import uStrCmp import prefs import androidkindlekey diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index 9213df8e..8b7fa041 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -53,12 +53,12 @@ import zlib import zipfile import xml.etree.ElementTree as etree -from argv_utils import unicode_argv +from .argv_utils import unicode_argv NSMAP = {'adept': 'http://ns.adobe.com/adept', 'enc': 'http://www.w3.org/2001/04/xmlenc#'} -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered _FILENAME_LEN_OFFSET = 26 diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 7d87aa75..4d957246 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -79,11 +79,8 @@ #@@CALIBRE_COMPAT_CODE@@ -try: - from utilities import SafeUnbuffered - from argv_utils import unicode_argv -except: - from . import utilities, argv_utils +from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') diff --git a/DeDRM_plugin/ignoblekeyGenPassHash.py b/DeDRM_plugin/ignoblekeyGenPassHash.py index 6f09bc4e..65d17330 100644 --- a/DeDRM_plugin/ignoblekeyGenPassHash.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -50,9 +50,9 @@ except ImportError: from Crypto.Cipher import AES -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered -from argv_utils import unicode_argv +from .argv_utils import unicode_argv class IGNOBLEError(Exception): pass diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index 4cf52469..99db9b5d 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -27,14 +27,14 @@ import getopt import re -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered try: from calibre.constants import iswindows except: iswindows = sys.platform.startswith('win') -from argv_utils import unicode_argv +from .argv_utils import unicode_argv class DrmException(Exception): pass diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index f118ce69..b655ffd8 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -70,9 +70,8 @@ def unpad(data, padding=16): return data[:-pad_len] -from utilities import SafeUnbuffered - -from argv_utils import unicode_argv +from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv class ADEPTError(Exception): diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 7802d87c..69a9ca5e 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -93,12 +93,12 @@ def unpad(data, padding=16): return data[:-pad_len] -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -from argv_utils import unicode_argv +from .argv_utils import unicode_argv class ADEPTError(Exception): pass diff --git a/DeDRM_plugin/k4mobidedrm.py b/DeDRM_plugin/k4mobidedrm.py index c3200b6d..4a22318f 100644 --- a/DeDRM_plugin/k4mobidedrm.py +++ b/DeDRM_plugin/k4mobidedrm.py @@ -88,9 +88,9 @@ class DrmException(Exception): import androidkindlekey import kfxdedrm -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered -from argv_utils import unicode_argv +from .argv_utils import unicode_argv # cleanup unicode filenames diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 4e128c9a..9206d83c 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -62,11 +62,8 @@ class RegError(Exception): # Routines common to Mac and PC -try: - from utilities import SafeUnbuffered - from argv_utils import unicode_argv -except: - from . import utilities, argv_utils +from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv try: diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index a034e409..2d53b990 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -16,17 +16,17 @@ import sys import binascii -from utilities import SafeUnbuffered +from .utilities import SafeUnbuffered -from argv_utils import unicode_argv +from .argv_utils import unicode_argv -letters = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' +letters = b'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' def crc32(s): return (~binascii.crc32(s,-1))&0xFFFFFFFF def checksumPid(s): - crc = crc32(s.encode('ascii')) + crc = crc32(s) crc = crc ^ (crc >> 16) res = s l = len(letters) diff --git a/DeDRM_plugin/mobidedrm.py b/DeDRM_plugin/mobidedrm.py index 5989e8bc..864c08fc 100755 --- a/DeDRM_plugin/mobidedrm.py +++ b/DeDRM_plugin/mobidedrm.py @@ -80,11 +80,14 @@ import os import struct import binascii -from alfcrypto import Pukall_Cipher -from utilities import SafeUnbuffered -from argv_utils import unicode_argv +#@@CALIBRE_COMPAT_CODE@@ + + +from .alfcrypto import Pukall_Cipher +from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv class DrmException(Exception): @@ -103,10 +106,17 @@ def PC1(key, src, decryption=True): except: raise -# accepts unicode returns unicode +letters = b'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' + +def crc32(s): + return (~binascii.crc32(s,-1))&0xFFFFFFFF + def checksumPid(s): - letters = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' - crc = (~binascii.crc32(s.encode('utf-8'),-1))&0xFFFFFFFF + + s = s.encode() + + + crc = crc32(s) crc = crc ^ (crc >> 16) res = s l = len(letters) @@ -115,7 +125,7 @@ def checksumPid(s): pos = (b // l) ^ (b % l) res += bytes(bytearray([letters[pos%l]])) crc >>= 8 - return res + return res.decode() # expects bytearray def getSizeOfTrailingDataEntries(ptr, size, flags): diff --git a/DeDRM_plugin/topazextract.py b/DeDRM_plugin/topazextract.py index 8848bd9a..97d75a79 100644 --- a/DeDRM_plugin/topazextract.py +++ b/DeDRM_plugin/topazextract.py @@ -24,10 +24,10 @@ from struct import pack from struct import unpack -from alfcrypto import Topaz_Cipher -from utilities import SafeUnbuffered +from .alfcrypto import Topaz_Cipher +from .utilities import SafeUnbuffered -from argv_utils import unicode_argv +from .argv_utils import unicode_argv #global switch From 10b6caf9f51f4ec975098700d039a4b5773204d1 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 3 Aug 2023 21:21:49 +0200 Subject: [PATCH 135/154] Enable autorelease into 2nd repo --- .github/workflows/main.yml | 71 ++++++++++++++++---------------------- DeDRM_plugin/adobekey.py | 1 + README.md | 8 +++-- 3 files changed, 35 insertions(+), 45 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0cfcf2cc..af937d3e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,46 +20,33 @@ jobs: path: | DeDRM_tools_*.zip DeDRM_tools.zip + + - name: Prepare release + run: cp DeDRM_tools.zip DeDRM_alpha_${{ github.sha }}.zip -# - name: Delete old release -# uses: cb80/delrel@latest -# with: -# tag: autorelease -# token: ${{ github.token }} -# -# - name: Delete old tag -# uses: dev-drprasad/delete-tag-and-release@v1.0 -# with: -# tag_name: autorelease -# github_token: ${{ github.token }} -# delete_release: true -# -# - name: Prepare release -# run: cp DeDRM_tools.zip DeDRM_alpha_${{ github.sha }}.zip -# -# - name: Auto-release -# id: autorelease -# uses: softprops/action-gh-release@v1 -# with: -# tag_name: autorelease -# token: ${{ github.token }} -# name: Automatic alpha release with latest changes -# body: | -# This release is automatically generated by Github for each commit. -# -# This means, every time a change is made to this repo, this release will be updated to contain an untested copy of the plugin at that stage. This will contain the most up-to-date code, but it's not tested at all and may be broken. -# -# Last update based on Git commit ${{ github.sha }}. -# prerelease: true -# draft: true -# files: DeDRM_alpha_${{ github.sha }}.zip -# -# - name: Make release public -# uses: irongut/EditRelease@v1.2.0 -# with: -# token: ${{ github.token }} -# id: ${{ steps.autorelease.outputs.id }} -# draft: false -# prerelease: true -# -# \ No newline at end of file + + - uses: dev-drprasad/delete-older-releases@v0.2.1 + with: + repo: noDRM/DeDRM_tools_autorelease + keep_latest: 0 + delete_tags: true + env: + GITHUB_TOKEN: ${{ secrets.AUTORELEASE_KEY }} + + - name: Auto-release + id: autorelease + uses: softprops/action-gh-release@v1 + with: + tag_name: autorelease_${{ github.sha }} + repository: noDRM/DeDRM_tools_autorelease + token: ${{ secrets.AUTORELEASE_KEY }} + name: Automatic alpha release with latest changes + body: | + This release is automatically generated by Github for each commit. + + This means, every time a change is made to the repo, a release with an untested copy of the plugin at that stage will be created. This will contain the most up-to-date code, but it's not tested at all and may be broken. + + Last update based on Git commit [${{ github.sha }}](https://github.com/noDRM/DeDRM_tools/commit/${{ github.sha }}). + prerelease: true + draft: false + files: DeDRM_alpha_${{ github.sha }}.zip diff --git a/DeDRM_plugin/adobekey.py b/DeDRM_plugin/adobekey.py index 7dc76710..5ad771f0 100644 --- a/DeDRM_plugin/adobekey.py +++ b/DeDRM_plugin/adobekey.py @@ -44,6 +44,7 @@ import sys, os, struct, getopt from base64 import b64decode +#@@CALIBRE_COMPAT_CODE@@ from .utilities import SafeUnbuffered diff --git a/README.md b/README.md index 4e912924..b04af46a 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,13 @@ DeDRM tools for ebooks This is a fork of Apprentice Harper's version of the DeDRM tools. Apprentice Harper said that the original version of the plugin [is no longer maintained](https://github.com/apprenticeharper/DeDRM_tools#no-longer-maintained), so I've taken over, merged a bunch of open PRs, and added a ton more features and bugfixes. -The latest stable (released) version is v10.0.3 which [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3). +The latest stable (released) version is v10.0.3 which [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.3). The latest beta is v10.0.9, as a release candidate for v10.1.0. It [can be downloaded here](https://github.com/noDRM/DeDRM_tools/releases/tag/v10.0.9). -Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). This plugin will start with version v10.0.0. +The latest alpha version is available [at this link](https://github.com/noDRM/DeDRM_tools_autorelease/releases). This version is completely untested and will contain the latest code changes in this repository. With each commit in this repository, a new automatic alpha version will be uploaded there. If you want the most up-to-date code to test things and are okay with the plugin occasionally breaking, you can download this version. -The v10.0.0 versions of this plugin should both work with Calibre 5.x (Python 3) as well as Calibre 4.x and lower (Python 2). If you encounter issues with this plugin in Calibre 4.x or lower, please open a bug report. +Take a look at [the CHANGELOG](https://github.com/noDRM/DeDRM_tools/blob/master/CHANGELOG.md) to see a list of changes since the last version by Apprentice Harper (v7.2.1). + +My version of the plugin should both work with Calibre 5.x/6.x (Python 3) as well as Calibre 4.x and lower (Python 2). If you encounter issues with this plugin in Calibre 4.x or lower, please open a bug report. # Original README from Apprentice Harper From ef67dbd204b024e4e6ba4d5644179fb57cf825a5 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 6 Aug 2023 15:49:52 +0200 Subject: [PATCH 136/154] Fix more Py2/Py3 stuff --- DeDRM_plugin/__calibre_compat_code.py | 5 +++-- DeDRM_plugin/__main__.py | 13 ++++++++++++- DeDRM_plugin/convert2xml.py | 5 ++++- DeDRM_plugin/epubtest.py | 2 ++ DeDRM_plugin/genbook.py | 4 +++- DeDRM_plugin/ignoblekeyGenPassHash.py | 2 ++ DeDRM_plugin/ignoblekeyNookStudy.py | 2 ++ DeDRM_plugin/ineptepub.py | 2 ++ DeDRM_plugin/ineptpdf.py | 3 ++- DeDRM_plugin/ion.py | 5 ++++- DeDRM_plugin/kindlekey.py | 2 ++ DeDRM_plugin/kindlepid.py | 3 ++- 12 files changed, 40 insertions(+), 8 deletions(-) diff --git a/DeDRM_plugin/__calibre_compat_code.py b/DeDRM_plugin/__calibre_compat_code.py index 85eae0c7..b44b8f39 100644 --- a/DeDRM_plugin/__calibre_compat_code.py +++ b/DeDRM_plugin/__calibre_compat_code.py @@ -14,7 +14,8 @@ if os.path.join(config_dir, "plugins", "DeDRM.zip") not in sys.path: sys.path.insert(0, os.path.join(config_dir, "plugins", "DeDRM.zip")) -# Explicitly set the package identifier so we are allowed to import stuff ... -__package__ = "calibre_plugins.dedrm" +if "calibre" in sys.modules: + # Explicitly set the package identifier so we are allowed to import stuff ... + __package__ = "calibre_plugins.dedrm" #@@CALIBRE_COMPAT_CODE_END@@ diff --git a/DeDRM_plugin/__main__.py b/DeDRM_plugin/__main__.py index 96b42179..6c925d25 100644 --- a/DeDRM_plugin/__main__.py +++ b/DeDRM_plugin/__main__.py @@ -5,10 +5,21 @@ # (CLI interface without Calibre) # Copyright © 2021 NoDRM +""" + +NOTE: This code is not functional (yet). I started working on it a while ago +to make a standalone version of the plugins that could work without Calibre, +too, but for now there's only a rough code structure and no working code yet. + +Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll +change in the future. + +""" + __license__ = 'GPL v3' __docformat__ = 'restructuredtext en' -# For revision history see __init__.py +# For revision history see CHANGELOG.md """ Run DeDRM plugin without Calibre. diff --git a/DeDRM_plugin/convert2xml.py b/DeDRM_plugin/convert2xml.py index 6af190bb..1a70844a 100644 --- a/DeDRM_plugin/convert2xml.py +++ b/DeDRM_plugin/convert2xml.py @@ -5,7 +5,10 @@ # For use with Topaz Scripts Version 2.6 # Python 3, September 2020 -from utilities import SafeUnbuffered + +#@@CALIBRE_COMPAT_CODE@@ + +from .utilities import SafeUnbuffered import sys import csv diff --git a/DeDRM_plugin/epubtest.py b/DeDRM_plugin/epubtest.py index 8b7fa041..da0ee954 100644 --- a/DeDRM_plugin/epubtest.py +++ b/DeDRM_plugin/epubtest.py @@ -49,6 +49,8 @@ __version__ = '2.0' +#@@CALIBRE_COMPAT_CODE@@ + import sys, struct, os, traceback import zlib import zipfile diff --git a/DeDRM_plugin/genbook.py b/DeDRM_plugin/genbook.py index b0624fd9..0d49f10d 100644 --- a/DeDRM_plugin/genbook.py +++ b/DeDRM_plugin/genbook.py @@ -4,7 +4,9 @@ # Python 3 for calibre 5.0 from __future__ import print_function -from utilities import SafeUnbuffered +#@@CALIBRE_COMPAT_CODE@@ + +from .utilities import SafeUnbuffered import sys import csv diff --git a/DeDRM_plugin/ignoblekeyGenPassHash.py b/DeDRM_plugin/ignoblekeyGenPassHash.py index 65d17330..f050bd94 100644 --- a/DeDRM_plugin/ignoblekeyGenPassHash.py +++ b/DeDRM_plugin/ignoblekeyGenPassHash.py @@ -45,6 +45,8 @@ import hashlib import base64 +#@@CALIBRE_COMPAT_CODE@@ + try: from Cryptodome.Cipher import AES except ImportError: diff --git a/DeDRM_plugin/ignoblekeyNookStudy.py b/DeDRM_plugin/ignoblekeyNookStudy.py index 99db9b5d..7916c39c 100644 --- a/DeDRM_plugin/ignoblekeyNookStudy.py +++ b/DeDRM_plugin/ignoblekeyNookStudy.py @@ -27,6 +27,8 @@ import getopt import re +#@@CALIBRE_COMPAT_CODE@@ + from .utilities import SafeUnbuffered try: diff --git a/DeDRM_plugin/ineptepub.py b/DeDRM_plugin/ineptepub.py index b655ffd8..3802f719 100644 --- a/DeDRM_plugin/ineptepub.py +++ b/DeDRM_plugin/ineptepub.py @@ -70,6 +70,8 @@ def unpad(data, padding=16): return data[:-pad_len] +#@@CALIBRE_COMPAT_CODE@@ + from .utilities import SafeUnbuffered from .argv_utils import unicode_argv diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 69a9ca5e..6d53b958 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -92,13 +92,14 @@ def unpad(data, padding=16): return data[:-pad_len] +#@@CALIBRE_COMPAT_CODE@@ from .utilities import SafeUnbuffered +from .argv_utils import unicode_argv iswindows = sys.platform.startswith('win') isosx = sys.platform.startswith('darwin') -from .argv_utils import unicode_argv class ADEPTError(Exception): pass diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 63084e0b..7dd39a57 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -30,6 +30,9 @@ from io import BytesIO +#@@CALIBRE_COMPAT_CODE@@ + + try: from Cryptodome.Cipher import AES from Cryptodome.Util.py3compat import bchr @@ -57,7 +60,7 @@ # Windows-friendly choice: pylzma wheels import pylzma as lzma -from kfxtables import * +from .kfxtables import * TID_NULL = 0 TID_BOOLEAN = 1 diff --git a/DeDRM_plugin/kindlekey.py b/DeDRM_plugin/kindlekey.py index 9206d83c..9dc53818 100644 --- a/DeDRM_plugin/kindlekey.py +++ b/DeDRM_plugin/kindlekey.py @@ -62,6 +62,8 @@ class RegError(Exception): # Routines common to Mac and PC +#@@CALIBRE_COMPAT_CODE@@ + from .utilities import SafeUnbuffered from .argv_utils import unicode_argv diff --git a/DeDRM_plugin/kindlepid.py b/DeDRM_plugin/kindlepid.py index 2d53b990..a851ee56 100644 --- a/DeDRM_plugin/kindlepid.py +++ b/DeDRM_plugin/kindlepid.py @@ -16,8 +16,9 @@ import sys import binascii -from .utilities import SafeUnbuffered +#@@CALIBRE_COMPAT_CODE@@ +from .utilities import SafeUnbuffered from .argv_utils import unicode_argv letters = b'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789' From e4e5808894f9ea7283dc7640d6510e5f045edba2 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 3 Dec 2023 10:42:41 +0100 Subject: [PATCH 137/154] Fix file lock issue in androidkindlekey.py --- CHANGELOG.md | 2 ++ DeDRM_plugin/androidkindlekey.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c10dc196..bf8b8062 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,3 +103,5 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix a bug where decrypting a 256-bit AES pdf with V=5 didn't work. - Fix bugs in kgenpids.py, alfcrypto.py, mobidedrm.py and kindlekey.py that caused it to fail on Python 2 (#380). - Fix some bugs (Python 2 and Python 3) in erdr2pml.py (untested). +- Fix file lock bug in androidkindlekey.py on Windows with Calibre >= 7 (untested). + diff --git a/DeDRM_plugin/androidkindlekey.py b/DeDRM_plugin/androidkindlekey.py index 74208e06..27124bda 100755 --- a/DeDRM_plugin/androidkindlekey.py +++ b/DeDRM_plugin/androidkindlekey.py @@ -201,6 +201,9 @@ def get_serials2(path=STORAGE2): for y in tokens: serials.append(y) serials.append(x+y) + + connection.close() + return serials def get_serials(path=STORAGE): From 737d5e7f1e7e0763d9b5e42e3d0effb9c1dfc0ea Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 3 Dec 2023 10:45:09 +0100 Subject: [PATCH 138/154] Bunch of updates for the FileOpen script --- CHANGELOG.md | 1 + DeDRM_plugin/ineptpdf.py | 4 +- ...ptpdf_8.4.51.pyw => ineptpdf_fileopen.pyw} | 832 ++++++++---------- 3 files changed, 371 insertions(+), 466 deletions(-) rename Other_Tools/Tetrachroma_FileOpen_ineptpdf/{ineptpdf_8.4.51.pyw => ineptpdf_fileopen.pyw} (83%) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf8b8062..c39fc95a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,4 +104,5 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix bugs in kgenpids.py, alfcrypto.py, mobidedrm.py and kindlekey.py that caused it to fail on Python 2 (#380). - Fix some bugs (Python 2 and Python 3) in erdr2pml.py (untested). - Fix file lock bug in androidkindlekey.py on Windows with Calibre >= 7 (untested). +- A bunch of updates to the external FileOpen ineptpdf script, might fix #442 (untested). diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 6d53b958..15ea7fca 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -834,7 +834,7 @@ def num_value(x): x = resolve1(x) if not (isinstance(x, int) or isinstance(x, Decimal)): if STRICT: - raise PDFTypeError('Int or Float required: %r' % x) + raise PDFTypeError('Int or Decimal required: %r' % x) return 0 return x @@ -2042,7 +2042,7 @@ def read_xref(self): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(b'^(\\d+)\\s+(\\d+)\\s+obj\\b') + pat = re.compile(rb'^(\\d+)\\s+(\\d+)\\s+obj\\b') offsets = {} xref = PDFXRef() while 1: diff --git a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_8.4.51.pyw b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw similarity index 83% rename from Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_8.4.51.pyw rename to Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw index 4c301e62..5e647e11 100644 --- a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_8.4.51.pyw +++ b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw @@ -1,7 +1,6 @@ #! /usr/bin/python -# ineptpdf8.4.51.pyw -# ineptpdf, version 8.4.51 +# ineptpdf # To run this program install Python 2.7 from http://www.python.org/download/ # @@ -108,6 +107,9 @@ # 8.4.51 - automatic APS offline key retrieval (works only for # Onleihe right now) (80ka80 & Tetrachroma) +# 8.5.0 - First update by noDRM - trying to update the script to include +# improvements from ineptpdf. + """ Decrypts Adobe ADEPT-encrypted and Fileopen PDF files. """ @@ -144,6 +146,10 @@ import inspect import tempfile import sqlite3 import httplib + +from decimal import Decimal +import itertools + try: from Crypto.Cipher import ARC4 # needed for newer pdfs @@ -154,10 +160,8 @@ try: except ImportError: ARC4 = None RSA = None -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO + +from io import BytesIO class ADEPTError(Exception): pass @@ -300,7 +304,10 @@ def nunpack(s, default=0): elif l == 2: return struct.unpack('>H', s)[0] elif l == 3: - return struct.unpack('>L', '\x00'+s)[0] + if sys.version_info[0] == 2: + return struct.unpack('>L', '\x00'+s)[0] + else: + return struct.unpack('>L', bytes([0]) + s)[0] elif l == 4: return struct.unpack('>L', s)[0] else: @@ -351,7 +358,7 @@ class PSKeyword(PSObject): Use PSKeywordTable.intern() instead. ''' def __init__(self, name): - self.name = name + self.name = name.decode('utf-8') return def __repr__(self): @@ -381,12 +388,12 @@ PSLiteralTable = PSSymbolTable(PSLiteral) PSKeywordTable = PSSymbolTable(PSKeyword) LIT = PSLiteralTable.intern KWD = PSKeywordTable.intern -KEYWORD_BRACE_BEGIN = KWD('{') -KEYWORD_BRACE_END = KWD('}') -KEYWORD_ARRAY_BEGIN = KWD('[') -KEYWORD_ARRAY_END = KWD(']') -KEYWORD_DICT_BEGIN = KWD('<<') -KEYWORD_DICT_END = KWD('>>') +KEYWORD_BRACE_BEGIN = KWD(b'{') +KEYWORD_BRACE_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): @@ -408,18 +415,23 @@ def keyword_name(x): ## PSBaseParser ## -EOL = re.compile(r'[\r\n]') -SPC = re.compile(r'\s') -NONSPC = re.compile(r'\S') -HEX = re.compile(r'[0-9a-fA-F]') -END_LITERAL = re.compile(r'[#/%\[\]()<>{}\s]') -END_HEX_STRING = re.compile(r'[^\s0-9a-fA-F]') -HEX_PAIR = re.compile(r'[0-9a-fA-F]{2}|.') -END_NUMBER = re.compile(r'[^0-9]') -END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]') -END_STRING = re.compile(r'[()\134]') -OCT_STRING = re.compile(r'[0-7]') -ESC_STRING = { 'b':8, 't':9, 'n':10, 'f':12, 'r':13, '(':40, ')':41, '\\':92 } +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'[()\\]') +OCT_STRING = re.compile(br'[0-7]') +ESC_STRING = { b'b':8, b't':9, b'n':10, b'f':12, b'r':13, b'(':40, b')':41, b'\\':92 } + +class EmptyArrayValue(object): + def __str__(self): + return "<>" + class PSBaseParser(object): @@ -462,7 +474,7 @@ class PSBaseParser(object): self.fp.seek(pos) # reset the status for nextline() self.bufpos = pos - self.buf = '' + self.buf = b'' self.charpos = 0 # reset the status for nexttoken() self.parse1 = self.parse_main @@ -484,32 +496,37 @@ class PSBaseParser(object): if not m: return (self.parse_main, len(s)) j = m.start(0) - c = s[j] + if isinstance(s[j], str): + # Python 2 + c = s[j] + else: + # Python 3 + c = bytes([s[j]]) self.tokenstart = self.bufpos+j - if c == '%': - self.token = '%' + if c == b'%': + self.token = c return (self.parse_comment, j+1) - if c == '/': - self.token = '' + if c == b'/': + self.token = b'' return (self.parse_literal, j+1) - if c in '-+' or c.isdigit(): + if c in b'-+' or c.isdigit(): self.token = c return (self.parse_number, j+1) - if c == '.': + if c == b'.': self.token = c - return (self.parse_float, j+1) + return (self.parse_decimal, j+1) if c.isalpha(): self.token = c return (self.parse_keyword, j+1) - if c == '(': - self.token = '' + if c == b'(': + self.token = b'' self.paren = 1 return (self.parse_string, j+1) - if c == '<': - self.token = '' + if c == b'<': + self.token = b'' return (self.parse_wopen, j+1) - if c == '>': - self.token = '' + if c == b'>': + self.token = b'' return (self.parse_wclose, j+1) self.add_token(KWD(c)) return (self.parse_main, j+1) @@ -536,22 +553,32 @@ class PSBaseParser(object): return (self.parse_literal, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '#': - self.hex = '' + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'#': + self.hex = b'' return (self.parse_literal_hex, j+1) self.add_token(LIT(self.token)) return (self.parse_main, j) def parse_literal_hex(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if HEX.match(c) and len(self.hex) < 2: self.hex += c return (self.parse_literal_hex, i+1) if self.hex: - self.token += chr(int(self.hex, 16)) + if sys.version_info[0] == 2: + self.token += chr(int(self.hex, 16)) + else: + self.token += bytes([int(self.hex, 16)]) return (self.parse_literal, i) + def parse_number(self, s, i): m = END_NUMBER.search(s, i) if not m: @@ -559,25 +586,30 @@ class PSBaseParser(object): return (self.parse_number, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '.': + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'.': self.token += c - return (self.parse_float, j+1) + return (self.parse_decimal, j+1) try: self.add_token(int(self.token)) except ValueError: pass return (self.parse_main, j) - def parse_float(self, s, i): + + def parse_decimal(self, s, i): m = END_NUMBER.search(s, i) if not m: self.token += s[i:] - return (self.parse_float, len(s)) + return (self.parse_decimal, len(s)) j = m.start(0) self.token += s[i:j] - self.add_token(float(self.token)) + self.add_token(Decimal(self.token.decode('utf-8'))) return (self.parse_main, j) + def parse_keyword(self, s, i): m = END_KEYWORD.search(s, i) if not m: @@ -601,45 +633,74 @@ class PSBaseParser(object): return (self.parse_string, len(s)) j = m.start(0) self.token += s[i:j] - c = s[j] - if c == '\\': + if isinstance(s[j], str): + c = s[j] + else: + c = bytes([s[j]]) + if c == b'\\': self.oct = '' return (self.parse_string_1, j+1) - if c == '(': + if c == b'(': self.paren += 1 self.token += c return (self.parse_string, j+1) - if c == ')': + if c == b')': self.paren -= 1 if self.paren: self.token += c return (self.parse_string, j+1) self.add_token(self.token) return (self.parse_main, j+1) + + def parse_string_1(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if OCT_STRING.match(c) and len(self.oct) < 3: self.oct += c return (self.parse_string_1, i+1) if self.oct: - self.token += chr(int(self.oct, 8)) + if sys.version_info[0] == 2: + self.token += chr(int(self.oct, 8)) + else: + self.token += bytes([int(self.oct, 8)]) return (self.parse_string, i) if c in ESC_STRING: - self.token += chr(ESC_STRING[c]) + + if sys.version_info[0] == 2: + self.token += chr(ESC_STRING[c]) + else: + self.token += bytes([ESC_STRING[c]]) + return (self.parse_string, i+1) def parse_wopen(self, s, i): - c = s[i] + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) if c.isspace() or HEX.match(c): return (self.parse_hexstring, i) - if c == '<': + if c == b'<': self.add_token(KEYWORD_DICT_BEGIN) i += 1 + if c == b'>': + # Empty array without any contents. Why though? + # We need to add some dummy python object that will serialize to + # nothing, otherwise the code removes the whole array. + self.add_token(EmptyArrayValue()) + i += 1 + return (self.parse_main, i) def parse_wclose(self, s, i): - c = s[i] - if c == '>': + if isinstance(s[i], str): + c = s[i] + else: + c = bytes([s[i]]) + if c == b'>': self.add_token(KEYWORD_DICT_END) i += 1 return (self.parse_main, i) @@ -651,8 +712,12 @@ class PSBaseParser(object): return (self.parse_hexstring, len(s)) j = m.start(0) self.token += s[i:j] - token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)), + if sys.version_info[0] == 2: + token = HEX_PAIR.sub(lambda m: chr(int(m.group(0), 16)), SPC.sub('', self.token)) + else: + token = HEX_PAIR.sub(lambda m: bytes([int(m.group(0), 16)]), + SPC.sub(b'', self.token)) self.add_token(token) return (self.parse_main, j) @@ -667,15 +732,19 @@ class PSBaseParser(object): ''' Fetches a next line that ends either with \\r or \\n. ''' - linebuf = '' + linebuf = b'' linepos = self.bufpos + self.charpos eol = False while 1: self.fillbuf() if eol: - c = self.buf[self.charpos] + if sys.version_info[0] == 2: + c = self.buf[self.charpos] + else: + c = bytes([self.buf[self.charpos]]) + # handle '\r\n' - if c == '\n': + if c == b'\n': linebuf += c self.charpos += 1 break @@ -683,10 +752,17 @@ class PSBaseParser(object): if m: linebuf += self.buf[self.charpos:m.end(0)] self.charpos = m.end(0) - if linebuf[-1] == '\r': - eol = True - else: - break + if sys.version_info[0] == 2: + if linebuf[-1] == b'\r': + eol = True + else: + break + else: + if bytes([linebuf[-1]]) == b'\r': + eol = True + else: + break + else: linebuf += self.buf[self.charpos:] self.charpos = len(self.buf) @@ -699,7 +775,7 @@ class PSBaseParser(object): ''' self.fp.seek(0, 2) pos = self.fp.tell() - buf = '' + buf = b'' while 0 < pos: prevpos = pos pos = max(0, pos-self.BUFSIZ) @@ -707,13 +783,13 @@ class PSBaseParser(object): s = self.fp.read(prevpos-pos) if not s: break while 1: - n = max(s.rfind('\r'), s.rfind('\n')) + 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 = '' + buf = b'' return @@ -769,16 +845,17 @@ class PSStackParser(PSBaseParser): def nextobject(self, direct=False): ''' - Yields a list of objects: keywords, literals, strings, + Yields a list of objects: keywords, literals, strings (byte arrays), numbers, arrays and dictionaries. Arrays and dictionaries are represented as Python sequence and dictionaries. ''' while not self.results: (pos, token) = self.nexttoken() - ##print (pos,token), (self.curtype, self.curstack) if (isinstance(token, int) or - isinstance(token, float) or + isinstance(token, Decimal) or isinstance(token, bool) or + isinstance(token, bytearray) or + isinstance(token, bytes) or isinstance(token, str) or isinstance(token, PSLiteral)): # normal token @@ -800,8 +877,11 @@ class PSStackParser(PSBaseParser): try: (pos, objs) = self.end_type('d') if len(objs) % 2 != 0: - raise PSSyntaxError( - 'Invalid dictionary construct: %r' % objs) + print("Incomplete dictionary construct") + objs.append("") # this isn't necessary. + # temporary fix. is this due to rental books? + # raise PSSyntaxError( + # 'Invalid dictionary construct: %r' % objs) d = dict((literal_name(k), v) \ for (k,v) in choplist(2, objs)) self.push((pos, d)) @@ -819,10 +899,10 @@ class PSStackParser(PSBaseParser): return obj -LITERAL_CRYPT = PSLiteralTable.intern('Crypt') -LITERALS_FLATE_DECODE = (PSLiteralTable.intern('FlateDecode'), PSLiteralTable.intern('Fl')) -LITERALS_LZW_DECODE = (PSLiteralTable.intern('LZWDecode'), PSLiteralTable.intern('LZW')) -LITERALS_ASCII85_DECODE = (PSLiteralTable.intern('ASCII85Decode'), PSLiteralTable.intern('A85')) +LITERAL_CRYPT = LIT(b'Crypt') +LITERALS_FLATE_DECODE = (LIT(b'FlateDecode'), LIT(b'Fl')) +LITERALS_LZW_DECODE = (LIT(b'LZWDecode'), LIT(b'LZW')) +LITERALS_ASCII85_DECODE = (LIT(b'ASCII85Decode'), LIT(b'A85')) ## PDF Objects @@ -884,13 +964,13 @@ def decipher_all(decipher, objid, genno, x): ''' Recursively decipher X. ''' - if isinstance(x, str): + if isinstance(x, bytearray) or isinstance(x,bytes) or isinstance(x,str): return decipher(objid, genno, x) decf = lambda v: decipher_all(decipher, objid, genno, v) if isinstance(x, list): x = [decf(v) for v in x] elif isinstance(x, dict): - x = dict((k, decf(v)) for (k, v) in x.iteritems()) + x = dict((k, decf(v)) for (k, v) in iter(x.items())) return x @@ -903,25 +983,25 @@ def int_value(x): return 0 return x -def float_value(x): +def decimal_value(x): x = resolve1(x) - if not isinstance(x, float): + if not isinstance(x, Decimal): if STRICT: - raise PDFTypeError('Float required: %r' % x) + raise PDFTypeError('Decimal required: %r' % x) return 0.0 return x def num_value(x): x = resolve1(x) - if not (isinstance(x, int) or isinstance(x, float)): + if not (isinstance(x, int) or isinstance(x, Decimal)): if STRICT: - raise PDFTypeError('Int or Float required: %r' % x) + raise PDFTypeError('Int or Decimal required: %r' % x) return 0 return x def str_value(x): x = resolve1(x) - if not isinstance(x, str): + if not (isinstance(x, bytearray) or isinstance(x, bytes) or isinstance(x, str)): if STRICT: raise PDFTypeError('String required: %r' % x) return '' @@ -953,25 +1033,25 @@ def stream_value(x): # ascii85decode(data) def ascii85decode(data): - n = b = 0 - out = '' - for c in data: - if '!' <= c and c <= 'u': - n += 1 - b = b*85+(ord(c)-33) - if n == 5: - out += struct.pack('>L',b) - n = b = 0 - elif c == 'z': - assert n == 0 - out += '\0\0\0\0' - elif c == '~': - if n: - for _ in range(5-n): - b = b*85+84 - out += struct.pack('>L',b)[:n-1] - break - return out + n = b = 0 + out = b'' + for c in data: + if b'!' <= c and c <= b'u': + n += 1 + b = b*85+(c-33) + if n == 5: + out += struct.pack('>L',b) + n = b = 0 + elif c == b'z': + assert n == 0 + out += b'\0\0\0\0' + elif c == b'~': + if n: + for _ in range(5-n): + b = b*85+84 + out += struct.pack('>L',b)[:n-1] + break + return out ## PDFStream type @@ -986,7 +1066,7 @@ class PDFStream(PDFObject): cutdiv = len(rawdata) // 16 rawdata = rawdata[:16*cutdiv] else: - if eol in ('\r', '\n', '\r\n'): + if eol in (b'\r', b'\n', b'\r\n'): rawdata = rawdata[:length] self.dic = dic @@ -1032,7 +1112,7 @@ class PDFStream(PDFObject): # will get errors if the document is encrypted. data = zlib.decompress(data) elif f in LITERALS_LZW_DECODE: - data = ''.join(LZWDecoder(StringIO(data)).run()) + data = ''.join(LZWDecoder(BytesIO(data)).run()) elif f in LITERALS_ASCII85_DECODE: data = ascii85decode(data) elif f == LITERAL_CRYPT: @@ -1054,14 +1134,19 @@ class PDFStream(PDFObject): raise PDFValueError( 'Columns undefined for predictor=12') columns = int_value(params['Columns']) - buf = '' - ent0 = '\x00' * columns - for i in xrange(0, len(data), columns+1): + buf = b'' + ent0 = b'\x00' * columns + for i in range(0, len(data), columns+1): pred = data[i] ent1 = data[i+1:i+1+columns] - if pred == '\x02': - ent1 = ''.join(chr((ord(a)+ord(b)) & 255) \ + if sys.version_info[0] == 2: + if pred == '\x02': + ent1 = ''.join(chr((ord(a)+ord(b)) & 255) \ for (a,b) in zip(ent0,ent1)) + else: + if pred == 2: + ent1 = b''.join(bytes([(a+b) & 255]) \ + for (a,b) in zip(ent0,ent1)) buf += ent1 ent0 = ent1 data = buf @@ -1095,11 +1180,11 @@ class PDFEncryptionError(PDFException): pass class PDFPasswordIncorrect(PDFEncryptionError): pass # some predefined literals and keywords. -LITERAL_OBJSTM = PSLiteralTable.intern('ObjStm') -LITERAL_XREF = PSLiteralTable.intern('XRef') -LITERAL_PAGE = PSLiteralTable.intern('Page') -LITERAL_PAGES = PSLiteralTable.intern('Pages') -LITERAL_CATALOG = PSLiteralTable.intern('Catalog') +LITERAL_OBJSTM = LIT(b'ObjStm') +LITERAL_XREF = LIT(b'XRef') +LITERAL_PAGE = LIT(b'Page') +LITERAL_PAGES = LIT(b'Pages') +LITERAL_CATALOG = LIT(b'Catalog') ## XRefs @@ -1117,7 +1202,7 @@ class PDFXRef(object): return '' % len(self.offsets) def objids(self): - return self.offsets.iterkeys() + return iter(self.offsets.keys()) def load(self, parser): self.offsets = {} @@ -1128,31 +1213,32 @@ class PDFXRef(object): raise PDFNoValidXRef('Unexpected EOF - file corrupted?') if not line: raise PDFNoValidXRef('Premature eof: %r' % parser) - if line.startswith('trailer'): + if line.startswith(b'trailer'): parser.seek(pos) break - f = line.strip().split(' ') + f = line.strip().split(b' ') if len(f) != 2: raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) try: (start, nobjs) = map(int, f) except ValueError: raise PDFNoValidXRef('Invalid line: %r: line=%r' % (parser, line)) - for objid in xrange(start, start+nobjs): + for objid in range(start, start+nobjs): try: (_, line) = parser.nextline() except PSEOF: raise PDFNoValidXRef('Unexpected EOF - file corrupted?') - f = line.strip().split(' ') + f = line.strip().split(b' ') 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)) + if use != b'n': + continue + self.offsets[objid] = (int(genno.decode('utf-8')), int(pos.decode('utf-8'))) self.load_trailer(parser) return - KEYWORD_TRAILER = PSKeywordTable.intern('trailer') + KEYWORD_TRAILER = PSKeywordTable.intern(b'trailer') def load_trailer(self, parser): try: (_,kwd) = parser.nexttoken() @@ -1190,7 +1276,7 @@ class PDFXRefStream(object): def objids(self): for first, size in self.index: - for objid in xrange(first, first + size): + for objid in range(first, first + size): yield objid def load(self, parser, debug=0): @@ -1203,8 +1289,8 @@ class PDFXRefStream(object): raise PDFNoValidXRef('Invalid PDF stream spec.') size = stream.dic['Size'] index = stream.dic.get('Index', (0,size)) - self.index = zip(islice(index, 0, None, 2), - islice(index, 1, None, 2)) + self.index = list(zip(itertools.islice(index, 0, None, 2), + itertools.islice(index, 1, None, 2))) (self.fl1, self.fl2, self.fl3) = stream.dic['W'] self.data = stream.get_data() self.entlen = self.fl1+self.fl2+self.fl3 @@ -1261,7 +1347,8 @@ class PDFDocument(object): # set_parser(parser) # Associates the document with an (already initialized) parser object. def set_parser(self, parser): - if self.parser: return + if self.parser: + return self.parser = parser # The document is set to be temporarily ready during collecting # all the basic information about the document, e.g. @@ -1283,7 +1370,7 @@ class PDFDocument(object): dict_value(trailer['Encrypt'])) # fix for bad files except: - self.encryption = ('ffffffffffffffffffffffffffffffffffff', + self.encryption = (b'ffffffffffffffffffffffffffffffffffff', dict_value(trailer['Encrypt'])) if 'Root' in trailer: self.set_root(dict_value(trailer['Root'])) @@ -1317,12 +1404,10 @@ class PDFDocument(object): return (docid, param) = self.encryption type = literal_name(param['Filter']) - if type == 'Adobe.APS': - return self.initialize_adobe_ps(password, docid, param) - if type == 'Standard': - return self.initialize_standard(password, docid, param) - if type == 'EBX_HANDLER': - return self.initialize_ebx(password, docid, param) + if type == 'Adobe.APS' or type == "Standard" or type == "EBX_HANDLER": + print("This script is just for FOPN encryption.") + print("For standard password PDFs or Adobe PDFs, use ineptpdy.py") + raise PDFEncryptionError("Not a FileOpen-encrypted file") if type == 'FOPN_fLock': # remove of unnecessairy password attribute return self.initialize_fopn_flock(docid, param) @@ -1330,263 +1415,22 @@ class PDFDocument(object): # remove of unnecessairy password attribute return self.initialize_fopn(docid, param) raise PDFEncryptionError('Unknown filter: param=%r' % param) + + def initialize_and_return_filter(self): + if not self.encryption: + self.is_printable = self.is_modifiable = self.is_extractable = True + self.ready = True + return None - def initialize_adobe_ps(self, password, docid, param): - global KEYFILEPATH - self.decrypt_key = self.genkey_adobe_ps(param) - self.genkey = self.genkey_v4 - self.decipher = self.decrypt_aes - self.ready = True - return - - def getPrincipalKey(self, k=None, url=None, referer=None): - if url == None: - url="ssl://edc.bibliothek-digital.de/edcws/services/urn:EDCLicenseService" - data1='<wsse:Security '+\ - 'xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-'+\ - '1.0.xsd"><wsse:UsernameToken><wsse:Username>edc_anonymous</wsse:Username&'+\ - 'gt;<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-'+\ - 'token-profile-1.0#PasswordText">edc_anonymous</wsse:Password></wsse:UsernameToken&'+\ - 'gt;</wsse:Security>7de-de'+\ - '1010<'+\ - 'watermarkTemplateSeqNum>0' - if k not in url[:40]: - return None - #~ extract host and path: - host=re.compile(r'[a-zA-Z]://([^/]+)/.+', re.I).search(url).group(1) - urlpath=re.compile(r'[a-zA-Z]://[^/]+(/.+)', re.I).search(url).group(1) - - # open a socket connection on port 80 - - conn = httplib.HTTPSConnection(host, 443) - - #~ Headers for request - headers={"Accept": "*/*", "Host": host, "User-Agent": "Mozilla/3.0 (compatible; Acrobat EDC SOAP 1.0)", - "Content-Type": "text/xml; charset=utf-8", "Cache-Control": "no-cache", "SOAPAction": ""} - - # send data1 and headers - try: - conn.request("POST", urlpath, data1, headers) - except: - raise ADEPTError("Could not post request to '"+host+"'.") - - # read respose - try: - response = conn.getresponse() - responsedata=response.read() - except: - raise ADEPTError("Could not read response from '"+host+"'.") - - # close connection - conn.close() + (docid, param) = self.encryption + type = literal_name(param['Filter']) + return type - try: - key=re.compile(r'PricipalKey"((?!).)*]*>(((?!).)*)', re.I).search(responsedata).group(2) - - except : - key=None - return key - - def genkey_adobe_ps(self, param): - # nice little offline principal keys dictionary - principalkeys = { 'bibliothek-digital.de': 'Dzqx8McQUNd2CDzBVmtnweUxVWlqJTMqyYtiDIc4dZI='.decode('base64')} - for k, v in principalkeys.iteritems(): - result = self.getPrincipalKey(k) - #print result - if result != None: - principalkeys[k] = result.decode('base64') - else: - raise ADEPTError("No (Online) PrincipalKey found.") - self.is_printable = self.is_modifiable = self.is_extractable = True -## print 'keyvalue' -## print len(keyvalue) -## print keyvalue.encode('hex') - length = int_value(param.get('Length', 0)) / 8 - edcdata = str_value(param.get('EDCData')).decode('base64') - pdrllic = str_value(param.get('PDRLLic')).decode('base64') - pdrlpol = str_value(param.get('PDRLPol')).decode('base64') - #print 'ecd rights' - edclist = [] - for pair in edcdata.split('\n'): - edclist.append(pair) -## print edclist -## print 'edcdata decrypted' -## print edclist[0].decode('base64').encode('hex') -## print edclist[1].decode('base64').encode('hex') -## print edclist[2].decode('base64').encode('hex') -## print edclist[3].decode('base64').encode('hex') -## print 'offlinekey' -## print len(edclist[9].decode('base64')) -## print pdrllic - # principal key request - for key in principalkeys: - if key in pdrllic: - principalkey = principalkeys[key] - else: - raise ADEPTError('Cannot find principal key for this pdf') -## print 'minorversion' -## print int(edclist[8]) - # fix for minor version -## minorversion = int(edclist[8]) - 100 -## if minorversion < 1: -## minorversion = 1 -## print int(minorversion) - shakey = SHA256.new() - shakey.update(principalkey) -## for i in range(0,minorversion): -## shakey.update(principalkey) - shakey = shakey.digest() -## shakey = SHA256.new(principalkey).digest() - ivector = 16 * chr(0) - #print shakey - plaintext = AES.new(shakey,AES.MODE_CBC,ivector).decrypt(edclist[9].decode('base64')) - if plaintext[-16:] != 16 * chr(16): - raise ADEPTError('Offlinekey cannot be decrypted, aborting (hint: redownload pdf) ...') - pdrlpol = AES.new(plaintext[16:32],AES.MODE_CBC,edclist[2].decode('base64')).decrypt(pdrlpol) - if ord(pdrlpol[-1]) < 1 or ord(pdrlpol[-1]) > 16: - raise ADEPTError('Could not decrypt PDRLPol, aborting ...') - else: - cutter = -1 * ord(pdrlpol[-1]) - #print cutter - pdrlpol = pdrlpol[:cutter] - #print plaintext.encode('hex') - #print 'pdrlpol' - #print pdrlpol - return plaintext[:16] - - PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ - '\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' - # experimental aes pw support - def initialize_standard(self, password, docid, param): - # copy from a global variable - V = int_value(param.get('V', 0)) - if (V <=0 or V > 4): - 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']) - try: - EncMetadata = str_value(param['EncryptMetadata']) - except: - EncMetadata = 'True' - self.is_printable = bool(P & 4) - self.is_modifiable = bool(P & 8) - self.is_extractable = bool(P & 16) - self.is_annotationable = bool(P & 32) - self.is_formsenabled = bool(P & 256) - self.is_textextractable = bool(P & 512) - self.is_assemblable = bool(P & 1024) - self.is_formprintable = bool(P & 2048) - # Algorithm 3.2 - password = (password+self.PASSWORD_PADDING)[:32] # 1 - hash = hashlib.md5(password) # 2 - hash.update(O) # 3 - hash.update(struct.pack('= 3: - # Algorithm 3.5 - hash = hashlib.md5(self.PASSWORD_PADDING) # 2 - hash.update(docid[0]) # 3 - x = ARC4.new(key).decrypt(hash.digest()[:16]) # 4 - for i in xrange(1,19+1): - k = ''.join( chr(ord(c) ^ i) for c in key ) - x = ARC4.new(k).decrypt(x) - u1 = x+x # 32bytes total - if R == 2: - is_authenticated = (u1 == U) - else: - is_authenticated = (u1[:16] == U[:16]) - if not is_authenticated: - raise ADEPTError('Password is not correct.') -## raise PDFPasswordIncorrect - self.decrypt_key = key - # genkey method - if V == 1 or V == 2: - self.genkey = self.genkey_v2 - elif V == 3: - self.genkey = self.genkey_v3 - elif V == 4: - self.genkey = self.genkey_v2 - #self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 - # rc4 - if V != 4: - self.decipher = self.decipher_rc4 # XXX may be AES - # aes - elif V == 4 and Length == 128: - elf.decipher = self.decipher_aes - elif V == 4 and Length == 256: - raise PDFNotImplementedError('AES256 encryption is currently unsupported') - self.ready = True - return + PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..' \ + b'\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' + - def initialize_ebx(self, password, docid, param): - global KEYFILEPATH - self.is_printable = self.is_modifiable = self.is_extractable = True - # keyfile path is wrong - if KEYFILEPATH == False: - errortext = 'Cannot find adeptkey.der keyfile. Use ineptkey to generate it.' - raise ADEPTError(errortext) - with open(password, 'rb') as f: - keyder = f.read() - # KEYFILEPATH = '' - key = ASN1Parser([ord(x) for x in keyder]) - key = [bytesToNumber(key.getChild(x).value) for x in xrange(1, 4)] - rsa = RSA.construct(key) - length = int_value(param.get('Length', 0)) / 8 - rights = str_value(param.get('ADEPT_LICENSE')).decode('base64') - rights = zlib.decompress(rights, -15) - rights = etree.fromstring(rights) - expr = './/{http://ns.adobe.com/adept}encryptedKey' - bookkey = ''.join(rights.findtext(expr)).decode('base64') - bookkey = rsa.decrypt(bookkey) - if bookkey[0] != '\x02': - raise ADEPTError('error decrypting book session key') - index = bookkey.index('\0') + 1 - bookkey = bookkey[index:] - ebx_V = int_value(param.get('V', 4)) - ebx_type = int_value(param.get('EBX_ENCRYPTIONTYPE', 6)) - # added because of the booktype / decryption book session key error - if ebx_V == 3: - V = 3 - elif ebx_V < 4 or ebx_type < 6: - V = ord(bookkey[0]) - bookkey = bookkey[1:] - else: - V = 2 - if length and len(bookkey) != length: - raise ADEPTError('error decrypting book session key') - self.decrypt_key = bookkey - self.genkey = self.genkey_v3 if V == 3 else self.genkey_v2 - self.decipher = self.decrypt_rc4 - self.ready = True - return # fileopen support def initialize_fopn_flock(self, docid, param): @@ -2036,8 +1880,53 @@ class PDFDocument(object): self.decrypt_key = self.urlresult['Code'].decode('hex') else: raise ADEPTError('Cannot find decryption key.') - self.genkey = self.genkey_v2 - self.decipher = self.decrypt_rc4 + + + + V = int_value(param.get('V',2)) + R = int_value(param.get('R')) + + + # genkey method + if V == 1 or V == 2 or V == 4: + self.genkey = self.genkey_v2 + elif V == 3: + self.genkey = self.genkey_v3 + elif V >= 5: + self.genkey = self.genkey_v5 + + set_decipher = False + + if V >= 4: + # Check if we need new genkey_v4 - only if we're using AES. + try: + for key in param['CF']: + algo = str(param["CF"][key]["CFM"]) + if algo == "/AESV2": + if V == 4: + self.genkey = self.genkey_v4 + set_decipher = True + self.decipher = self.decrypt_aes + elif algo == "/AESV3": + if V == 4: + self.genkey = self.genkey_v4 + set_decipher = True + self.decipher = self.decrypt_aes + elif algo == "/V2": + set_decipher = True + self.decipher = self.decrypt_rc4 + except: + pass + + # rc4 + if V < 4: + self.decipher = self.decrypt_rc4 # XXX may be AES + # aes + if not set_decipher: + # This should usually already be set by now. + # If it's not, assume that V4 and newer are using AES + if V >= 4: + self.decipher = self.decrypt_aes self.ready = True return @@ -2084,7 +1973,7 @@ class PDFDocument(object): objid = struct.pack('' - KEYWORD_R = PSKeywordTable.intern('R') - KEYWORD_ENDOBJ = PSKeywordTable.intern('endobj') - KEYWORD_STREAM = PSKeywordTable.intern('stream') - KEYWORD_XREF = PSKeywordTable.intern('xref') - KEYWORD_STARTXREF = PSKeywordTable.intern('startxref') + KEYWORD_R = KWD(b'R') + KEYWORD_ENDOBJ = KWD(b'endobj') + KEYWORD_STREAM = KWD(b'stream') + KEYWORD_XREF = KWD(b'xref') + KEYWORD_STARTXREF = KWD(b'startxref') def do_keyword(self, pos, token): if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): self.add_results(*self.pop(1)) @@ -2685,8 +2570,8 @@ class PDFParser(PSStackParser): if STRICT: raise PDFSyntaxError('Unexpected EOF') break - if 'endstream' in line: - i = line.index('endstream') + if b'endstream' in line: + i = line.index(b'endstream') objlen += i data += line[:i] break @@ -2706,7 +2591,7 @@ class PDFParser(PSStackParser): prev = None for line in self.revreadlines(): line = line.strip() - if line == 'startxref': break + if line == b'startxref': break if line: prev = line else: @@ -2758,7 +2643,7 @@ class PDFParser(PSStackParser): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') + pat = re.compile(rb'^(\d+)\s+(\d+)\s+obj\b') offsets = {} xref = PDFXRef() while 1: @@ -2766,7 +2651,7 @@ class PDFParser(PSStackParser): (pos, line) = self.nextline() except PSEOF: break - if line.startswith('trailer'): + if line.startswith(b'trailer'): trailerpos = pos # remember last trailer m = pat.match(line) if not m: continue @@ -2785,7 +2670,7 @@ class PDFParser(PSStackParser): class PDFObjStrmParser(PDFParser): def __init__(self, data, doc): - PSStackParser.__init__(self, StringIO(data)) + PSStackParser.__init__(self, BytesIO(data)) self.doc = doc return @@ -2793,7 +2678,7 @@ class PDFObjStrmParser(PDFParser): self.add_results(*self.popall()) return - KEYWORD_R = KWD('R') + KEYWORD_R = KWD(b'R') def do_keyword(self, pos, token): if token is self.KEYWORD_R: # reference to indirect object @@ -2836,7 +2721,7 @@ class PDFSerializer(object): def dump(self, outf): self.outf = outf self.write(self.version) - self.write('\n%\xe2\xe3\xcf\xd3\n') + self.write(b'\n%\xe2\xe3\xcf\xd3\n') doc = self.doc objids = self.objids xrefs = {} @@ -2858,18 +2743,18 @@ class PDFSerializer(object): startxref = self.tell() if not gen_xref_stm: - self.write('xref\n') - self.write('0 %d\n' % (maxobj + 1,)) - for objid in xrange(0, maxobj + 1): + self.write(b'xref\n') + self.write(b'0 %d\n' % (maxobj + 1,)) + for objid in range(0, maxobj + 1): if objid in xrefs: # force the genno to be 0 - self.write("%010d 00000 n \n" % xrefs[objid][0]) + self.write(b"%010d 00000 n \n" % xrefs[objid][0]) else: - self.write("%010d %05d f \n" % (0, 65535)) + self.write(b"%010d %05d f \n" % (0, 65535)) - self.write('trailer\n') + self.write(b'trailer\n') self.serialize_object(trailer) - self.write('\nstartxref\n%d\n%%%%EOF' % startxref) + self.write(b'\nstartxref\n%d\n%%%%EOF' % startxref) else: # Generate crossref stream. @@ -2927,7 +2812,7 @@ class PDFSerializer(object): dic['Info'] = trailer['Info'] xrefstm = PDFStream(dic, data) self.serialize_indirect(maxobj, xrefstm) - self.write('startxref\n%d\n%%%%EOF' % startxref) + self.write(b'startxref\n%d\n%%%%EOF' % startxref) def write(self, data): self.outf.write(data) self.last = data[-1:] @@ -2936,13 +2821,10 @@ class PDFSerializer(object): return self.outf.tell() def escape_string(self, string): - string = string.replace('\\', '\\\\') - string = string.replace('\n', r'\n') - string = string.replace('(', r'\(') - string = string.replace(')', r'\)') - # get rid of ciando id - regularexp = re.compile(r'http://www.ciando.com/index.cfm/intRefererID/\d{5}') - if regularexp.match(string): return ('http://www.ciando.com') + string = string.replace(b'\\', b'\\\\') + string = string.replace(b'\n', b'\\n') + string = string.replace(b'(', b'\\(') + string = string.replace(b')', b'\\)') return string def serialize_object(self, obj): @@ -2953,54 +2835,76 @@ class PDFSerializer(object): obj['Subtype'] = obj['Type'] del obj['Type'] # end - hope this doesn't have bad effects - self.write('<<') + self.write(b'<<') for key, val in obj.items(): - self.write('/%s' % key) + self.write(str(LIT(key.encode('utf-8'))).encode('utf-8')) self.serialize_object(val) - self.write('>>') + self.write(b'>>') elif isinstance(obj, list): - self.write('[') + self.write(b'[') for val in obj: self.serialize_object(val) - self.write(']') + self.write(b']') + elif isinstance(obj, bytearray): + self.write(b'(%s)' % self.escape_string(obj)) + elif isinstance(obj, bytes): + self.write(b'<%s>' % binascii.hexlify(obj).upper()) elif isinstance(obj, str): - self.write('(%s)' % self.escape_string(obj)) + self.write(b'(%s)' % self.escape_string(obj.encode('utf-8'))) elif isinstance(obj, bool): if self.last.isalnum(): - self.write(' ') - self.write(str(obj).lower()) - elif isinstance(obj, (int, long, float)): + self.write(b' ') + self.write(str(obj).lower().encode('utf-8')) + elif isinstance(obj, int): if self.last.isalnum(): - self.write(' ') - self.write(str(obj)) + self.write(b' ') + self.write(str(obj).encode('utf-8')) + elif isinstance(obj, Decimal): + if self.last.isalnum(): + self.write(b' ') + self.write(str(obj).encode('utf-8')) elif isinstance(obj, PDFObjRef): if self.last.isalnum(): - self.write(' ') - self.write('%d %d R' % (obj.objid, 0)) + self.write(b' ') + self.write(b'%d %d R' % (obj.objid, 0)) elif isinstance(obj, PDFStream): ### If we don't generate cross ref streams the object streams ### are no longer useful, as we have extracted all objects from ### them. Therefore leave them out from the output. if obj.dic.get('Type') == LITERAL_OBJSTM and not gen_xref_stm: - self.write('(deleted)') + self.write(b'(deleted)') else: data = obj.get_decdata() + + # Fix length: + # We've decompressed and then recompressed the PDF stream. + # Depending on the algorithm, the implementation, and the compression level, + # the resulting recompressed stream is unlikely to have the same length as the original. + # So we need to update the PDF object to contain the new proper length. + + # Without this change, all PDFs exported by this plugin are slightly corrupted - + # even though most if not all PDF readers can correct that on-the-fly. + + if 'Length' in obj.dic: + obj.dic['Length'] = len(data) + + self.serialize_object(obj.dic) - self.write('stream\n') + self.write(b'stream\n') self.write(data) - self.write('\nendstream') + self.write(b'\nendstream') else: - data = str(obj) - if data[0].isalnum() and self.last.isalnum(): - self.write(' ') + data = str(obj).encode('utf-8') + if bytes([data[0]]).isalnum() and self.last.isalnum(): + self.write(b' ') self.write(data) def serialize_indirect(self, objid, obj): - self.write('%d 0 obj' % (objid,)) + self.write(b'%d 0 obj' % (objid,)) self.serialize_object(obj) if self.last.isalnum(): - self.write('\n') - self.write('endobj\n') + self.write(b'\n') + self.write(b'endobj\n') def cli_main(argv=sys.argv): progname = os.path.basename(argv[0]) @@ -3145,11 +3049,11 @@ def gui_main(): if RSA is None: root.withdraw() tkMessageBox.showerror( - "INEPT PDF and FileOpen Decrypter", + "PDF FileOpen Decrypter", "This script requires PyCrypto, which must be installed " "separately. Read the top-of-script comment for details.") return 1 - root.title('INEPT PDF Decrypter 8.4.51 (FileOpen/APS-Support)') + root.title('FileOpen PDF Decrypter 8.5.0') root.resizable(True, False) root.minsize(370, 0) DecryptionDialog(root).pack(fill=Tkconstants.X, expand=1) From 5492dcdbf4a2fff801fc6d8230609f2ed3f7b179 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 21 Dec 2023 11:57:39 +0100 Subject: [PATCH 139/154] More FileOpen fixes --- DeDRM_plugin/ineptpdf.py | 2 +- Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/ineptpdf.py b/DeDRM_plugin/ineptpdf.py index 15ea7fca..100dff7e 100755 --- a/DeDRM_plugin/ineptpdf.py +++ b/DeDRM_plugin/ineptpdf.py @@ -2042,7 +2042,7 @@ def read_xref(self): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(rb'^(\\d+)\\s+(\\d+)\\s+obj\\b') + pat = re.compile(br'^(\\d+)\\s+(\\d+)\\s+obj\\b') offsets = {} xref = PDFXRef() while 1: diff --git a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw index 5e647e11..f4f641d1 100644 --- a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw +++ b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw @@ -2643,7 +2643,7 @@ class PDFParser(PSStackParser): except PDFNoValidXRef: # fallback self.seek(0) - pat = re.compile(rb'^(\d+)\s+(\d+)\s+obj\b') + pat = re.compile(br'^(\\d+)\\s+(\\d+)\\s+obj\\b') offsets = {} xref = PDFXRef() while 1: From bf2471e65b1f52bb5292caeba70a9aea31bf6653 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Thu, 21 Dec 2023 12:35:11 +0100 Subject: [PATCH 140/154] Update kfxdedrm as suggested in #440 --- DeDRM_plugin/kfxdedrm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/kfxdedrm.py b/DeDRM_plugin/kfxdedrm.py index cec764c2..419653e6 100644 --- a/DeDRM_plugin/kfxdedrm.py +++ b/DeDRM_plugin/kfxdedrm.py @@ -74,7 +74,7 @@ def decrypt_voucher(self, totalpids): # Belt and braces. PIDs should be unicode strings, but just in case... if isinstance(pid, bytes): pid = pid.decode('ascii') - for dsn_len,secret_len in [(0,0), (16,0), (16,40), (32,40), (40,0), (40,40)]: + for dsn_len,secret_len in [(0,0), (16,0), (16,40), (32,0), (32,40), (40,0), (40,40)]: if len(pid) == dsn_len + secret_len: break # split pid into DSN and account secret else: From 3373d938749117989dfd0a42cc947bf338d3ffda Mon Sep 17 00:00:00 2001 From: NoDRM Date: Fri, 15 Mar 2024 13:13:45 +0100 Subject: [PATCH 141/154] Add binascii import, fixes FileOpen #514 --- Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw | 1 + 1 file changed, 1 insertion(+) diff --git a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw index f4f641d1..1522b2b4 100644 --- a/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw +++ b/Other_Tools/Tetrachroma_FileOpen_ineptpdf/ineptpdf_fileopen.pyw @@ -146,6 +146,7 @@ import inspect import tempfile import sqlite3 import httplib +import binascii from decimal import Decimal import itertools From 195ea69537287d1dcf2a4111818704ec5541cf7b Mon Sep 17 00:00:00 2001 From: Martin Rys Date: Sun, 27 Oct 2024 22:56:15 +0100 Subject: [PATCH 142/154] DeDRM ion: Clean out errorneous whitespace and UTF8 definition from python 2 times --- DeDRM_plugin/ion.py | 60 +++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 7dd39a57..9d9e49c5 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -1,24 +1,17 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# ion.py -# Copyright © 2013-2020 Apprentice Harper et al. - -__license__ = 'GPL v3' -__version__ = '3.0' - -# Revision history: -# Pascal implementation by lulzkabulz. -# BinaryIon.pas + DrmIon.pas + IonSymbols.pas -# 1.0 - Python translation by apprenticenaomi. -# 1.1 - DeDRM integration by anon. -# 1.2 - Added pylzma import fallback -# 1.3 - Fixed lzma support for calibre 4.6+ -# 2.0 - VoucherEnvelope v2/v3 support by apprenticesakuya. -# 3.0 - Added Python 3 compatibility for calibre 5.0 - -""" -Decrypt Kindle KFX files. +"""ion.py: Decrypt Kindle KFX files. + +Revision history: + Pascal implementation by lulzkabulz. + BinaryIon.pas + DrmIon.pas + IonSymbols.pas + 1.0 - Python translation by apprenticenaomi. + 1.1 - DeDRM integration by anon. + 1.2 - Added pylzma import fallback + 1.3 - Fixed lzma support for calibre 4.6+ + 2.0 - VoucherEnvelope v2/v3 support by apprenticesakuya. + 3.0 - Added Python 3 compatibility for calibre 5.0 + +Copyright © 2013-2020 Apprentice Harper et al. """ import collections @@ -30,6 +23,9 @@ from io import BytesIO +__license__ = 'GPL v3' +__version__ = '3.0' + #@@CALIBRE_COMPAT_CODE@@ @@ -1096,11 +1092,11 @@ def process_V9888(st): ws.sbox(d0x6a0bf4d0,d0x6a0dab50,[1,2]) ws.sbox(d0x6a0ba4d0,d0x6a0dab50,[1,2]) ws.shuffle(repl) - ws.shuffle(repl) + ws.shuffle(repl) ws.shuffle(repl) ws.sbox(d0x6a0bf4d0,d0x6a0dab50,[1,2]) ws.sbox(d0x6a0ba4d0,d0x6a0dab50,[1,2]) - ws.exlookup(d0x6a0be4d0) + ws.exlookup(d0x6a0be4d0) dat=ws.mask(st[sto:sto+16]) out+=dat sto+=16 @@ -1124,7 +1120,7 @@ def process_V4648(st): ws.sbox(d0x6a0c51a8,d0x6a0dab50,[1,3]) ws.shuffle(repl) ws.shuffle(repl) - ws.exlookup(d0x6a0c91a8) + ws.exlookup(d0x6a0c91a8) dat=ws.mask(st[sto:sto+16]) out+=dat sto+=16 @@ -1148,7 +1144,7 @@ def process_V5683(st): ws.shuffle(repl) ws.sbox(d0x6a0cfe80,d0x6a0dab50,[]) ws.shuffle(repl) - ws.exlookup(d0x6a0d3e80) + ws.exlookup(d0x6a0d3e80) dat=ws.mask(st[sto:sto+16]) out+=dat sto+=16 @@ -1163,12 +1159,12 @@ def process_V5683(st): # if a<0: a=256+a # ax.append(ha[(a>>4)]+ha[a%16]) # return "".join(ax) -# +# # def memhex(adr,sz): # emu=EmulatorHelper(currentProgram) # arr=emu.readMemory(getAddress(adr),sz) # return a2hex(arr) -# +# @@ -1254,7 +1250,7 @@ def scramble3(st,magic): iVar5 = iVar5 - magic index -= 1 if uVar4<=-1: break - else: + else: if (offset < magic): iVar3 = 0 else : @@ -1274,9 +1270,9 @@ def scramble3(st,magic): index=index-1 iVar5 = iVar5 + magic; cntr += 1; - if iVar3>=divs: break + if iVar3>=divs: break offset = offset + 1 - if offset >= ((magic - 1) + divs) :break + if offset >= ((magic - 1) + divs) :break return ret #not sure if the third variant is used anywhere, but it is in Kindle, so I tried to add it @@ -1342,12 +1338,12 @@ def decryptvoucher(self): _assert(False, "Unknown lock parameter: %s" % param) - # i know that version maps to scramble pretty much 1 to 1, but there was precendent where they changed it, so... + # i know that version maps to scramble pretty much 1 to 1, but there was precendent where they changed it, so... sharedsecrets = [obfuscate(shared, self.version),obfuscate2(shared, self.version),obfuscate3(shared, self.version), process_V9708(shared), process_V1031(shared), process_V2069(shared), process_V9041(shared), process_V3646(shared), process_V6052(shared), process_V9479(shared), process_V9888(shared), process_V4648(shared), process_V5683(shared)] - + decrypted=False ex=None for sharedsecret in sharedsecrets: @@ -1361,7 +1357,7 @@ def decryptvoucher(self): _assert(self.drmkey.hasnext() and self.drmkey.next() == TID_LIST and self.drmkey.gettypename() == "com.amazon.drm.KeySet@1.0", "Expected KeySet, got %s" % self.drmkey.gettypename()) - decrypted=True + decrypted=True print("Decryption succeeded") break From 34c4c067e825edb5a0a64f5c7ecf88a6f2d34323 Mon Sep 17 00:00:00 2001 From: Martin Rys Date: Sun, 27 Oct 2024 22:57:43 +0100 Subject: [PATCH 143/154] DeDRM ion: Correctly throw last exception if decrypt fails --- DeDRM_plugin/ion.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 9d9e49c5..36c542ee 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -13,6 +13,7 @@ Copyright © 2013-2020 Apprentice Harper et al. """ +from __future__ import annotations import collections import hashlib @@ -1345,7 +1346,7 @@ def decryptvoucher(self): process_V4648(shared), process_V5683(shared)] decrypted=False - ex=None + lastexception: Exception | None = None for sharedsecret in sharedsecrets: key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) @@ -1362,9 +1363,10 @@ def decryptvoucher(self): print("Decryption succeeded") break except Exception as ex: + lastexception = ex print("Decryption failed, trying next fallback ") if not decrypted: - raise ex + raise lastexception self.drmkey.stepin() while self.drmkey.hasnext(): From 05fff5217b02adea0265ceeb0712b497585fd304 Mon Sep 17 00:00:00 2001 From: Ben Combee Date: Thu, 22 Aug 2024 18:17:47 -0500 Subject: [PATCH 144/154] Fix crash using bare sha1 symbol Use sha1 from hashlib, as it isn't imported globally, fixed crash trying to decrypt a eReader PDB file --- DeDRM_plugin/erdr2pml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/erdr2pml.py b/DeDRM_plugin/erdr2pml.py index 4d957246..2efe9bb7 100755 --- a/DeDRM_plugin/erdr2pml.py +++ b/DeDRM_plugin/erdr2pml.py @@ -255,7 +255,7 @@ def unshuff(data, shuf): encrypted_key = r[172:172+8] encrypted_key_sha = r[56:56+20] self.content_key = des.decrypt(encrypted_key) - if sha1(self.content_key).digest() != encrypted_key_sha: + if hashlib.sha1(self.content_key).digest() != encrypted_key_sha: raise ValueError('Incorrect Name and/or Credit Card') def getNumImages(self): From 2e53d70e88bc479c5b83a71301f580857dba60da Mon Sep 17 00:00:00 2001 From: precondition <57645186+precondition@users.noreply.github.com> Date: Thu, 10 Aug 2023 11:09:49 +0200 Subject: [PATCH 145/154] Catch FileNotFoundError due to undownloaded ebooks --- Obok_plugin/action.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Obok_plugin/action.py b/Obok_plugin/action.py index e4ef377d..af656ec1 100644 --- a/Obok_plugin/action.py +++ b/Obok_plugin/action.py @@ -374,7 +374,11 @@ def decryptBook(self, book): result['success'] = False result['fileobj'] = None - zin = zipfile.ZipFile(book.filename, 'r') + try: + zin = zipfile.ZipFile(book.filename, 'r') + except FileNotFoundError: + print(_("File not found. Make sure that the ebook has been properly downloaded in the Kobo app. ("), book.filename, _(")")) + return result #print ('Kobo library filename: {0}'.format(book.filename)) for userkey in self.userkeys: print (_('Trying key: '), codecs.encode(userkey, 'hex')) From 2cd2792306d4e10632856e0b5803fb63c835a236 Mon Sep 17 00:00:00 2001 From: precondition <57645186+precondition@users.noreply.github.com> Date: Fri, 11 Aug 2023 17:48:42 +0200 Subject: [PATCH 146/154] Obok.py/action.py: invoke _() only once --- Obok_plugin/action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Obok_plugin/action.py b/Obok_plugin/action.py index af656ec1..36562af5 100644 --- a/Obok_plugin/action.py +++ b/Obok_plugin/action.py @@ -377,7 +377,7 @@ def decryptBook(self, book): try: zin = zipfile.ZipFile(book.filename, 'r') except FileNotFoundError: - print(_("File not found. Make sure that the ebook has been properly downloaded in the Kobo app. ("), book.filename, _(")")) + print (_('{0} - File "{1}" not found. Make sure the eBook has been properly downloaded in the Kobo app.').format(PLUGIN_NAME, book.filename)) return result #print ('Kobo library filename: {0}'.format(book.filename)) for userkey in self.userkeys: From 808dc7d29a0250ca90647ec593ec6ca3bce91df5 Mon Sep 17 00:00:00 2001 From: Josh Cotton Date: Sun, 10 Nov 2024 05:14:59 -0800 Subject: [PATCH 147/154] Fix Obok import in Calibre flatpak by using /sys/class/net/IFACE/address instead of `ip` (#586) Fix #585. Use /sys/class/net/IFACE/address for the MAC address instead of the ip command. --- Obok_plugin/obok/obok.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Obok_plugin/obok/obok.py b/Obok_plugin/obok/obok.py index 603e7739..a8379b1c 100644 --- a/Obok_plugin/obok/obok.py +++ b/Obok_plugin/obok/obok.py @@ -449,9 +449,15 @@ def __getmacaddrs (self): for m in matches: # print "m:{0}".format(m[0]) macaddrs.append(m[0].upper()) + elif sys.platform.startswith('linux'): + for interface in os.listdir('/sys/class/net'): + with open('/sys/class/net/' + interface + '/address', 'r') as f: + mac = f.read().strip().upper() + # some interfaces, like Tailscale's VPN interface, do not have a MAC address + if mac != '': + macaddrs.append(mac) else: - # probably linux - + # final fallback # let's try ip c = re.compile('\s(' + '[0-9a-f]{2}:' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) for line in os.popen('ip -br link'): From 65646f4493a5369345aa60fe419e95a99fcdcb8f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 14:25:35 +0100 Subject: [PATCH 148/154] Fix CI --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index af937d3e..9ddd8a13 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: run: python3 make_release.py - name: Upload - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: plugin path: | From 815d86efe06399f04b1d503bd6679d116182346c Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 14:36:27 +0100 Subject: [PATCH 149/154] Update changelog --- CHANGELOG.md | 4 ++++ DeDRM_plugin/ion.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c39fc95a..9565d520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,4 +105,8 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix some bugs (Python 2 and Python 3) in erdr2pml.py (untested). - Fix file lock bug in androidkindlekey.py on Windows with Calibre >= 7 (untested). - A bunch of updates to the external FileOpen ineptpdf script, might fix #442 (untested). +- Fix exception handling on decrypt in ion.py (#662, thanks @C0rn3j). +- Fix SHA1 hash function for erdr2pml.py script (#608, thanks @unwiredben). +- Make Kobo DRM removal not fail when there are undownloaded ebooks (#384, thanks @precondition). +- Fix Obok import failing in Calibre flatpak due to missing ip command (#586 and #585, thanks @jcotton42). diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 36c542ee..d89d54e1 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# -*- coding: utf-8 -*- + """ion.py: Decrypt Kindle KFX files. Revision history: From 501a1e6d31614200f21950e7a3db8eb612e9bc2f Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 14:41:38 +0100 Subject: [PATCH 150/154] Update obok readme to include wmic requirement (fixes #670) --- obok_plugin_ReadMe.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/obok_plugin_ReadMe.txt b/obok_plugin_ReadMe.txt index 2993e972..df97e631 100644 --- a/obok_plugin_ReadMe.txt +++ b/obok_plugin_ReadMe.txt @@ -8,6 +8,8 @@ Installation ------------ Open calibre's Preferences dialog. Click on the "Plugins" button. Next, click on the button, "Load plugin from file". Navigate to the unzipped DeDRM_tools folder, find the file "obok_plugin.zip". Click to select the file and select "Open". Click "Yes" in the "Are you sure?" dialog box. Click the "OK" button in the "Success" dialog box. +Note: This plugin requires the "wmic" component on Windows. On Windows 10 and below this will be available by default, on Windows 11 it needs to be explicitly enabled. Make sure that on your Windows 11 machine, under Settings -> System -> Optional features -> Add an optional feature -> View features, "WMIC" is enabled / activated, otherwise this plugin may not work correctly. + Customization ------------- @@ -16,7 +18,6 @@ No customization is required, except choosing which menus will show the plugin. Using the plugin ---------------- - Select the plugin's menu or icon from whichever part of the calibre interface you have chosen to have it. Follow the instructions in the dialog that appears. @@ -29,5 +30,5 @@ If you find that the DeDRM plugin is not working for you (imported ebooks still - Once calibre has re-started, import the problem ebook. - Now close calibre. -A log will appear that you can copy and paste into a comment at Apprentice Alf's blog, http://apprenticealf.wordpress.com/ or an issue at Apprentice Harper's repository, https://github.com/apprenticeharper/DeDRM_tools/issues . You should also give details of your computer, and how you obtained the ebook file. +A log will appear that you can copy and paste into a GitHub issue at noDRM's repository, https://github.com/noDRM/DeDRM_tools/issues . You should also give details of your computer, and how you obtained the ebook file. From c5ee327a6073f00f27b9e073bfe4ca79dfc50555 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 14:44:57 +0100 Subject: [PATCH 151/154] Add note about key import/export for K4PC in the help file (fixes #663) --- DeDRM_plugin/DeDRM_Kindle for Mac and PC Key_Help.htm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DeDRM_plugin/DeDRM_Kindle for Mac and PC Key_Help.htm b/DeDRM_plugin/DeDRM_Kindle for Mac and PC Key_Help.htm index 77f6136f..44c286e7 100644 --- a/DeDRM_plugin/DeDRM_Kindle for Mac and PC Key_Help.htm +++ b/DeDRM_plugin/DeDRM_Kindle for Mac and PC Key_Help.htm @@ -22,6 +22,8 @@

      Managing Kindle for Mac/PC Keys

      If you have upgraded from an earlier version of the plugin, any existing Kindle for Mac/PC keys will have been automatically imported, so you might not need to do any more configuration. In addition, on Windows and Mac, the default Kindle for Mac/PC key is added the first time the plugin is run. Continue reading for key generation and management instructions.

      +

      Note that for best results, you should run Calibre / this plugin on the same machine where Kindle 4 PC / Kindle 4 Mac is running. It is possible to export/import the keys to another machine, but this may not always work, particularly with the newer DRM versions.

      +

      Creating New Keys:

      On the right-hand side of the plugin’s customization dialog, you will see a button with an icon that looks like a green plus sign (+). Clicking this button will open a new dialog prompting you to enter a key name for the default Kindle for Mac/PC key.

      From de3d91f5e53807aa8e029e49b40d4cead3deee79 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 15:21:09 +0100 Subject: [PATCH 152/154] Don't repack EPUB if nothing has changed --- CHANGELOG.md | 1 + DeDRM_plugin/__init__.py | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9565d520..569d9821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -109,4 +109,5 @@ This is v10.0.9, a release candidate for v10.1.0. I don't expect there to be maj - Fix SHA1 hash function for erdr2pml.py script (#608, thanks @unwiredben). - Make Kobo DRM removal not fail when there are undownloaded ebooks (#384, thanks @precondition). - Fix Obok import failing in Calibre flatpak due to missing ip command (#586 and #585, thanks @jcotton42). +- Don't re-pack EPUB if there's no DRM to remove and no postprocessing done (fixes #555). diff --git a/DeDRM_plugin/__init__.py b/DeDRM_plugin/__init__.py index 983ecc80..82001227 100644 --- a/DeDRM_plugin/__init__.py +++ b/DeDRM_plugin/__init__.py @@ -216,12 +216,16 @@ def initialize(self): traceback.print_exc() raise - def postProcessEPUB(self, path_to_ebook): + def postProcessEPUB(self, path_to_ebook, path_to_original_ebook = None): # This is called after the DRM is removed (or if no DRM was present) # It does stuff like de-obfuscating fonts (by calling checkFonts) # or removing watermarks. postProcessStart = time.time() + postProcessingNeeded = False + + # Save a backup of the EPUB path after DRM removal but before any postprocessing is done. + pre_postprocessing_EPUB_path = path_to_ebook try: import prefs @@ -248,6 +252,15 @@ def postProcessEPUB(self, path_to_ebook): postProcessEnd = time.time() print("{0} v{1}: Post-processing took {2:.1f} seconds".format(PLUGIN_NAME, PLUGIN_VERSION, postProcessEnd-postProcessStart)) + + # If the EPUB is DRM-free (path_to_original_ebook will only be set in this case), + # and the post-processing hasn't changed anything in the EPUB, + # return the raw original file from path_to_original_ebook from before the + # zipfix code was executed. + if ((path_to_ebook == pre_postprocessing_EPUB_path) and path_to_original_ebook is not None): + print("{0} v{1}: Post-processing didn't do anything on DRM-free EPUB, returning original file".format(PLUGIN_NAME, PLUGIN_VERSION)) + return path_to_original_ebook + return path_to_ebook except: @@ -299,9 +312,9 @@ def ePubDecrypt(self,path_to_ebook): # import the LCP handler import lcpdedrm - if (lcpdedrm.isLCPbook(path_to_ebook)): + if (lcpdedrm.isLCPbook(inf.name)): try: - retval = lcpdedrm.decryptLCPbook(path_to_ebook, dedrmprefs['lcp_passphrases'], self) + retval = lcpdedrm.decryptLCPbook(inf.name, dedrmprefs['lcp_passphrases'], self) except: print("Looks like that didn't work:") raise @@ -628,7 +641,7 @@ def ePubDecrypt(self,path_to_ebook): # Not a Barnes & Noble nor an Adobe Adept # Probably a DRM-free EPUB, but we should still check for fonts. - return self.postProcessEPUB(inf.name) + return self.postProcessEPUB(inf.name, path_to_ebook) def PDFIneptDecrypt(self, path_to_ebook): From bde82fd7abf4e74e4852490d52e3b926eede1b2a Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 16:10:29 +0100 Subject: [PATCH 153/154] Fix python2 support for ion.py --- DeDRM_plugin/ion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index d89d54e1..2f57d76b 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -1348,7 +1348,7 @@ def decryptvoucher(self): process_V4648(shared), process_V5683(shared)] decrypted=False - lastexception: Exception | None = None + lastexception = None # type: Exception | None for sharedsecret in sharedsecrets: key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest() aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16]) From 7379b453199ed1ba91bf3a4ce4875d5ed3c309a9 Mon Sep 17 00:00:00 2001 From: NoDRM Date: Sun, 10 Nov 2024 20:15:33 +0100 Subject: [PATCH 154/154] Remove future import from ion.py --- DeDRM_plugin/ion.py | 1 - 1 file changed, 1 deletion(-) diff --git a/DeDRM_plugin/ion.py b/DeDRM_plugin/ion.py index 2f57d76b..33a2b053 100644 --- a/DeDRM_plugin/ion.py +++ b/DeDRM_plugin/ion.py @@ -15,7 +15,6 @@ Copyright © 2013-2020 Apprentice Harper et al. """ -from __future__ import annotations import collections import hashlib