我们从Python开源项目中,提取了以下50个代码示例,用于说明如何使用imp.get_magic()。
def importfile(path): """Import a Python source file or compiled file given its path.""" magic = imp.get_magic() file = open(path, 'r') if file.read(len(magic)) == magic: kind = imp.PY_COMPILED else: kind = imp.PY_SOURCE file.close() filename = os.path.basename(path) name, ext = os.path.splitext(filename) file = open(path, 'r') try: module = imp.load_module(name, file, path, (ext, 'r', kind)) except: raise ErrorDuringImport(path, sys.exc_info()) file.close() return module
def _write_pyc(state, co, source_stat, pyc): # Technically, we don't have to have the same pyc format as # (C)Python, since these "pycs" should never be seen by builtin # import. However, there's little reason deviate, and I hope # sometime to be able to use imp.load_compiled to load them. (See # the comment in load_module above.) try: fp = open(pyc, "wb") except IOError: err = sys.exc_info()[1].errno state.trace("error writing pyc file at %s: errno=%s" %(pyc, err)) # we ignore any failure to write the cache file # there are many reasons, permission-denied, __pycache__ being a # file etc. return False try: fp.write(imp.get_magic()) mtime = int(source_stat.mtime) size = source_stat.size & 0xFFFFFFFF fp.write(struct.pack("<ll", mtime, size)) marshal.dump(co, fp) finally: fp.close() return True
def __init__(self, source, bc={}): """Initialize mock. 'bc' is a dict keyed on a module's name. The value is dict with possible keys of 'path', 'mtime', 'magic', and 'bc'. Except for 'path', each of those keys control if any part of created bytecode is to deviate from default values. """ super().__init__(source) self.module_bytecode = {} self.path_to_bytecode = {} self.bytecode_to_path = {} for name, data in bc.items(): self.path_to_bytecode[data['path']] = name self.bytecode_to_path[name] = data['path'] magic = data.get('magic', imp.get_magic()) mtime = importlib._w_long(data.get('mtime', self.default_mtime)) if 'bc' in data: bc = data['bc'] else: bc = self.compile_bc(name) self.module_bytecode[name] = magic + mtime + bc
def importfile(path): """Import a Python source file or compiled file given its path.""" magic = imp.get_magic() with open(path, 'rb') as file: if file.read(len(magic)) == magic: kind = imp.PY_COMPILED else: kind = imp.PY_SOURCE file.seek(0) filename = os.path.basename(path) name, ext = os.path.splitext(filename) try: module = imp.load_module(name, file, path, (ext, 'r', kind)) except: raise ErrorDuringImport(path, sys.exc_info()) return module
def __init__(self, source, bc={}): """Initialize mock. 'bc' is a dict keyed on a module's name. The value is dict with possible keys of 'path', 'mtime', 'magic', and 'bc'. Except for 'path', each of those keys control if any part of created bytecode is to deviate from default values. """ super().__init__(source) self.module_bytecode = {} self.path_to_bytecode = {} self.bytecode_to_path = {} for name, data in bc.items(): self.path_to_bytecode[data['path']] = name self.bytecode_to_path[name] = data['path'] magic = data.get('magic', imp.get_magic()) mtime = importlib._w_long(data.get('mtime', self.default_mtime)) source_size = importlib._w_long(len(self.source) & 0xFFFFFFFF) if 'bc' in data: bc = data['bc'] else: bc = self.compile_bc(name) self.module_bytecode[name] = magic + mtime + source_size + bc
def _make_pyc(code): """ Turn a bytecode object back into an open file representing a '.pyc' file. Uses the spec laid out at : http://bob.pythonmac.org/archives/2005/03/24/pycs-eggs-and-zipimport/ It uses the magic number from the ``imp`` module, and four null bytes to represent the modification time of the bytecode file. """ n = tempfile.mktemp() t = open(n, 'w+b') t.write(imp.get_magic() + chr(0) * 4 + marshal.dumps(code)) t.seek(0) _file_array.append((n, t)) return t
def test_basic(self): """Basic test of magic numbers""" current = imp.get_magic() if hasattr(sys, 'version_info'): version = '.'.join([str(v) for v in sys.version_info[0:3]]) if IS_PYPY: version += 'pypy' self.assertTrue(version in magics.magics.keys(), "version %s is not in magic.magics.keys: %s" % (version, magics.magics.keys())) self.assertEqual(current, magics.int2magic(magics.magic2int(current))) lookup = str(PYTHON_VERSION) if IS_PYPY: lookup += 'pypy' self.assertTrue(lookup in magics.magics.keys(), "PYTHON VERSION %s is not in magic.magics.keys: %s" % (lookup, magics.magics.keys())) self.assertEqual(magics.sysinfo2magic(), current, "magic from imp.get_magic() should be sysinfo2magic()")
def extract(binary): ''' Extract a code object from a binary pyc file. :param binary: a sequence of bytes from a pyc file. ''' if len(binary) <= 8: raise Exception("Binary pyc must be greater than 8 bytes (got %i)" % len(binary)) magic = binary[:4] MAGIC = get_magic() if magic != MAGIC: raise Exception("Python version mismatch (%r != %r) Is this a pyc file?" % (magic, MAGIC)) modtime = time.asctime(time.localtime(struct.unpack('i', binary[4:8])[0])) code = marshal.loads(binary[8:]) return modtime, code
def read_code(stream): # This helper is needed in order for the PEP 302 emulation to # correctly handle compiled files import marshal magic = stream.read(4) if magic != imp.get_magic(): return None stream.read(4) # Skip timestamp return marshal.load(stream)
def load_module(self, fqname, fp, pathname, file_info): suffix, mode, type = file_info self.msgin(2, "load_module", fqname, fp and "fp", pathname) if type == imp.PKG_DIRECTORY: m = self.load_package(fqname, pathname) self.msgout(2, "load_module ->", m) return m if type == imp.PY_SOURCE: co = compile(fp.read()+'\n', pathname, 'exec') elif type == imp.PY_COMPILED: if fp.read(4) != imp.get_magic(): self.msgout(2, "raise ImportError: Bad magic number", pathname) raise ImportError, "Bad magic number in %s" % pathname fp.read(4) co = marshal.load(fp) else: co = None m = self.add_module(fqname) m.__file__ = pathname if co: if self.replace_paths: co = self.replace_paths_in_code(co) m.__code__ = co self.scan_code(co, m) self.msgout(2, "load_module ->", m) return m
def _read_pyc(source, pyc, trace=lambda x: None): """Possibly read a pytest pyc containing rewritten code. Return rewritten code if successful or None if not. """ try: fp = open(pyc, "rb") except IOError: return None with fp: try: mtime = int(source.mtime()) size = source.size() data = fp.read(12) except EnvironmentError as e: trace('_read_pyc(%s): EnvironmentError %s' % (source, e)) return None # Check for invalid or out of date pyc file. if (len(data) != 12 or data[:4] != imp.get_magic() or struct.unpack("<ll", data[4:]) != (mtime, size)): trace('_read_pyc(%s): invalid or out of date pyc' % source) return None try: co = marshal.load(fp) except Exception as e: trace('_read_pyc(%s): marshal.load error %s' % (source, e)) return None if not isinstance(co, types.CodeType): trace('_read_pyc(%s): not a code object' % source) return None return co
def read_pyc(filename): """ Read the code inside a bytecode compiled file if the MAGIC number is compatible Returns: a code object """ data = read_file(filename, 'rb') if not is_gae and data[:4] != imp.get_magic(): raise SystemError('compiled code is incompatible') return marshal.loads(data[marshal_header_size:])
def compile_pyc(self, output_file): '''[py] Compile the program into a Python bytecode file.''' import imp import marshal output_file.write(imp.get_magic()) output_file.write('\x00\x00\x00\x00') pyc = self.to_pyc() pyo = pyc.to_code() marshal.dump(pyo, output_file)
def make_code_from_pyc(filename): """Get a code object from a .pyc file.""" try: fpyc = open(filename, "rb") except IOError: raise NoCode("No file to run: %r" % filename) try: # First four bytes are a version-specific magic number. It has to # match or we won't run the file. magic = fpyc.read(4) if magic != imp.get_magic(): raise NoCode("Bad magic number in .pyc file") # Skip the junk in the header that we don't need. fpyc.read(4) # Skip the moddate. if sys.version_info >= (3, 3): # 3.3 added another long to the header (size), skip it. fpyc.read(4) # The rest of the file is the code object we want. code = marshal.load(fpyc) finally: fpyc.close() return code
def read_pyc(filename): """ Read the code inside a bytecode compiled file if the MAGIC number is compatible Returns: a code object """ data = read_file(filename, 'rb') if not is_gae and data[:4] != imp.get_magic(): raise SystemError('compiled code is incompatible') return marshal.loads(data[8:])
def test_bad_magic(self): # When the magic number is different, the bytecode should be # regenerated. def test(name, mapping, bytecode_path): self.import_(mapping[name], name) with open(bytecode_path, 'rb') as bytecode_file: self.assertEqual(bytecode_file.read(4), imp.get_magic()) self._test_bad_magic(test)
def __init__(self, path, magic=imp.get_magic()): super().__init__(path) self.bytecode_path = imp.cache_from_source(self.path) data = bytearray(magic) data.extend(marshal._w_long(self.source_mtime)) code_object = compile(self.source, self.path, 'exec', dont_inherit=True) data.extend(marshal.dumps(code_object)) self.bytecode = bytes(data) self.written = {}
def verify_bytecode(self, mock, name): assert name in mock.module_paths self.assertIn(name, mock.module_bytecode) magic = mock.module_bytecode[name][:4] self.assertEqual(magic, imp.get_magic()) mtime = importlib._r_long(mock.module_bytecode[name][4:8]) self.assertEqual(mtime, 1) bc = mock.module_bytecode[name][8:] self.assertEqual(bc, mock.compile_bc(name))
def test_different_magic(self): # A different magic number should lead to new bytecode. name = 'mod' bad_magic = b'\x00\x00\x00\x00' assert bad_magic != imp.get_magic() mock = PyPycLoaderMock({name: os.path.join('path', 'to', 'mod')}, {name: {'path': os.path.join('path', 'to', 'mod.bytecode'), 'magic': bad_magic}}) with util.uncache(name): mock.load_module(name) self.assertTrue(name in mock.module_bytecode) magic = mock.module_bytecode[name][:4] self.assertEqual(magic, imp.get_magic())
def load_module(self, fqname, fp, pathname, file_info): suffix, mode, type = file_info self.msgin(2, "load_module", fqname, fp and "fp", pathname) if type == imp.PKG_DIRECTORY: m = self.load_package(fqname, pathname) self.msgout(2, "load_module ->", m) return m if type == imp.PY_SOURCE: co = compile(fp.read()+'\n', pathname, 'exec') elif type == imp.PY_COMPILED: if fp.read(4) != imp.get_magic(): self.msgout(2, "raise ImportError: Bad magic number", pathname) raise ImportError("Bad magic number in %s" % pathname) fp.read(4) co = marshal.load(fp) else: co = None m = self.add_module(fqname) m.__file__ = pathname if co: if self.replace_paths: co = self.replace_paths_in_code(co) m.__code__ = co self.scan_code(co, m) self.msgout(2, "load_module ->", m) return m
def make_pyc(co, mtime): data = marshal.dumps(co) if type(mtime) is type(0.0): # Mac mtimes need a bit of special casing if mtime < 0x7fffffff: mtime = int(mtime) else: mtime = int(-0x100000000 + int(mtime)) pyc = imp.get_magic() + struct.pack("<i", int(mtime)) + data return pyc
def data(self): with open(self.bc_path, 'rb') as file: data = file.read(8) mtime = int(os.stat(self.source_path).st_mtime) compare = struct.pack('<4sl', imp.get_magic(), mtime) return data, compare
def _get_module(): del globals()['_get_module'] import imp import base64 import marshal magic = imp.get_magic() if magic == b'O\x0c\r\n': # Python 3.1 pycData = b'TwwNChNz/FRjAAAAAAAAAAAAAAAABAAAAEAAAABzdAAAAGQAAGQBAGwAAFoAAEdkAgCEAABkAwCD\nAgBaAQBkBABkBQCEAQBaAgBkBgCEAABaAwBkBwCEAABaBABkCACEAABaBQBkCQCEAABaBgBkAABl\nBQBfBwBkCgBlBQBfCABkAABlBgBfBwBkCgBlBgBfCABkAQBTKAsAAABpAAAAAE5jAQAAAAAAAAAB\nAAAAAwAAAEIAAABzXwAAAHwAAEVlAABaAQBlAgCDAABpAABkAACEAgBaAwBkAQCEAABaBABkAgCE\nAABaBQBkAwCEAABaBgBkBACEAABaBwBkBQCEAABaCABkBgCEAABaCQBkBwCEAABaCgBkCABTKAkA\nAABjAwAAAAAAAAADAAAAAgAAAEMAAABzFgAAAHwBAHwAAF8AAHwCAHwAAF8BAGQAAFMoAQAAAE4o\nAgAAAHUBAAAARHUBAAAAZigDAAAAdQQAAABzZWxmdQYAAABsYWJlbHN1CAAAAGZ1bmN0aW9uKAAA\nAAAoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQgAAABfX2lu\naXRfXwUAAABzBAAAAAABCQFjAgAAAAAAAAACAAAAAgAAAEMAAABzHgAAAHwBAHwAAGoAAGsGAHIa\nAHwAAGoAAHwBABlTZAEAUygCAAAATmkAAAAAKAEAAAB1AQAAAGYoAgAAAHUBAAAAdnUBAAAAaygA\nAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXULAAAAX19n\nZXRpdGVtX18JAAAAcwAAAABjAwAAAAAAAAADAAAABAAAAEMAAABzFQAAAHQAAAR8AABqAQB8AQA8\nfQIAZAAAUygBAAAATigCAAAAdQgAAABfc2V0aXRlbXUBAAAAZigDAAAAdQEAAAB2dQEAAABrdQMA\nAAB2YWwoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1\nCwAAAF9fc2V0aXRlbV9fCgAAAHMAAAAAYwEAAAAAAAAAAQAAAAIAAABDAAAAcwgAAABkAQB8AAAU\nUygCAAAATmn/////KAAAAAAoAQAAAHUBAAAAdigAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9w\ncml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX19uZWdfXwsAAABzAAAAAGMCAAAAAAAAAAIAAAAE\nAAAAAwAAAHMpAAAAdAAAfAAAagEAhwAAZgEAZAEAhgAAfAAAagIAagMAgwAARIMBAIMCAFMoAgAA\nAE5jAQAAAAAAAAADAAAABAAAABMAAABzIwAAAGkAAHwAAF0ZAFwCAH0BAH0CAIgAAHwCABR8AQCT\nAgBxBgBTKAAAAAAoAAAAACgDAAAAdQIAAAAuMHUBAAAAa3UBAAAAeCgBAAAAdQUAAABhbHBoYSgA\nAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1CgAAADxkaWN0Y29t\ncD4MAAAAcwIAAAAJACgEAAAAdQQAAABfVmVjdQEAAABEdQEAAABmdQUAAABpdGVtcygCAAAAdQEA\nAAB2dQUAAABhbHBoYSgAAAAAKAEAAAB1BQAAAGFscGhhdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0\nZS9pbmRlcGVuZGVuY2UucHl1CAAAAF9fcm11bF9fDAAAAHMAAAAAYwIAAAAAAAAAAgAAAAMAAAAD\nAAAAcz0AAAB0AACIAQB0AQCDAgByNQB0AgCHAQCHAABmAgBkAQCGAACIAABqAwBqBACDAABEgwEA\ngwEAU3QFAFNkAABTKAIAAABOYwEAAAAAAAAAAgAAAAUAAAATAAAAcyIAAABnAAB8AABdGAB9AQCI\nAQB8AQAZiAAAfAEAGRSRAgBxBgBTKAAAAAAoAAAAACgCAAAAdQIAAAAuMHUBAAAAaygCAAAAdQUA\nAABvdGhlcnUEAAAAc2VsZigAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVu\nY2UucHl1CgAAADxsaXN0Y29tcD4RAAAAcwIAAAAJACgGAAAAdQoAAABpc2luc3RhbmNldQQAAABf\nVmVjdQMAAABzdW11AQAAAGZ1BAAAAGtleXN1DgAAAE5vdEltcGxlbWVudGVkKAIAAAB1BAAAAHNl\nbGZ1BQAAAG90aGVyKAAAAAAoAgAAAHUEAAAAc2VsZnUFAAAAb3RoZXJ1JAAAAC4uL3Jlc291cmNl\ncy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX19tdWxfXw4AAABzBgAAAAACDwEmAmMCAAAA\nAAAAAAIAAAAFAAAAAwAAAHNEAAAAdAAAiAAAagEAhwAAhwEAZgIAZAEAhgAAdAIAiAAAagMAagQA\ngwAAgwEAagUAiAEAagMAagQAgwAAgwEARIMBAIMCAFMoAgAAAE5jAQAAAAAAAAACAAAABQAAABMA\nAABzJQAAAGkAAHwAAF0bAH0BAIgAAHwBABmIAQB8AQAZF3wBAJMCAHEGAFMoAAAAACgAAAAAKAIA\nAAB1AgAAAC4wdQEAAABrKAIAAAB1AQAAAHV1AQAAAHYoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3By\naXZhdGUvaW5kZXBlbmRlbmNlLnB5dQoAAAA8ZGljdGNvbXA+FQAAAHMCAAAACQAoBgAAAHUEAAAA\nX1ZlY3UBAAAARHUDAAAAc2V0dQEAAABmdQQAAABrZXlzdQUAAAB1bmlvbigCAAAAdQEAAAB1dQEA\nAAB2KAAAAAAoAgAAAHUBAAAAdXUBAAAAdnUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBl\nbmRlbmNlLnB5dQcAAABfX2FkZF9fFQAAAHMAAAAAYwIAAAAAAAAAAgAAAAIAAABDAAAAcwkAAAB8\nAAB8AQALF1MoAQAAAHU0AAAAUmV0dXJucyBhIHZlY3RvciB3aGljaCBpcyB0aGUgZGlmZmVyZW5j\nZSBvZiBhIGFuZCBiLigAAAAAKAIAAAB1AQAAAGF1AQAAAGIoAAAAACgAAAAAdSQAAAAuLi9yZXNv\ndXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1BwAAAF9fc3ViX18XAAAAcwIAAAAAAk4oCwAA\nAHUIAAAAX19uYW1lX191CgAAAF9fbW9kdWxlX191AwAAAHNldHUIAAAAX19pbml0X191CwAAAF9f\nZ2V0aXRlbV9fdQsAAABfX3NldGl0ZW1fX3UHAAAAX19uZWdfX3UIAAAAX19ybXVsX191BwAAAF9f\nbXVsX191BwAAAF9fYWRkX191BwAAAF9fc3ViX18oAQAAAHUKAAAAX19sb2NhbHNfXygAAAAAKAAA\nAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUEAAAAX1ZlYwQAAABz\nEAAAAAoBEgQJAQkBCQEJAgkHCQJ1BAAAAF9WZWNnmyuhhpuEBj1jAgAAAAAAAAAFAAAABgAAAEMA\nAABzbAAAAGcAAH0CAHhZAHwAAERdUQB9AwB4KAB8AgBEXSAAfQQAfAMAfAMAfAQAFHwEAHwEABQb\nfAQAFBh9AwBxGgBXfAMAfAMAFHwBAGsEAHINAHwCAGoAAHwDAIMBAAFxDQBxDQBXdAEAfAIAgwEA\nUygBAAAATigCAAAAdQYAAABhcHBlbmR1AwAAAGxlbigFAAAAdQEAAABMdQMAAABlcHN1CQAAAHZz\ndGFybGlzdHUBAAAAdnUFAAAAdnN0YXIoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0\nZS9pbmRlcGVuZGVuY2UucHl1BwAAAF9SX3JhbmsbAAAAcxIAAAAAAQYBBwAGAQcABgEeARAAFAFj\nAQAAAAAAAAAGAAAABQAAAAMAAABztAAAAHQAAHQBAHQCAIgBAIMBAIMBAIMBAH0BAGQBAH0CAHiP\nAIgBAGQBABlqAwBEXYAAiQAAhwAAhwEAZgIAZAIAhgAAfAEARIMBAH0DAHwDAGcAAGsDAHIsAHwD\nAGQBABl9BAB8AQBqBAB8BACDAQABfAIAZAMAN30CAHgxAHwDAGQDAGQAAIUCABlEXRwAfQUAiAEA\nfAUAGYgBAHwEABkXiAEAfAUAPHGJAFdxLABxLABXfAIAUygEAAAATmkAAAAAYwEAAAAAAAAAAgAA\nAAQAAAATAAAAcyoAAABnAAB8AABdIAB9AQCIAQB8AQAZiAAAGWQAAGsDAHIGAHwBAJECAHEGAFMo\nAQAAAGkAAAAAKAAAAAAoAgAAAHUCAAAALjB1AQAAAHIoAgAAAHUBAAAAY3UHAAAAcm93bGlzdCgA\nAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1CgAAADxsaXN0Y29t\ncD4nAAAAcwIAAAAJAGkBAAAAKAUAAAB1AwAAAHNldHUFAAAAcmFuZ2V1AwAAAGxlbnUBAAAARHUG\nAAAAcmVtb3ZlKAYAAAB1BwAAAHJvd2xpc3R1CQAAAHJvd3NfbGVmdHUBAAAAcnURAAAAcm93c193\naXRoX25vbnplcm91BQAAAHBpdm90dQkAAAByb3dfaW5kZXgoAAAAACgCAAAAdQEAAABjdQcAAABy\nb3dsaXN0dSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1CQAAAF9HRjJf\ncmFuayMAAABzGgAAAAABGAEGAQ4ABgEZAQwBCgENAQoBEQAGASEBYwEAAAAAAAAABAAAAAUAAABD\nAAAAc3EAAABkAQCEAAB8AABEgwEAfQEAeFoAfAAARF1SAH0CAHhJAHwCAGoAAGoBAIMAAERdOAB9\nAwB8AwBkAgBrAwByLQB0AgB8AwB0AwBqBACDAgByWwB0BQB8AQCDAQBTdAYAfAEAgwEAU3EtAFdx\nFwBXZAIAUygDAAAATmMBAAAAAAAAAAIAAAAFAAAAUwAAAHMlAAAAZwAAfAAAXRsAfQEAdAAAfAEA\nagEAfAEAagIAgwIAkQIAcQYAUygAAAAAKAMAAAB1BAAAAF9WZWN1AQAAAER1AQAAAGYoAgAAAHUC\nAAAALjB1AQAAAHUoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVu\nY2UucHl1CgAAADxsaXN0Y29tcD4xAAAAcwIAAAAJAGkAAAAAKAcAAAB1AQAAAGZ1BgAAAHZhbHVl\nc3UKAAAAaXNpbnN0YW5jZXUDAAAAR0YydQMAAABPbmV1CQAAAF9HRjJfcmFua3UHAAAAX1JfcmFu\naygEAAAAdQEAAABMdQIAAABMY3UBAAAAdnUBAAAAeCgAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNl\ncy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUFAAAAX3JhbmswAAAAcxQAAAAAARABBwAGARAABgEM\nARIBCgESAWMBAAAAAAAAAAEAAAAEAAAAQwAAAHM0AAAAdAAAfAAAdAEAdAIAZgIAgwIAcxsAdAMA\nggEAdAQABGoFAGQBADcCXwUAdAYAfAAAgwEAUygCAAAAdXACAABGaW5kcyB0aGUgcmFuayBvZiBh\nIGxpc3Qgb3Igc2V0IG9mIHZlY3RvcnMuCgogICAgQXJnczoKICAgICAgICBMOiBBIGxpc3Qgb3Ig\nc2V0IG9mIHZlY3RvcnMuCgogICAgUmV0dXJuczoKICAgICAgICB4OiBBIG5vbm5lZ2F0aXZlIGlu\ndGVnZXIuICBUaGUgcmFuayBvZiBMLgoKICAgIFJhaXNlczoKICAgICAgICBBc3NlcnRpb25FcnJv\ncjogQW4gZXJyb3Igb2NjdXJzIHdoZW4gTCBpcyBub3QgYSBsaXN0IG9yIHNldC4KCiAgICBFeGFt\ncGxlOgogICAgPj4+IGZyb20gdmVjIGltcG9ydCBWZWMKICAgID4+PiBhMCA9IFZlYyh7J2EnLCAn\nYicsICdjJywgJ2QnfSwgeydhJzogMX0pCiAgICA+Pj4gYTEgPSBWZWMoeydhJywgJ2InLCAnYycs\nICdkJ30sIHsnYic6IDF9KQogICAgPj4+IGEyID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7\nJ2MnOiAxfSkKICAgID4+PiBhMyA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwgeydhJzogMSwg\nJ2MnOiAzfSkKICAgID4+PiByYW5rKFthMCwgYTEsIGEyXSkKICAgIDMKICAgID4+PiByYW5rKHth\nMCwgYTIsIGEzfSkKICAgIDIKICAgID4+PiByYW5rKHthMCwgYTEsIGEzfSkKICAgIDMKICAgID4+\nPiByYW5rKFthMCwgYTEsIGEyLCBhM10pCiAgICAzCiAgICBpAQAAACgHAAAAdQoAAABpc2luc3Rh\nbmNldQQAAABsaXN0dQMAAABzZXR1DgAAAEFzc2VydGlvbkVycm9ydQQAAAByYW5rdQkAAABfX2Nh\nbGxzX191BQAAAF9yYW5rKAEAAAB1AQAAAEwoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJp\ndmF0ZS9pbmRlcGVuZGVuY2UucHl1BAAAAHJhbms6AAAAcwYAAAAAGxsBDwFjAQAAAAAAAAABAAAA\nBAAAAEMAAABzQAAAAHQAAHwAAHQBAHQCAGYCAIMCAHMbAHQDAIIBAHQEAARqBQBkAQA3Al8FAHQG\nAHwAAIMBAHQHAHwAAIMBAGsCAFMoAgAAAHXtAgAARGV0ZXJtaW5lcyBpZiBhIGxpc3Qgb3Igc2V0\nIG9mIHZlY3RvcnMgYXJlIGxpbmVhcmx5IGluZGVwZW5kZW50LgoKICAgIEFyZ3M6CiAgICAgICAg\nTDogQSBsaXN0IG9yIHNldCBvZiB2ZWN0b3JzLgoKICAgIFJldHVybnM6CiAgICAgICAgeDogQSBi\nb29sZWFuLiAgVHJ1ZSBpZiB0aGUgdmVjdG9ycyBpbiBMIGFyZSBsaW5lYXJseSBpbmRlcGVuZGVu\ndC4gIEZhbHNlCiAgICAgICAgb3RoZXJ3aXNlLgoKICAgIFJhaXNlczoKICAgICAgICBBc3NlcnRp\nb25FcnJvcjogQW4gZXJyb3Igb2NjdXJzIHdoZW4gTCBpcyBub3QgYSBsaXN0IG9yIHNldC4KCiAg\nICBFeGFtcGxlOgogICAgPj4+IGZyb20gdmVjIGltcG9ydCBWZWMKICAgID4+PiBhMCA9IFZlYyh7\nJ2EnLCAnYicsICdjJywgJ2QnfSwgeydhJzogMX0pCiAgICA+Pj4gYTEgPSBWZWMoeydhJywgJ2In\nLCAnYycsICdkJ30sIHsnYic6IDF9KQogICAgPj4+IGEyID0gVmVjKHsnYScsICdiJywgJ2MnLCAn\nZCd9LCB7J2MnOiAxfSkKICAgID4+PiBhMyA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwgeydh\nJzogMSwgJ2MnOiAzfSkKICAgID4+PiBpc19pbmRlcGVuZGVudChbYTAsIGExLCBhMl0pCiAgICBU\ncnVlCiAgICA+Pj4gaXNfaW5kZXBlbmRlbnQoe2EwLCBhMiwgYTN9KQogICAgRmFsc2UKICAgID4+\nPiBpc19pbmRlcGVuZGVudCh7YTAsIGExLCBhM30pCiAgICBUcnVlCiAgICA+Pj4gaXNfaW5kZXBl\nbmRlbnQoW2EwLCBhMSwgYTIsIGEzXSkKICAgIEZhbHNlCiAgICBpAQAAACgIAAAAdQoAAABpc2lu\nc3RhbmNldQQAAABsaXN0dQMAAABzZXR1DgAAAEFzc2VydGlvbkVycm9ydQ4AAABpc19pbmRlcGVu\nZGVudHUJAAAAX19jYWxsc19fdQUAAABfcmFua3UDAAAAbGVuKAEAAAB1AQAAAEwoAAAAACgAAAAA\ndSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1DgAAAGlzX2luZGVwZW5k\nZW50WQAAAHMGAAAAABwbAQ8BdQwAAABpbnN0cnVtZW50ZWQoCQAAAHUDAAAAR0YydQQAAABfVmVj\ndQcAAABfUl9yYW5rdQkAAABfR0YyX3Jhbmt1BQAAAF9yYW5rdQQAAAByYW5rdQ4AAABpc19pbmRl\ncGVuZGVudHUJAAAAX19jYWxsc19fdQsAAABfX3ZlcnNpb25fXygAAAAAKAAAAAAoAAAAAHUkAAAA\nLi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQgAAAA8bW9kdWxlPgIAAABzFAAA\nAAwCEBcMCAkNCQoJHwkgCQEJAQkB\n' offset = 8 elif magic == b'l\x0c\r\n': # Python 3.2 pycData = b'bAwNChNz/FRjAAAAAAAAAAAAAAAAAwAAAEAAAABzdAAAAGQAAGQBAGwAAFoAAEdkAgCEAABkAwCD\nAgBaAQBkBABkBQCEAQBaAgBkBgCEAABaAwBkBwCEAABaBABkCACEAABaBQBkCQCEAABaBgBkAABl\nBQBfBwBkCgBlBQBfCABkAABlBgBfBwBkCgBlBgBfCABkAQBTKAsAAABpAAAAAE5jAQAAAAAAAAAB\nAAAAAwAAAEIAAABzXwAAAHwAAEVlAABaAQBlAgCDAABpAABkAACEAgBaAwBkAQCEAABaBABkAgCE\nAABaBQBkAwCEAABaBgBkBACEAABaBwBkBQCEAABaCABkBgCEAABaCQBkBwCEAABaCgBkCABTKAkA\nAABjAwAAAAAAAAADAAAAAgAAAEMAAABzFgAAAHwBAHwAAF8AAHwCAHwAAF8BAGQAAFMoAQAAAE4o\nAgAAAHUBAAAARHUBAAAAZigDAAAAdQQAAABzZWxmdQYAAABsYWJlbHN1CAAAAGZ1bmN0aW9uKAAA\nAAAoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQgAAABfX2lu\naXRfXwUAAABzBAAAAAABCQFjAgAAAAAAAAACAAAAAgAAAEMAAABzHgAAAHwBAHwAAGoAAGsGAHIa\nAHwAAGoAAHwBABlTZAEAUygCAAAATmkAAAAAKAEAAAB1AQAAAGYoAgAAAHUBAAAAdnUBAAAAaygA\nAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXULAAAAX19n\nZXRpdGVtX18JAAAAcwAAAABjAwAAAAAAAAADAAAABAAAAEMAAABzFQAAAHQAAAR8AABqAQB8AQA8\nfQIAZAAAUygBAAAATigCAAAAdQgAAABfc2V0aXRlbXUBAAAAZigDAAAAdQEAAAB2dQEAAABrdQMA\nAAB2YWwoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1\nCwAAAF9fc2V0aXRlbV9fCgAAAHMAAAAAYwEAAAAAAAAAAQAAAAIAAABDAAAAcwgAAABkAgB8AAAU\nUygDAAAATmkBAAAAaf////8oAAAAACgBAAAAdQEAAAB2KAAAAAAoAAAAAHUkAAAALi4vcmVzb3Vy\nY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQcAAABfX25lZ19fCwAAAHMAAAAAYwIAAAAAAAAA\nAgAAAAQAAAADAAAAcykAAAB0AAB8AABqAQCHAABmAQBkAQCGAAB8AABqAgBqAwCDAABEgwEAgwIA\nUygCAAAATmMBAAAAAAAAAAMAAAAEAAAAEwAAAHMjAAAAaQAAfAAAXRkAXAIAfQEAfQIAiAAAfAIA\nFHwBAJMCAHEGAFMoAAAAACgAAAAAKAMAAAB1AgAAAC4wdQEAAABrdQEAAAB4KAEAAAB1BQAAAGFs\ncGhhKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUKAAAAPGRp\nY3Rjb21wPgwAAABzAgAAAAkAKAQAAAB1BAAAAF9WZWN1AQAAAER1AQAAAGZ1BQAAAGl0ZW1zKAIA\nAAB1AQAAAHZ1BQAAAGFscGhhKAAAAAAoAQAAAHUFAAAAYWxwaGF1JAAAAC4uL3Jlc291cmNlcy9w\ncml2YXRlL2luZGVwZW5kZW5jZS5weXUIAAAAX19ybXVsX18MAAAAcwAAAABjAgAAAAAAAAACAAAA\nAwAAAAMAAABzPQAAAHQAAIgAAHQBAIMCAHI1AHQCAIcAAIcBAGYCAGQBAIYAAIgBAGoDAGoEAIMA\nAESDAQCDAQBTdAUAU2QAAFMoAgAAAE5jAQAAAAAAAAACAAAABQAAABMAAABzIgAAAGcAAHwAAF0Y\nAH0BAIgBAHwBABmIAAB8AQAZFJECAHEGAFMoAAAAACgAAAAAKAIAAAB1AgAAAC4wdQEAAABrKAIA\nAAB1BQAAAG90aGVydQQAAABzZWxmKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVw\nZW5kZW5jZS5weXUKAAAAPGxpc3Rjb21wPhEAAABzAgAAAAkAKAYAAAB1CgAAAGlzaW5zdGFuY2V1\nBAAAAF9WZWN1AwAAAHN1bXUBAAAAZnUEAAAAa2V5c3UOAAAATm90SW1wbGVtZW50ZWQoAgAAAHUE\nAAAAc2VsZnUFAAAAb3RoZXIoAAAAACgCAAAAdQUAAABvdGhlcnUEAAAAc2VsZnUkAAAALi4vcmVz\nb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQcAAABfX211bF9fDgAAAHMGAAAAAAIPASYC\nYwIAAAAAAAAAAgAAAAUAAAADAAAAc0QAAAB0AACIAABqAQCHAACHAQBmAgBkAQCGAAB0AgCIAABq\nAwBqBACDAACDAQBqBQCIAQBqAwBqBACDAACDAQBEgwEAgwIAUygCAAAATmMBAAAAAAAAAAIAAAAF\nAAAAEwAAAHMlAAAAaQAAfAAAXRsAfQEAiAAAfAEAGYgBAHwBABkXfAEAkwIAcQYAUygAAAAAKAAA\nAAAoAgAAAHUCAAAALjB1AQAAAGsoAgAAAHUBAAAAdXUBAAAAdigAAAAAdSQAAAAuLi9yZXNvdXJj\nZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1CgAAADxkaWN0Y29tcD4VAAAAcwIAAAAJACgGAAAA\ndQQAAABfVmVjdQEAAABEdQMAAABzZXR1AQAAAGZ1BAAAAGtleXN1BQAAAHVuaW9uKAIAAAB1AQAA\nAHV1AQAAAHYoAAAAACgCAAAAdQEAAAB1dQEAAAB2dSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9p\nbmRlcGVuZGVuY2UucHl1BwAAAF9fYWRkX18VAAAAcwAAAABjAgAAAAAAAAACAAAAAgAAAEMAAABz\nCQAAAHwAAHwBAAsXUygBAAAAdTQAAABSZXR1cm5zIGEgdmVjdG9yIHdoaWNoIGlzIHRoZSBkaWZm\nZXJlbmNlIG9mIGEgYW5kIGIuKAAAAAAoAgAAAHUBAAAAYXUBAAAAYigAAAAAKAAAAAB1JAAAAC4u\nL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX19zdWJfXxcAAABzAgAAAAAC\nTigLAAAAdQgAAABfX25hbWVfX3UKAAAAX19tb2R1bGVfX3UDAAAAc2V0dQgAAABfX2luaXRfX3UL\nAAAAX19nZXRpdGVtX191CwAAAF9fc2V0aXRlbV9fdQcAAABfX25lZ19fdQgAAABfX3JtdWxfX3UH\nAAAAX19tdWxfX3UHAAAAX19hZGRfX3UHAAAAX19zdWJfXygBAAAAdQoAAABfX2xvY2Fsc19fKAAA\nAAAoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQQAAABfVmVj\nBAAAAHMQAAAACgESBAkBCQEJAQkCCQcJAnUEAAAAX1ZlY2ebK6GGm4QGPWMCAAAAAAAAAAUAAAAG\nAAAAQwAAAHNsAAAAZwAAfQIAeFkAfAAARF1RAH0DAHgoAHwCAERdIAB9BAB8AwB8AwB8BAAUfAQA\nfAQAFBt8BAAUGH0DAHEaAFd8AwB8AwAUfAEAawQAcg0AfAIAagAAfAMAgwEAAXENAHENAFd0AQB8\nAgCDAQBTKAEAAABOKAIAAAB1BgAAAGFwcGVuZHUDAAAAbGVuKAUAAAB1AQAAAEx1AwAAAGVwc3UJ\nAAAAdnN0YXJsaXN0dQEAAAB2dQUAAAB2c3RhcigAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9w\ncml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX1JfcmFuaxsAAABzDgAAAAABBgENAQ0BHgEQABQB\nYwEAAAAAAAAABgAAAAUAAAADAAAAc7QAAAB0AAB0AQB0AgCIAQCDAQCDAQCDAQB9AQBkAQB9AgB4\njwCIAQBkAQAZagMARF2AAIkAAIcAAIcBAGYCAGQCAIYAAHwBAESDAQB9AwB8AwBnAABrAwByLAB8\nAwBkAQAZfQQAfAEAagQAfAQAgwEAAXwCAGQDADd9AgB4MQB8AwBkAwBkAACFAgAZRF0cAH0FAIgB\nAHwFABmIAQB8BAAZF4gBAHwFADxxiQBXcSwAcSwAV3wCAFMoBAAAAE5pAAAAAGMBAAAAAAAAAAIA\nAAAEAAAAEwAAAHMqAAAAZwAAfAAAXSAAfQEAiAEAfAEAGYgAABlkAABrAwByBgB8AQCRAgBxBgBT\nKAEAAABpAAAAACgAAAAAKAIAAAB1AgAAAC4wdQEAAAByKAIAAAB1AQAAAGN1BwAAAHJvd2xpc3Qo\nAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQoAAAA8bGlzdGNv\nbXA+JwAAAHMCAAAACQBpAQAAACgFAAAAdQMAAABzZXR1BQAAAHJhbmdldQMAAABsZW51AQAAAER1\nBgAAAHJlbW92ZSgGAAAAdQcAAAByb3dsaXN0dQkAAAByb3dzX2xlZnR1AQAAAHJ1EQAAAHJvd3Nf\nd2l0aF9ub256ZXJvdQUAAABwaXZvdHUJAAAAcm93X2luZGV4KAAAAAAoAgAAAHUBAAAAY3UHAAAA\ncm93bGlzdHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQkAAABfR0Yy\nX3JhbmsjAAAAcxYAAAAAARgBBgEUARkBDAEKAQ0BCgEXASEBYwEAAAAAAAAABAAAAAUAAABDAAAA\nc3EAAABkAQCEAAB8AABEgwEAfQEAeFoAfAAARF1SAH0CAHhJAHwCAGoAAGoBAIMAAERdOAB9AwB8\nAwBkAgBrAwByLQB0AgB8AwB0AwBqBACDAgByWwB0BQB8AQCDAQBTdAYAfAEAgwEAU3EtAFdxFwBX\nZAIAUygDAAAATmMBAAAAAAAAAAIAAAAFAAAAUwAAAHMlAAAAZwAAfAAAXRsAfQEAdAAAfAEAagEA\nfAEAagIAgwIAkQIAcQYAUygAAAAAKAMAAAB1BAAAAF9WZWN1AQAAAER1AQAAAGYoAgAAAHUCAAAA\nLjB1AQAAAHUoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2Uu\ncHl1CgAAADxsaXN0Y29tcD4xAAAAcwIAAAAJAGkAAAAAKAcAAAB1AQAAAGZ1BgAAAHZhbHVlc3UK\nAAAAaXNpbnN0YW5jZXUDAAAAR0YydQMAAABPbmV1CQAAAF9HRjJfcmFua3UHAAAAX1JfcmFuaygE\nAAAAdQEAAABMdQIAAABMY3UBAAAAdnUBAAAAeCgAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9w\ncml2YXRlL2luZGVwZW5kZW5jZS5weXUFAAAAX3JhbmswAAAAcxAAAAAAARABDQEWAQwBEgEKARIB\nYwEAAAAAAAAAAQAAAAQAAABDAAAAczQAAAB0AAB8AAB0AQB0AgBmAgCDAgBzGwB0AwCCAQB0BAAE\nagUAZAEANwJfBQB0BgB8AACDAQBTKAIAAAB1cAIAAEZpbmRzIHRoZSByYW5rIG9mIGEgbGlzdCBv\nciBzZXQgb2YgdmVjdG9ycy4KCiAgICBBcmdzOgogICAgICAgIEw6IEEgbGlzdCBvciBzZXQgb2Yg\ndmVjdG9ycy4KCiAgICBSZXR1cm5zOgogICAgICAgIHg6IEEgbm9ubmVnYXRpdmUgaW50ZWdlci4g\nIFRoZSByYW5rIG9mIEwuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2VydGlvbkVycm9yOiBBbiBl\ncnJvciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoKICAgIEV4YW1wbGU6CiAg\nICA+Pj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVjKHsnYScsICdiJywgJ2Mn\nLCAnZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwg\neydiJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30sIHsnYyc6IDF9\nKQogICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxLCAnYyc6IDN9\nKQogICAgPj4+IHJhbmsoW2EwLCBhMSwgYTJdKQogICAgMwogICAgPj4+IHJhbmsoe2EwLCBhMiwg\nYTN9KQogICAgMgogICAgPj4+IHJhbmsoe2EwLCBhMSwgYTN9KQogICAgMwogICAgPj4+IHJhbmso\nW2EwLCBhMSwgYTIsIGEzXSkKICAgIDMKICAgIGkBAAAAKAcAAAB1CgAAAGlzaW5zdGFuY2V1BAAA\nAGxpc3R1AwAAAHNldHUOAAAAQXNzZXJ0aW9uRXJyb3J1BAAAAHJhbmt1CQAAAF9fY2FsbHNfX3UF\nAAAAX3JhbmsoAQAAAHUBAAAATCgAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2lu\nZGVwZW5kZW5jZS5weXUEAAAAcmFuazoAAABzBgAAAAAbGwEPAWMBAAAAAAAAAAEAAAAEAAAAQwAA\nAHNAAAAAdAAAfAAAdAEAdAIAZgIAgwIAcxsAdAMAggEAdAQABGoFAGQBADcCXwUAdAYAfAAAgwEA\ndAcAfAAAgwEAawIAUygCAAAAde0CAABEZXRlcm1pbmVzIGlmIGEgbGlzdCBvciBzZXQgb2YgdmVj\ndG9ycyBhcmUgbGluZWFybHkgaW5kZXBlbmRlbnQuCgogICAgQXJnczoKICAgICAgICBMOiBBIGxp\nc3Qgb3Igc2V0IG9mIHZlY3RvcnMuCgogICAgUmV0dXJuczoKICAgICAgICB4OiBBIGJvb2xlYW4u\nICBUcnVlIGlmIHRoZSB2ZWN0b3JzIGluIEwgYXJlIGxpbmVhcmx5IGluZGVwZW5kZW50LiAgRmFs\nc2UKICAgICAgICBvdGhlcndpc2UuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2VydGlvbkVycm9y\nOiBBbiBlcnJvciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoKICAgIEV4YW1w\nbGU6CiAgICA+Pj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVjKHsnYScsICdi\nJywgJ2MnLCAnZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAnYicsICdjJywg\nJ2QnfSwgeydiJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30sIHsn\nYyc6IDF9KQogICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxLCAn\nYyc6IDN9KQogICAgPj4+IGlzX2luZGVwZW5kZW50KFthMCwgYTEsIGEyXSkKICAgIFRydWUKICAg\nID4+PiBpc19pbmRlcGVuZGVudCh7YTAsIGEyLCBhM30pCiAgICBGYWxzZQogICAgPj4+IGlzX2lu\nZGVwZW5kZW50KHthMCwgYTEsIGEzfSkKICAgIFRydWUKICAgID4+PiBpc19pbmRlcGVuZGVudChb\nYTAsIGExLCBhMiwgYTNdKQogICAgRmFsc2UKICAgIGkBAAAAKAgAAAB1CgAAAGlzaW5zdGFuY2V1\nBAAAAGxpc3R1AwAAAHNldHUOAAAAQXNzZXJ0aW9uRXJyb3J1DgAAAGlzX2luZGVwZW5kZW50dQkA\nAABfX2NhbGxzX191BQAAAF9yYW5rdQMAAABsZW4oAQAAAHUBAAAATCgAAAAAKAAAAAB1JAAAAC4u\nL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUOAAAAaXNfaW5kZXBlbmRlbnRZAAAA\ncwYAAAAAHBsBDwF1DAAAAGluc3RydW1lbnRlZCgJAAAAdQMAAABHRjJ1BAAAAF9WZWN1BwAAAF9S\nX3Jhbmt1CQAAAF9HRjJfcmFua3UFAAAAX3Jhbmt1BAAAAHJhbmt1DgAAAGlzX2luZGVwZW5kZW50\ndQkAAABfX2NhbGxzX191CwAAAF9fdmVyc2lvbl9fKAAAAAAoAAAAACgAAAAAdSQAAAAuLi9yZXNv\ndXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1CAAAADxtb2R1bGU+AgAAAHMUAAAADAIQFwwI\nCQ0JCgkfCSAJAQkBCQE=\n' offset = 8 elif magic == b'\x9e\x0c\r\n': # Python 3.3 pycData = b'ngwNChNz/FTtDQAAYwAAAAAAAAAAAAAAAAMAAABAAAAAc4YAAABkAABkAQBsAABaAABHZAIAZAMA\nhAAAZAMAgwIAWgEAZAQAZAUAZAYAhAEAWgIAZAcAZAgAhAAAWgMAZAkAZAoAhAAAWgQAZAsAZAwA\nhAAAWgUAZA0AZA4AhAAAWgYAZAAAZQUAXwcAZA8AZQUAXwgAZAAAZQYAXwcAZA8AZQYAXwgAZAEA\nUygQAAAAaQAAAABOYwEAAAAAAAAAAQAAAAQAAABCAAAAc30AAAB8AABFZQAAWgEAZAAAWgIAZQMA\ngwAAaQAAZAEAZAIAhAIAWgQAZAMAZAQAhAAAWgUAZAUAZAYAhAAAWgYAZAcAZAgAhAAAWgcAZAkA\nZAoAhAAAWggAZAsAZAwAhAAAWgkAZA0AZA4AhAAAWgoAZA8AZBAAhAAAWgsAZBEAUygSAAAAdQQA\nAABfVmVjYwMAAAAAAAAAAwAAAAIAAABDAAAAcxYAAAB8AQB8AABfAAB8AgB8AABfAQBkAABTKAEA\nAABOKAIAAAB1AQAAAER1AQAAAGYoAwAAAHUEAAAAc2VsZnUGAAAAbGFiZWxzdQgAAABmdW5jdGlv\nbigAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUIAAAA\nX19pbml0X18FAAAAcwQAAAAAAQkBdQ0AAABfVmVjLl9faW5pdF9fYwIAAAAAAAAAAgAAAAIAAABD\nAAAAcx4AAAB8AQB8AABqAABrBgByGgB8AABqAAB8AQAZU2QBAFMoAgAAAE5pAAAAACgBAAAAdQEA\nAABmKAIAAAB1AQAAAHZ1AQAAAGsoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9p\nbmRlcGVuZGVuY2UucHl1CwAAAF9fZ2V0aXRlbV9fCQAAAHMAAAAAdRAAAABfVmVjLl9fZ2V0aXRl\nbV9fYwMAAAAAAAAAAwAAAAQAAABDAAAAcxUAAAB0AAAEfAAAagEAfAEAPH0CAGQAAFMoAQAAAE4o\nAgAAAHUIAAAAX3NldGl0ZW11AQAAAGYoAwAAAHUBAAAAdnUBAAAAa3UDAAAAdmFsKAAAAAAoAAAA\nAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQsAAABfX3NldGl0ZW1f\nXwoAAABzAAAAAHUQAAAAX1ZlYy5fX3NldGl0ZW1fX2MBAAAAAAAAAAEAAAACAAAAQwAAAHMIAAAA\nZAIAfAAAFFMoAwAAAE5pAQAAAGn/////KAAAAAAoAQAAAHUBAAAAdigAAAAAKAAAAAB1JAAAAC4u\nL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX19uZWdfXwsAAABzAAAAAHUM\nAAAAX1ZlYy5fX25lZ19fYwIAAAAAAAAAAgAAAAUAAAADAAAAcywAAAB0AAB8AABqAQCHAABmAQBk\nAQBkAgCGAAB8AABqAgBqAwCDAABEgwEAgwIAUygDAAAATmMBAAAAAAAAAAMAAAAEAAAAEwAAAHMj\nAAAAaQAAfAAAXRkAXAIAfQEAfQIAiAAAfAIAFHwBAJMCAHEGAFMoAAAAACgAAAAAKAMAAAB1AgAA\nAC4wdQEAAABrdQEAAAB4KAEAAAB1BQAAAGFscGhhKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2\nYXRlL2luZGVwZW5kZW5jZS5weXUKAAAAPGRpY3Rjb21wPgwAAABzAgAAAAkAdSEAAABfVmVjLl9f\ncm11bF9fLjxsb2NhbHM+LjxkaWN0Y29tcD4oBAAAAHUEAAAAX1ZlY3UBAAAARHUBAAAAZnUFAAAA\naXRlbXMoAgAAAHUBAAAAdnUFAAAAYWxwaGEoAAAAACgBAAAAdQUAAABhbHBoYXUkAAAALi4vcmVz\nb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQgAAABfX3JtdWxfXwwAAABzAAAAAHUNAAAA\nX1ZlYy5fX3JtdWxfX2MCAAAAAAAAAAIAAAAEAAAAAwAAAHNAAAAAdAAAiAAAdAEAgwIAcjgAdAIA\nhwAAhwEAZgIAZAEAZAIAhgAAiAEAagMAagQAgwAARIMBAIMBAFN0BQBTZAAAUygDAAAATmMBAAAA\nAAAAAAIAAAAFAAAAEwAAAHMiAAAAZwAAfAAAXRgAfQEAiAEAfAEAGYgAAHwBABkUkQIAcQYAUygA\nAAAAKAAAAAAoAgAAAHUCAAAALjB1AQAAAGsoAgAAAHUFAAAAb3RoZXJ1BAAAAHNlbGYoAAAAAHUk\nAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQoAAAA8bGlzdGNvbXA+EQAA\nAHMCAAAACQB1IAAAAF9WZWMuX19tdWxfXy48bG9jYWxzPi48bGlzdGNvbXA+KAYAAAB1CgAAAGlz\naW5zdGFuY2V1BAAAAF9WZWN1AwAAAHN1bXUBAAAAZnUEAAAAa2V5c3UOAAAATm90SW1wbGVtZW50\nZWQoAgAAAHUEAAAAc2VsZnUFAAAAb3RoZXIoAAAAACgCAAAAdQUAAABvdGhlcnUEAAAAc2VsZnUk\nAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQcAAABfX211bF9fDgAAAHMG\nAAAAAAIPASkCdQwAAABfVmVjLl9fbXVsX19jAgAAAAAAAAACAAAABQAAAAMAAABzRwAAAHQAAIgA\nAGoBAIcAAIcBAGYCAGQBAGQCAIYAAHQCAIgAAGoDAGoEAIMAAIMBAGoFAIgBAGoDAGoEAIMAAIMB\nAESDAQCDAgBTKAMAAABOYwEAAAAAAAAAAgAAAAUAAAATAAAAcyUAAABpAAB8AABdGwB9AQCIAAB8\nAQAZiAEAfAEAGRd8AQCTAgBxBgBTKAAAAAAoAAAAACgCAAAAdQIAAAAuMHUBAAAAaygCAAAAdQEA\nAAB1dQEAAAB2KAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUK\nAAAAPGRpY3Rjb21wPhUAAABzAgAAAAkAdSAAAABfVmVjLl9fYWRkX18uPGxvY2Fscz4uPGRpY3Rj\nb21wPigGAAAAdQQAAABfVmVjdQEAAABEdQMAAABzZXR1AQAAAGZ1BAAAAGtleXN1BQAAAHVuaW9u\nKAIAAAB1AQAAAHV1AQAAAHYoAAAAACgCAAAAdQEAAAB1dQEAAAB2dSQAAAAuLi9yZXNvdXJjZXMv\ncHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1BwAAAF9fYWRkX18VAAAAcwAAAAB1DAAAAF9WZWMuX19h\nZGRfX2MCAAAAAAAAAAIAAAACAAAAQwAAAHMJAAAAfAAAfAEACxdTKAEAAAB1NAAAAFJldHVybnMg\nYSB2ZWN0b3Igd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2Ugb2YgYSBhbmQgYi4oAAAAACgCAAAAdQEA\nAABhdQEAAABiKAAAAAAoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNl\nLnB5dQcAAABfX3N1Yl9fFwAAAHMCAAAAAAJ1DAAAAF9WZWMuX19zdWJfX04oDAAAAHUIAAAAX19u\nYW1lX191CgAAAF9fbW9kdWxlX191DAAAAF9fcXVhbG5hbWVfX3UDAAAAc2V0dQgAAABfX2luaXRf\nX3ULAAAAX19nZXRpdGVtX191CwAAAF9fc2V0aXRlbV9fdQcAAABfX25lZ19fdQgAAABfX3JtdWxf\nX3UHAAAAX19tdWxfX3UHAAAAX19hZGRfX3UHAAAAX19zdWJfXygBAAAAdQoAAABfX2xvY2Fsc19f\nKAAAAAAoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRlbmNlLnB5dQQAAABf\nVmVjBAAAAHMQAAAAEAEVBAwBDAEMAQwCDAcMAnUEAAAAX1ZlY2ebK6GGm4QGPWMCAAAAAAAAAAUA\nAAAGAAAAQwAAAHNsAAAAZwAAfQIAeFkAfAAARF1RAH0DAHgoAHwCAERdIAB9BAB8AwB8AwB8BAAU\nfAQAfAQAFBt8BAAUGH0DAHEaAFd8AwB8AwAUfAEAawQAcg0AfAIAagAAfAMAgwEAAXENAHENAFd0\nAQB8AgCDAQBTKAEAAABOKAIAAAB1BgAAAGFwcGVuZHUDAAAAbGVuKAUAAAB1AQAAAEx1AwAAAGVw\nc3UJAAAAdnN0YXJsaXN0dQEAAAB2dQUAAAB2c3RhcigAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNl\ncy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUHAAAAX1JfcmFuaxsAAABzDgAAAAABBgENAQ0BHgEQ\nABQBdQcAAABfUl9yYW5rYwEAAAAAAAAABgAAAAUAAAADAAAAc7cAAAB0AAB0AQB0AgCIAQCDAQCD\nAQCDAQB9AQBkAQB9AgB4kgCIAQBkAQAZagMARF2DAIkAAIcAAIcBAGYCAGQCAGQDAIYAAHwBAESD\nAQB9AwB8AwBnAABrAwByLAB8AwBkAQAZfQQAfAEAagQAfAQAgwEAAXwCAGQEADd9AgB4MQB8AwBk\nBABkAACFAgAZRF0cAH0FAIgBAHwFABmIAQB8BAAZF4gBAHwFADxxjABXcSwAcSwAV3wCAFMoBQAA\nAE5pAAAAAGMBAAAAAAAAAAIAAAAEAAAAEwAAAHMqAAAAZwAAfAAAXSAAfQEAiAEAfAEAGYgAABlk\nAABrAwByBgB8AQCRAgBxBgBTKAEAAABpAAAAACgAAAAAKAIAAAB1AgAAAC4wdQEAAAByKAIAAAB1\nAQAAAGN1BwAAAHJvd2xpc3QoAAAAAHUkAAAALi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBlbmRl\nbmNlLnB5dQoAAAA8bGlzdGNvbXA+JwAAAHMCAAAACQB1HQAAAF9HRjJfcmFuay48bG9jYWxzPi48\nbGlzdGNvbXA+aQEAAAAoBQAAAHUDAAAAc2V0dQUAAAByYW5nZXUDAAAAbGVudQEAAABEdQYAAABy\nZW1vdmUoBgAAAHUHAAAAcm93bGlzdHUJAAAAcm93c19sZWZ0dQEAAABydREAAAByb3dzX3dpdGhf\nbm9uemVyb3UFAAAAcGl2b3R1CQAAAHJvd19pbmRleCgAAAAAKAIAAAB1AQAAAGN1BwAAAHJvd2xp\nc3R1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUJAAAAX0dGMl9yYW5r\nIwAAAHMWAAAAAAEYAQYBFAEcAQwBCgENAQoBFwEhAXUJAAAAX0dGMl9yYW5rYwEAAAAAAAAABAAA\nAAUAAABDAAAAc3QAAABkAQBkAgCEAAB8AABEgwEAfQEAeFoAfAAARF1SAH0CAHhJAHwCAGoAAGoB\nAIMAAERdOAB9AwB8AwBkAwBrAwByMAB0AgB8AwB0AwBqBACDAgByXgB0BQB8AQCDAQBTdAYAfAEA\ngwEAU3EwAFdxGgBXZAMAUygEAAAATmMBAAAAAAAAAAIAAAAFAAAAUwAAAHMlAAAAZwAAfAAAXRsA\nfQEAdAAAfAEAagEAfAEAagIAgwIAkQIAcQYAUygAAAAAKAMAAAB1BAAAAF9WZWN1AQAAAER1AQAA\nAGYoAgAAAHUCAAAALjB1AQAAAHUoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9p\nbmRlcGVuZGVuY2UucHl1CgAAADxsaXN0Y29tcD4xAAAAcwIAAAAJAHUZAAAAX3JhbmsuPGxvY2Fs\ncz4uPGxpc3Rjb21wPmkAAAAAKAcAAAB1AQAAAGZ1BgAAAHZhbHVlc3UKAAAAaXNpbnN0YW5jZXUD\nAAAAR0YydQMAAABPbmV1CQAAAF9HRjJfcmFua3UHAAAAX1JfcmFuaygEAAAAdQEAAABMdQIAAABM\nY3UBAAAAdnUBAAAAeCgAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5k\nZW5jZS5weXUFAAAAX3JhbmswAAAAcxAAAAAAARMBDQEWAQwBEgEKARIBdQUAAABfcmFua2MBAAAA\nAAAAAAEAAAAEAAAAQwAAAHM0AAAAdAAAfAAAdAEAdAIAZgIAgwIAcxsAdAMAggEAdAQABGoFAGQB\nADcCXwUAdAYAfAAAgwEAUygCAAAAdXACAABGaW5kcyB0aGUgcmFuayBvZiBhIGxpc3Qgb3Igc2V0\nIG9mIHZlY3RvcnMuCgogICAgQXJnczoKICAgICAgICBMOiBBIGxpc3Qgb3Igc2V0IG9mIHZlY3Rv\ncnMuCgogICAgUmV0dXJuczoKICAgICAgICB4OiBBIG5vbm5lZ2F0aXZlIGludGVnZXIuICBUaGUg\ncmFuayBvZiBMLgoKICAgIFJhaXNlczoKICAgICAgICBBc3NlcnRpb25FcnJvcjogQW4gZXJyb3Ig\nb2NjdXJzIHdoZW4gTCBpcyBub3QgYSBsaXN0IG9yIHNldC4KCiAgICBFeGFtcGxlOgogICAgPj4+\nIGZyb20gdmVjIGltcG9ydCBWZWMKICAgID4+PiBhMCA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2Qn\nfSwgeydhJzogMX0pCiAgICA+Pj4gYTEgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30sIHsnYic6\nIDF9KQogICAgPj4+IGEyID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2MnOiAxfSkKICAg\nID4+PiBhMyA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwgeydhJzogMSwgJ2MnOiAzfSkKICAg\nID4+PiByYW5rKFthMCwgYTEsIGEyXSkKICAgIDMKICAgID4+PiByYW5rKHthMCwgYTIsIGEzfSkK\nICAgIDIKICAgID4+PiByYW5rKHthMCwgYTEsIGEzfSkKICAgIDMKICAgID4+PiByYW5rKFthMCwg\nYTEsIGEyLCBhM10pCiAgICAzCiAgICBpAQAAACgHAAAAdQoAAABpc2luc3RhbmNldQQAAABsaXN0\ndQMAAABzZXR1DgAAAEFzc2VydGlvbkVycm9ydQQAAAByYW5rdQkAAABfX2NhbGxzX191BQAAAF9y\nYW5rKAEAAAB1AQAAAEwoAAAAACgAAAAAdSQAAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVu\nZGVuY2UucHl1BAAAAHJhbms6AAAAcwYAAAAAGxsBDwF1BAAAAHJhbmtjAQAAAAAAAAABAAAABAAA\nAEMAAABzQAAAAHQAAHwAAHQBAHQCAGYCAIMCAHMbAHQDAIIBAHQEAARqBQBkAQA3Al8FAHQGAHwA\nAIMBAHQHAHwAAIMBAGsCAFMoAgAAAHXtAgAARGV0ZXJtaW5lcyBpZiBhIGxpc3Qgb3Igc2V0IG9m\nIHZlY3RvcnMgYXJlIGxpbmVhcmx5IGluZGVwZW5kZW50LgoKICAgIEFyZ3M6CiAgICAgICAgTDog\nQSBsaXN0IG9yIHNldCBvZiB2ZWN0b3JzLgoKICAgIFJldHVybnM6CiAgICAgICAgeDogQSBib29s\nZWFuLiAgVHJ1ZSBpZiB0aGUgdmVjdG9ycyBpbiBMIGFyZSBsaW5lYXJseSBpbmRlcGVuZGVudC4g\nIEZhbHNlCiAgICAgICAgb3RoZXJ3aXNlLgoKICAgIFJhaXNlczoKICAgICAgICBBc3NlcnRpb25F\ncnJvcjogQW4gZXJyb3Igb2NjdXJzIHdoZW4gTCBpcyBub3QgYSBsaXN0IG9yIHNldC4KCiAgICBF\neGFtcGxlOgogICAgPj4+IGZyb20gdmVjIGltcG9ydCBWZWMKICAgID4+PiBhMCA9IFZlYyh7J2En\nLCAnYicsICdjJywgJ2QnfSwgeydhJzogMX0pCiAgICA+Pj4gYTEgPSBWZWMoeydhJywgJ2InLCAn\nYycsICdkJ30sIHsnYic6IDF9KQogICAgPj4+IGEyID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9\nLCB7J2MnOiAxfSkKICAgID4+PiBhMyA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwgeydhJzog\nMSwgJ2MnOiAzfSkKICAgID4+PiBpc19pbmRlcGVuZGVudChbYTAsIGExLCBhMl0pCiAgICBUcnVl\nCiAgICA+Pj4gaXNfaW5kZXBlbmRlbnQoe2EwLCBhMiwgYTN9KQogICAgRmFsc2UKICAgID4+PiBp\nc19pbmRlcGVuZGVudCh7YTAsIGExLCBhM30pCiAgICBUcnVlCiAgICA+Pj4gaXNfaW5kZXBlbmRl\nbnQoW2EwLCBhMSwgYTIsIGEzXSkKICAgIEZhbHNlCiAgICBpAQAAACgIAAAAdQoAAABpc2luc3Rh\nbmNldQQAAABsaXN0dQMAAABzZXR1DgAAAEFzc2VydGlvbkVycm9ydQ4AAABpc19pbmRlcGVuZGVu\ndHUJAAAAX19jYWxsc19fdQUAAABfcmFua3UDAAAAbGVuKAEAAAB1AQAAAEwoAAAAACgAAAAAdSQA\nAAAuLi9yZXNvdXJjZXMvcHJpdmF0ZS9pbmRlcGVuZGVuY2UucHl1DgAAAGlzX2luZGVwZW5kZW50\nWQAAAHMGAAAAABwbAQ8BdQ4AAABpc19pbmRlcGVuZGVudHUMAAAAaW5zdHJ1bWVudGVkKAkAAAB1\nAwAAAEdGMnUEAAAAX1ZlY3UHAAAAX1JfcmFua3UJAAAAX0dGMl9yYW5rdQUAAABfcmFua3UEAAAA\ncmFua3UOAAAAaXNfaW5kZXBlbmRlbnR1CQAAAF9fY2FsbHNfX3ULAAAAX192ZXJzaW9uX18oAAAA\nACgAAAAAKAAAAAB1JAAAAC4uL3Jlc291cmNlcy9wcml2YXRlL2luZGVwZW5kZW5jZS5weXUIAAAA\nPG1vZHVsZT4CAAAAcxQAAAAMAhMXDwgMDQwKDB8MIAkBCQEJAQ==\n' offset = 12 elif magic == b'\xee\x0c\r\n': # Python 3.4 pycData = b'7gwNChNz/FTtDQAA4wAAAAAAAAAAAAAAAAMAAABAAAAAc4YAAABkAABkAQBsAABaAABHZAIAZAMA\nhAAAZAMAgwIAWgEAZAQAZAUAZAYAhAEAWgIAZAcAZAgAhAAAWgMAZAkAZAoAhAAAWgQAZAsAZAwA\nhAAAWgUAZA0AZA4AhAAAWgYAZAAAZQUAXwcAZA8AZQUAXwgAZAAAZQYAXwcAZA8AZQYAXwgAZAEA\nUykQ6QAAAABOYwAAAAAAAAAAAAAAAAQAAABAAAAAc3kAAABlAABaAQBkAABaAgBlAwCDAABpAABk\nAQBkAgCEAgBaBABkAwBkBACEAABaBQBkBQBkBgCEAABaBgBkBwBkCACEAABaBwBkCQBkCgCEAABa\nCABkCwBkDACEAABaCQBkDQBkDgCEAABaCgBkDwBkEACEAABaCwBkEQBTKRLaBF9WZWNjAwAAAAAA\nAAADAAAAAgAAAEMAAABzFgAAAHwBAHwAAF8AAHwCAHwAAF8BAGQAAFMpAU4pAtoBRNoBZikD2gRz\nZWxmWgZsYWJlbHNaCGZ1bmN0aW9uqQByBgAAAPokLi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBl\nbmRlbmNlLnB52ghfX2luaXRfXwUAAABzBAAAAAABCQF6DV9WZWMuX19pbml0X19jAgAAAAAAAAAC\nAAAAAgAAAEMAAABzHgAAAHwBAHwAAGoAAGsGAHIaAHwAAGoAAHwBABlTZAEAUykCTnIBAAAAKQFy\nBAAAACkC2gF22gFrcgYAAAByBgAAAHIHAAAA2gtfX2dldGl0ZW1fXwkAAABzAAAAAHoQX1ZlYy5f\nX2dldGl0ZW1fX2MDAAAAAAAAAAMAAAAEAAAAQwAAAHMVAAAAdAAABHwAAGoBAHwBADx9AgBkAABT\nKQFOKQJaCF9zZXRpdGVtcgQAAAApA3IJAAAAcgoAAADaA3ZhbHIGAAAAcgYAAAByBwAAANoLX19z\nZXRpdGVtX18KAAAAcwAAAAB6EF9WZWMuX19zZXRpdGVtX19jAQAAAAAAAAABAAAAAgAAAEMAAABz\nCAAAAGQCAHwAABRTKQNO6QEAAADp/////3IGAAAAKQFyCQAAAHIGAAAAcgYAAAByBwAAANoHX19u\nZWdfXwsAAABzAAAAAHoMX1ZlYy5fX25lZ19fYwIAAAAAAAAAAgAAAAUAAAADAAAAcywAAAB0AAB8\n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\nABmIAAAZZAAAawMAcgYAfAEAkQIAcQYAUykBcgEAAAByBgAAACkCchEAAADaAXIpAtoBY9oHcm93\nbGlzdHIGAAAAcgcAAAByGAAAACcAAABzAgAAAAkAeh1fR0YyX3JhbmsuPGxvY2Fscz4uPGxpc3Rj\nb21wPnIOAAAAKQVyHwAAANoFcmFuZ2VyKQAAAHIDAAAA2gZyZW1vdmUpBnIuAAAAWglyb3dzX2xl\nZnRyLAAAAFoRcm93c193aXRoX25vbnplcm9aBXBpdm90Wglyb3dfaW5kZXhyBgAAACkCci0AAABy\nLgAAAHIHAAAA2glfR0YyX3JhbmsjAAAAcxYAAAAAARgBBgEUARwBDAEKAQ0BCgEXASEBcjEAAABj\nAQAAAAAAAAAEAAAABQAAAEMAAABzdAAAAGQBAGQCAIQAAHwAAESDAQB9AQB4WgB8AABEXVIAfQIA\neEkAfAIAagAAagEAgwAARF04AH0DAHwDAGQDAGsDAHIwAHQCAHwDAHQDAGoEAIMCAHJeAHQFAHwB\nAIMBAFN0BgB8AQCDAQBTcTAAV3EaAFdkAwBTKQROYwEAAAAAAAAAAgAAAAUAAABTAAAAcyUAAABn\nAAB8AABdGwB9AQB0AAB8AQBqAQB8AQBqAgCDAgCRAgBxBgBTcgYAAAApA3ICAAAAcgMAAAByBAAA\nACkCchEAAAByHgAAAHIGAAAAcgYAAAByBwAAAHIYAAAAMQAAAHMCAAAACQB6GV9yYW5rLjxsb2Nh\nbHM+LjxsaXN0Y29tcD5yAQAAACkHcgQAAADaBnZhbHVlc3IZAAAA2gNHRjJaA09uZXIxAAAAcisA\nAAApBHIqAAAAWgJMY3IJAAAAchIAAAByBgAAAHIGAAAAcgcAAADaBV9yYW5rMAAAAHMQAAAAAAET\nAQ0BFgEMARIBCgESAXI0AAAAYwEAAAAAAAAAAQAAAAQAAABDAAAAczQAAAB0AAB8AAB0AQB0AgBm\nAgCDAgBzGwB0AwCCAQB0BAAEagUAZAEANwJfBQB0BgB8AACDAQBTKQJhcAIAAEZpbmRzIHRoZSBy\nYW5rIG9mIGEgbGlzdCBvciBzZXQgb2YgdmVjdG9ycy4KCiAgICBBcmdzOgogICAgICAgIEw6IEEg\nbGlzdCBvciBzZXQgb2YgdmVjdG9ycy4KCiAgICBSZXR1cm5zOgogICAgICAgIHg6IEEgbm9ubmVn\nYXRpdmUgaW50ZWdlci4gIFRoZSByYW5rIG9mIEwuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2Vy\ndGlvbkVycm9yOiBBbiBlcnJvciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoK\nICAgIEV4YW1wbGU6CiAgICA+Pj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVj\nKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAn\nYicsICdjJywgJ2QnfSwgeydiJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycs\nICdkJ30sIHsnYyc6IDF9KQogICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7\nJ2EnOiAxLCAnYyc6IDN9KQogICAgPj4+IHJhbmsoW2EwLCBhMSwgYTJdKQogICAgMwogICAgPj4+\nIHJhbmsoe2EwLCBhMiwgYTN9KQogICAgMgogICAgPj4+IHJhbmsoe2EwLCBhMSwgYTN9KQogICAg\nMwogICAgPj4+IHJhbmsoW2EwLCBhMSwgYTIsIGEzXSkKICAgIDMKICAgIHIOAAAAKQdyGQAAANoE\nbGlzdHIfAAAA2g5Bc3NlcnRpb25FcnJvctoEcmFua9oJX19jYWxsc19fcjQAAAApAXIqAAAAcgYA\nAAByBgAAAHIHAAAAcjcAAAA6AAAAcwYAAAAAGxsBDwFyNwAAAGMBAAAAAAAAAAEAAAAEAAAAQwAA\nAHNAAAAAdAAAfAAAdAEAdAIAZgIAgwIAcxsAdAMAggEAdAQABGoFAGQBADcCXwUAdAYAfAAAgwEA\ndAcAfAAAgwEAawIAUykCYe0CAABEZXRlcm1pbmVzIGlmIGEgbGlzdCBvciBzZXQgb2YgdmVjdG9y\ncyBhcmUgbGluZWFybHkgaW5kZXBlbmRlbnQuCgogICAgQXJnczoKICAgICAgICBMOiBBIGxpc3Qg\nb3Igc2V0IG9mIHZlY3RvcnMuCgogICAgUmV0dXJuczoKICAgICAgICB4OiBBIGJvb2xlYW4uICBU\ncnVlIGlmIHRoZSB2ZWN0b3JzIGluIEwgYXJlIGxpbmVhcmx5IGluZGVwZW5kZW50LiAgRmFsc2UK\nICAgICAgICBvdGhlcndpc2UuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2VydGlvbkVycm9yOiBB\nbiBlcnJvciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoKICAgIEV4YW1wbGU6\nCiAgICA+Pj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVjKHsnYScsICdiJywg\nJ2MnLCAnZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2Qn\nfSwgeydiJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30sIHsnYyc6\nIDF9KQogICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxLCAnYyc6\nIDN9KQogICAgPj4+IGlzX2luZGVwZW5kZW50KFthMCwgYTEsIGEyXSkKICAgIFRydWUKICAgID4+\nPiBpc19pbmRlcGVuZGVudCh7YTAsIGEyLCBhM30pCiAgICBGYWxzZQogICAgPj4+IGlzX2luZGVw\nZW5kZW50KHthMCwgYTEsIGEzfSkKICAgIFRydWUKICAgID4+PiBpc19pbmRlcGVuZGVudChbYTAs\nIGExLCBhMiwgYTNdKQogICAgRmFsc2UKICAgIHIOAAAAKQhyGQAAAHI1AAAAch8AAAByNgAAANoO\naXNfaW5kZXBlbmRlbnRyOAAAAHI0AAAAcikAAAApAXIqAAAAcgYAAAByBgAAAHIHAAAAcjkAAABZ\nAAAAcwYAAAAAHBsBDwFyOQAAAFoMaW5zdHJ1bWVudGVkKQlyMwAAAHICAAAAcisAAAByMQAAAHI0\nAAAAcjcAAAByOQAAAHI4AAAA2gtfX3ZlcnNpb25fX3IGAAAAcgYAAAByBgAAAHIHAAAA2gg8bW9k\ndWxlPgIAAABzFAAAAAwCExcPCAwNDAoMHwwgCQEJAQkB\n' offset = 12 elif magic == b'\xf8\x0c\r\n': # Python 3.5 pycData = b'+AwNChNz/FTtDQAA4wAAAAAAAAAAAAAAAAMAAABAAAAAc4YAAABkAABkAQBsAABaAABHZAIAZAMA\nhAAAZAMAgwIAWgEAZAQAZAUAZAYAhAEAWgIAZAcAZAgAhAAAWgMAZAkAZAoAhAAAWgQAZAsAZAwA\nhAAAWgUAZA0AZA4AhAAAWgYAZAAAZQUAXwcAZA8AZQUAXwgAZAAAZQYAXwcAZA8AZQYAXwgAZAEA\nUykQ6QAAAABOYwAAAAAAAAAAAAAAAAQAAABAAAAAc3kAAABlAABaAQBkAABaAgBlAwCDAABpAABk\nAQBkAgCEAgBaBABkAwBkBACEAABaBQBkBQBkBgCEAABaBgBkBwBkCACEAABaBwBkCQBkCgCEAABa\nCABkCwBkDACEAABaCQBkDQBkDgCEAABaCgBkDwBkEACEAABaCwBkEQBTKRLaBF9WZWNjAwAAAAAA\nAAADAAAAAgAAAEMAAABzFgAAAHwBAHwAAF8AAHwCAHwAAF8BAGQAAFMpAU4pAtoBRNoBZikD2gRz\nZWxmWgZsYWJlbHNaCGZ1bmN0aW9uqQByBgAAAPokLi4vcmVzb3VyY2VzL3ByaXZhdGUvaW5kZXBl\nbmRlbmNlLnB52ghfX2luaXRfXwUAAABzBAAAAAABCQF6DV9WZWMuX19pbml0X19jAgAAAAAAAAAC\nAAAAAgAAAEMAAABzHgAAAHwBAHwAAGoAAGsGAHIaAHwAAGoAAHwBABlTZAEAUykCTnIBAAAAKQFy\nBAAAACkC2gF22gFrcgYAAAByBgAAAHIHAAAA2gtfX2dldGl0ZW1fXwkAAABzAAAAAHoQX1ZlYy5f\nX2dldGl0ZW1fX2MDAAAAAAAAAAMAAAAEAAAAQwAAAHMVAAAAdAAABHwAAGoBAHwBADx9AgBkAABT\nKQFOKQJaCF9zZXRpdGVtcgQAAAApA3IJAAAAcgoAAADaA3ZhbHIGAAAAcgYAAAByBwAAANoLX19z\nZXRpdGVtX18KAAAAcwAAAAB6EF9WZWMuX19zZXRpdGVtX19jAQAAAAAAAAABAAAAAgAAAEMAAABz\nCAAAAGQCAHwAABRTKQNO6QEAAADp/////3IGAAAAKQFyCQAAAHIGAAAAcgYAAAByBwAAANoHX19u\nZWdfXwsAAABzAAAAAHoMX1ZlYy5fX25lZ19fYwIAAAAAAAAAAgAAAAUAAAADAAAAcywAAAB0AAB8\nAABqAQCHAABmAQBkAQBkAgCGAAB8AABqAgBqAwCDAABEgwEAgwIAUykDTmMBAAAAAAAAAAMAAAAE\nAAAAEwAAAHMjAAAAaQAAfAAAXRkAXAIAfQEAfQIAiAAAfAIAFHwBAJMCAHEGAFNyBgAAAHIGAAAA\nKQPaAi4wcgoAAADaAXgpAdoFYWxwaGFyBgAAAHIHAAAA+go8ZGljdGNvbXA+DAAAAHMCAAAACQB6\nIV9WZWMuX19ybXVsX18uPGxvY2Fscz4uPGRpY3Rjb21wPikEcgIAAAByAwAAAHIEAAAA2gVpdGVt\ncykCcgkAAAByEwAAAHIGAAAAKQFyEwAAAHIHAAAA2ghfX3JtdWxfXwwAAABzAAAAAHoNX1ZlYy5f\nX3JtdWxfX2MCAAAAAAAAAAIAAAAEAAAAAwAAAHNAAAAAdAAAiAAAdAEAgwIAcjgAdAIAhwAAhwEA\nZgIAZAEAZAIAhgAAiAEAagMAagQAgwAARIMBAIMBAFN0BQBTZAAAUykDTmMBAAAAAAAAAAIAAAAF\nAAAAEwAAAHMiAAAAZwAAfAAAXRgAfQEAiAEAfAEAGYgAAHwBABkUkQIAcQYAU3IGAAAAcgYAAAAp\nAnIRAAAAcgoAAAApAtoFb3RoZXJyBQAAAHIGAAAAcgcAAAD6CjxsaXN0Y29tcD4RAAAAcwIAAAAJ\nAHogX1ZlYy5fX211bF9fLjxsb2NhbHM+LjxsaXN0Y29tcD4pBtoKaXNpbnN0YW5jZXICAAAA2gNz\ndW1yBAAAANoEa2V5c9oOTm90SW1wbGVtZW50ZWQpAnIFAAAAchcAAAByBgAAACkCchcAAAByBQAA\nAHIHAAAA2gdfX211bF9fDgAAAHMGAAAAAAIPASkCegxfVmVjLl9fbXVsX19jAgAAAAAAAAACAAAA\nBQAAAAMAAABzRwAAAHQAAIgAAGoBAIcAAIcBAGYCAGQBAGQCAIYAAHQCAIgAAGoDAGoEAIMAAIMB\nAGoFAIgBAGoDAGoEAIMAAIMBAESDAQCDAgBTKQNOYwEAAAAAAAAAAgAAAAUAAAATAAAAcyUAAABp\nAAB8AABdGwB9AQCIAAB8AQAZiAEAfAEAGRd8AQCTAgBxBgBTcgYAAAByBgAAACkCchEAAAByCgAA\nACkC2gF1cgkAAAByBgAAAHIHAAAAchQAAAAVAAAAcwIAAAAJAHogX1ZlYy5fX2FkZF9fLjxsb2Nh\nbHM+LjxkaWN0Y29tcD4pBnICAAAAcgMAAADaA3NldHIEAAAAchsAAADaBXVuaW9uKQJyHgAAAHIJ\nAAAAcgYAAAApAnIeAAAAcgkAAAByBwAAANoHX19hZGRfXxUAAABzAAAAAHoMX1ZlYy5fX2FkZF9f\nYwIAAAAAAAAAAgAAAAIAAABDAAAAcwkAAAB8AAB8AQALF1MpAXo0UmV0dXJucyBhIHZlY3RvciB3\naGljaCBpcyB0aGUgZGlmZmVyZW5jZSBvZiBhIGFuZCBiLnIGAAAAKQLaAWHaAWJyBgAAAHIGAAAA\ncgcAAADaB19fc3ViX18XAAAAcwIAAAAAAnoMX1ZlYy5fX3N1Yl9fTikM2ghfX25hbWVfX9oKX19t\nb2R1bGVfX9oMX19xdWFsbmFtZV9fch8AAAByCAAAAHILAAAAcg0AAAByEAAAAHIWAAAAch0AAABy\nIQAAAHIkAAAAcgYAAAByBgAAAHIGAAAAcgcAAAByAgAAAAQAAABzEAAAAAwBFQQMAQwBDAEMAgwH\nDAJyAgAAAGebK6GGm4QGPWMCAAAAAAAAAAUAAAAGAAAAQwAAAHNpAAAAZwAAfQIAeFYAfAAARF1O\nAH0DAHgoAHwCAERdIAB9BAB8AwB8AwB8BAAUfAQAfAQAFBt8BAAUGH0DAHEaAFd8AwB8AwAUfAEA\nawQAcg0AfAIAagAAfAMAgwEAAXENAFd0AQB8AgCDAQBTKQFOKQLaBmFwcGVuZNoDbGVuKQXaAUxa\nA2Vwc1oJdnN0YXJsaXN0cgkAAABaBXZzdGFycgYAAAByBgAAAHIHAAAA2gdfUl9yYW5rGwAAAHMO\nAAAAAAEGAQ0BDQEeARAAEQFyKwAAAGMBAAAAAAAAAAYAAAAFAAAAAwAAAHO0AAAAdAAAdAEAdAIA\niAEAgwEAgwEAgwEAfQEAZAEAfQIAeI8AiAEAZAEAGWoDAERdgACJAACHAACHAQBmAgBkAgBkAwCG\nAAB8AQBEgwEAfQMAfAMAZwAAawMAciwAfAMAZAEAGX0EAHwBAGoEAHwEAIMBAAF8AgBkBAA3fQIA\neC4AfAMAZAQAZAAAhQIAGURdHAB9BQCIAQB8BQAZiAEAfAQAGReIAQB8BQA8cYwAV3EsAFd8AgBT\nKQVOcgEAAABjAQAAAAAAAAACAAAABAAAABMAAABzKgAAAGcAAHwAAF0gAH0BAIgBAHwBABmIAAAZ\nZAAAawMAcgYAfAEAkQIAcQYAUykBcgEAAAByBgAAACkCchEAAADaAXIpAtoBY9oHcm93bGlzdHIG\nAAAAcgcAAAByGAAAACcAAABzAgAAAAkAeh1fR0YyX3JhbmsuPGxvY2Fscz4uPGxpc3Rjb21wPnIO\nAAAAKQVyHwAAANoFcmFuZ2VyKQAAAHIDAAAA2gZyZW1vdmUpBnIuAAAAWglyb3dzX2xlZnRyLAAA\nAFoRcm93c193aXRoX25vbnplcm9aBXBpdm90Wglyb3dfaW5kZXhyBgAAACkCci0AAAByLgAAAHIH\nAAAA2glfR0YyX3JhbmsjAAAAcxYAAAAAARgBBgEUARwBDAEKAQ0BCgEXAR4BcjEAAABjAQAAAAAA\nAAAEAAAABQAAAEMAAABzdAAAAGQBAGQCAIQAAHwAAESDAQB9AQB4WgB8AABEXVIAfQIAeEkAfAIA\nagAAagEAgwAARF04AH0DAHwDAGQDAGsDAHIwAHQCAHwDAHQDAGoEAIMCAHJeAHQFAHwBAIMBAFN0\nBgB8AQCDAQBTcTAAV3EaAFdkAwBTKQROYwEAAAAAAAAAAgAAAAUAAABTAAAAcyUAAABnAAB8AABd\nGwB9AQB0AAB8AQBqAQB8AQBqAgCDAgCRAgBxBgBTcgYAAAApA3ICAAAAcgMAAAByBAAAACkCchEA\nAAByHgAAAHIGAAAAcgYAAAByBwAAAHIYAAAAMQAAAHMCAAAACQB6GV9yYW5rLjxsb2NhbHM+Ljxs\naXN0Y29tcD5yAQAAACkHcgQAAADaBnZhbHVlc3IZAAAA2gNHRjJaA09uZXIxAAAAcisAAAApBHIq\nAAAAWgJMY3IJAAAAchIAAAByBgAAAHIGAAAAcgcAAADaBV9yYW5rMAAAAHMQAAAAAAETAQ0BFgEM\nARIBCgESAXI0AAAAYwEAAAAAAAAAAQAAAAQAAABDAAAAczQAAAB0AAB8AAB0AQB0AgBmAgCDAgBz\nGwB0AwCCAQB0BAAEagUAZAEANwJfBQB0BgB8AACDAQBTKQJhcAIAAEZpbmRzIHRoZSByYW5rIG9m\nIGEgbGlzdCBvciBzZXQgb2YgdmVjdG9ycy4KCiAgICBBcmdzOgogICAgICAgIEw6IEEgbGlzdCBv\nciBzZXQgb2YgdmVjdG9ycy4KCiAgICBSZXR1cm5zOgogICAgICAgIHg6IEEgbm9ubmVnYXRpdmUg\naW50ZWdlci4gIFRoZSByYW5rIG9mIEwuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2VydGlvbkVy\ncm9yOiBBbiBlcnJvciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoKICAgIEV4\nYW1wbGU6CiAgICA+Pj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVjKHsnYScs\nICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAnYicsICdj\nJywgJ2QnfSwgeydiJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30s\nIHsnYyc6IDF9KQogICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAx\nLCAnYyc6IDN9KQogICAgPj4+IHJhbmsoW2EwLCBhMSwgYTJdKQogICAgMwogICAgPj4+IHJhbmso\ne2EwLCBhMiwgYTN9KQogICAgMgogICAgPj4+IHJhbmsoe2EwLCBhMSwgYTN9KQogICAgMwogICAg\nPj4+IHJhbmsoW2EwLCBhMSwgYTIsIGEzXSkKICAgIDMKICAgIHIOAAAAKQdyGQAAANoEbGlzdHIf\nAAAA2g5Bc3NlcnRpb25FcnJvctoEcmFua9oJX19jYWxsc19fcjQAAAApAXIqAAAAcgYAAAByBgAA\nAHIHAAAAcjcAAAA6AAAAcwYAAAAAGxsBDwFyNwAAAGMBAAAAAAAAAAEAAAAEAAAAQwAAAHNAAAAA\ndAAAfAAAdAEAdAIAZgIAgwIAcxsAdAMAggEAdAQABGoFAGQBADcCXwUAdAYAfAAAgwEAdAcAfAAA\ngwEAawIAUykCYe0CAABEZXRlcm1pbmVzIGlmIGEgbGlzdCBvciBzZXQgb2YgdmVjdG9ycyBhcmUg\nbGluZWFybHkgaW5kZXBlbmRlbnQuCgogICAgQXJnczoKICAgICAgICBMOiBBIGxpc3Qgb3Igc2V0\nIG9mIHZlY3RvcnMuCgogICAgUmV0dXJuczoKICAgICAgICB4OiBBIGJvb2xlYW4uICBUcnVlIGlm\nIHRoZSB2ZWN0b3JzIGluIEwgYXJlIGxpbmVhcmx5IGluZGVwZW5kZW50LiAgRmFsc2UKICAgICAg\nICBvdGhlcndpc2UuCgogICAgUmFpc2VzOgogICAgICAgIEFzc2VydGlvbkVycm9yOiBBbiBlcnJv\nciBvY2N1cnMgd2hlbiBMIGlzIG5vdCBhIGxpc3Qgb3Igc2V0LgoKICAgIEV4YW1wbGU6CiAgICA+\nPj4gZnJvbSB2ZWMgaW1wb3J0IFZlYwogICAgPj4+IGEwID0gVmVjKHsnYScsICdiJywgJ2MnLCAn\nZCd9LCB7J2EnOiAxfSkKICAgID4+PiBhMSA9IFZlYyh7J2EnLCAnYicsICdjJywgJ2QnfSwgeydi\nJzogMX0pCiAgICA+Pj4gYTIgPSBWZWMoeydhJywgJ2InLCAnYycsICdkJ30sIHsnYyc6IDF9KQog\nICAgPj4+IGEzID0gVmVjKHsnYScsICdiJywgJ2MnLCAnZCd9LCB7J2EnOiAxLCAnYyc6IDN9KQog\nICAgPj4+IGlzX2luZGVwZW5kZW50KFthMCwgYTEsIGEyXSkKICAgIFRydWUKICAgID4+PiBpc19p\nbmRlcGVuZGVudCh7YTAsIGEyLCBhM30pCiAgICBGYWxzZQogICAgPj4+IGlzX2luZGVwZW5kZW50\nKHthMCwgYTEsIGEzfSkKICAgIFRydWUKICAgID4+PiBpc19pbmRlcGVuZGVudChbYTAsIGExLCBh\nMiwgYTNdKQogICAgRmFsc2UKICAgIHIOAAAAKQhyGQAAAHI1AAAAch8AAAByNgAAANoOaXNfaW5k\nZXBlbmRlbnRyOAAAAHI0AAAAcikAAAApAXIqAAAAcgYAAAByBgAAAHIHAAAAcjkAAABZAAAAcwYA\nAAAAHBsBDwFyOQAAAFoMaW5zdHJ1bWVudGVkKQlyMwAAAHICAAAAcisAAAByMQAAAHI0AAAAcjcA\nAAByOQAAAHI4AAAA2gtfX3ZlcnNpb25fX3IGAAAAcgYAAAByBgAAAHIHAAAA2gg8bW9kdWxlPgIA\nAABzFAAAAAwCExcPCAwNDAoMHwwgCQEJAQkB\n' offset = 12 else: raise ImportError("Unsupported Python version") pycData = base64.decodebytes(pycData) assert pycData[:4] == magic, "Bad magic number" try: return marshal.loads(pycData[offset:]) except ValueError: raise ImportError("Could not read .pyc data")
def __init__(self, path=None, start=0): """ Initialize an Archive. If path is omitted, it will be an empty Archive. """ self.toc = None self.path = path self.start = start # In Python 3 module 'imp' is no longer built-in and we cannot use it. # There is for Python 3 another way how to obtain magic value. if sys.version_info[0] == 2: import imp self.pymagic = imp.get_magic() else: # We cannot use at this bootstrap stage importlib directly # but its frozen variant. import _frozen_importlib if sys.version_info[1] <= 3: # Python 3.3 self.pymagic = _frozen_importlib._MAGIC_BYTES elif sys.version_info[1] == 4: # Python 3.4 self.pymagic = _frozen_importlib.MAGIC_NUMBER else: # Python 3.5+ self.pymagic = _frozen_importlib._bootstrap_external.MAGIC_NUMBER if path is not None: self.lib = ArchiveFile(self.path, 'rb') with self.lib: self.checkmagic() self.loadtoc()
def _code_to_file(co): """ Convert code object to a .pyc pseudo-file """ return BytesIO( imp.get_magic() + b'\0\0\0\0' + marshal.dumps(co))
def imp_walk(name): """ yields namepart, tuple_or_importer for each path item raise ImportError if a name can not be found. """ warnings.warn("imp_walk will be removed in a future version", DeprecationWarning) if name in sys.builtin_module_names: yield name, (None, None, ("", "", imp.C_BUILTIN)) return paths = sys.path res = None for namepart in name.split('.'): for path_item in paths: res = _check_importer_for_path(namepart, path_item) if hasattr(res, 'load_module'): if res.path.endswith('.py') or res.path.endswith('.pyw'): fp = StringIO(res.get_source(namepart)) res = (fp, res.path, ('.py', 'rU', imp.PY_SOURCE)) elif res.path.endswith('.pyc') or res.path.endswith('.pyo'): co = res.get_code(namepart) fp = BytesIO(imp.get_magic() + b'\0\0\0\0' + marshal.dumps(co)) res = (fp, res.path, ('.pyc', 'rb', imp.PY_COMPILED)) else: res = (None, loader.path, (os.path.splitext(loader.path)[-1], 'rb', imp.C_EXTENSION)) break elif isinstance(res, tuple): break else: break yield namepart, res paths = [os.path.join(path_item, namepart)] else: return raise ImportError('No module named %s' % (name,))
def getPycHeader(filename): # compile.c uses marshal to write a long directly, with # calling the interface that would also generate a 1-byte code # to indicate the type of the value. simplest way to get the # same effect is to call marshal and then skip the code. #mtime = os.path.getmtime(filename) mtime = 0 # to make it deterministic for now mtime = struct.pack('<i', int(mtime)) return imp.get_magic() + mtime
def make_pyc(co, mtime): data = marshal.dumps(co) if type(mtime) is type(0.0): # Mac mtimes need a bit of special casing if mtime < 0x7fffffff: mtime = int(mtime) else: mtime = int(-0x100000000L + long(mtime)) pyc = imp.get_magic() + struct.pack("<i", int(mtime)) + data return pyc
def test_mtime(self): # Test a change in mtime leads to a new .pyc. self.recreation_check(struct.pack('<4sl', imp.get_magic(), 1))