Issue #15166: Re-implement imp.get_tag() using sys.implementation.

Also eliminates some C code in Python/import.c as well.

Patch by Eric Snow with verification by comparing against another
patch from Jeff Knupp.
This commit is contained in:
Brett Cannon 2012-07-02 15:13:11 -04:00
parent 8e2f5564b3
commit 98979b85e7
5 changed files with 194 additions and 195 deletions

View File

@ -11,7 +11,7 @@ from _imp import (lock_held, acquire_lock, release_lock,
init_builtin, init_frozen, is_builtin, is_frozen, init_builtin, init_frozen, is_builtin, is_frozen,
_fix_co_filename, extension_suffixes) _fix_co_filename, extension_suffixes)
# Could move out of _imp, but not worth the code # Could move out of _imp, but not worth the code
from _imp import get_magic, get_tag from _imp import get_magic
from importlib._bootstrap import new_module from importlib._bootstrap import new_module
from importlib._bootstrap import cache_from_source from importlib._bootstrap import cache_from_source
@ -37,6 +37,11 @@ PY_CODERESOURCE = 8
IMP_HOOK = 9 IMP_HOOK = 9
def get_tag():
"""Return the magic tag for .pyc or .pyo files."""
return sys.implementation.cache_tag
def get_suffixes(): def get_suffixes():
warnings.warn('imp.get_suffixes() is deprecated; use the constants ' warnings.warn('imp.get_suffixes() is deprecated; use the constants '
'defined on importlib.machinery instead', 'defined on importlib.machinery instead',

View File

@ -1452,7 +1452,7 @@ def _setup(sys_module, _imp_module):
# Constants # Constants
setattr(self_module, '_relax_case', _make_relax_case()) setattr(self_module, '_relax_case', _make_relax_case())
setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic()) setattr(self_module, '_MAGIC_NUMBER', _imp_module.get_magic())
setattr(self_module, '_TAG', _imp.get_tag()) setattr(self_module, '_TAG', sys.implementation.cache_tag)
if builtin_os == 'nt': if builtin_os == 'nt':
SOURCE_SUFFIXES.append('.pyw') SOURCE_SUFFIXES.append('.pyw')

View File

@ -17,6 +17,8 @@ Core and Builtins
Library Library
------- -------
- Issue #15166: Implement imp.get_tag() using sys.implementation.cache_tag.
- Issue #15210: Catch KeyError when imprortlib.__init__ can't find - Issue #15210: Catch KeyError when imprortlib.__init__ can't find
_frozen_importlib in sys.modules, not ImportError. _frozen_importlib in sys.modules, not ImportError.

View File

@ -112,23 +112,11 @@ typedef unsigned short mode_t;
/* MAGIC must change whenever the bytecode emitted by the compiler may no /* MAGIC must change whenever the bytecode emitted by the compiler may no
longer be understood by older implementations of the eval loop (usually longer be understood by older implementations of the eval loop (usually
due to the addition of new opcodes) due to the addition of new opcodes)
TAG must change for each major Python release. The magic number will take
care of any bytecode changes that occur during development.
*/ */
#define QUOTE(arg) #arg
#define STRIFY(name) QUOTE(name)
#define MAJOR STRIFY(PY_MAJOR_VERSION)
#define MINOR STRIFY(PY_MINOR_VERSION)
#define MAGIC (3230 | ((long)'\r'<<16) | ((long)'\n'<<24)) #define MAGIC (3230 | ((long)'\r'<<16) | ((long)'\n'<<24))
#define TAG "cpython-" MAJOR MINOR;
#define CACHEDIR "__pycache__" #define CACHEDIR "__pycache__"
/* Current magic word and string tag as globals. */ /* Current magic word and string tag as globals. */
static long pyc_magic = MAGIC; static long pyc_magic = MAGIC;
static const char *pyc_tag = TAG;
#undef QUOTE
#undef STRIFY
#undef MAJOR
#undef MINOR
/* See _PyImport_FixupExtensionObject() below */ /* See _PyImport_FixupExtensionObject() below */
static PyObject *extensions = NULL; static PyObject *extensions = NULL;
@ -534,9 +522,22 @@ PyImport_GetMagicNumber(void)
const char * const char *
PyImport_GetMagicTag(void) PyImport_GetMagicTag(void)
{ {
return pyc_tag; PyObject *impl, *tag;
const char *raw_tag;
/* We could also pull it from imp or importlib. */
impl = PySys_GetObject("implementation");
if (impl == NULL)
return NULL;
tag = PyObject_GetAttrString(impl, "cache_tag");
if (tag == NULL)
return NULL;
raw_tag = PyUnicode_DATA(tag);
Py_DECREF(tag);
return raw_tag;
} }
/* Magic for extension modules (built-in as well as dynamically /* Magic for extension modules (built-in as well as dynamically
loaded). To prevent initializing an extension module more than loaded). To prevent initializing an extension module more than
once, we keep a static dictionary 'extensions' keyed by module name once, we keep a static dictionary 'extensions' keyed by module name
@ -1846,12 +1847,6 @@ imp_get_magic(PyObject *self, PyObject *noargs)
return imp_make_magic(pyc_magic); return imp_make_magic(pyc_magic);
} }
static PyObject *
imp_get_tag(PyObject *self, PyObject *noargs)
{
return PyUnicode_FromString(pyc_tag);
}
static PyObject * static PyObject *
imp_extension_suffixes(PyObject *self, PyObject *noargs) imp_extension_suffixes(PyObject *self, PyObject *noargs)
{ {
@ -2002,10 +1997,6 @@ PyDoc_STRVAR(doc_get_magic,
"get_magic() -> string\n\ "get_magic() -> string\n\
Return the magic number for .pyc or .pyo files."); Return the magic number for .pyc or .pyo files.");
PyDoc_STRVAR(doc_get_tag,
"get_tag() -> string\n\
Return the magic tag for .pyc or .pyo files.");
PyDoc_STRVAR(doc_extension_suffixes, PyDoc_STRVAR(doc_extension_suffixes,
"extension_suffixes() -> list of strings\n\ "extension_suffixes() -> list of strings\n\
Returns the list of file suffixes used to identify extension modules."); Returns the list of file suffixes used to identify extension modules.");
@ -2029,7 +2020,6 @@ On platforms without threads, this function does nothing.");
static PyMethodDef imp_methods[] = { static PyMethodDef imp_methods[] = {
{"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic}, {"get_magic", imp_get_magic, METH_NOARGS, doc_get_magic},
{"get_tag", imp_get_tag, METH_NOARGS, doc_get_tag},
{"extension_suffixes", imp_extension_suffixes, METH_NOARGS, {"extension_suffixes", imp_extension_suffixes, METH_NOARGS,
doc_extension_suffixes}, doc_extension_suffixes},
{"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held}, {"lock_held", imp_lock_held, METH_NOARGS, doc_lock_held},

View File

@ -3051,8 +3051,8 @@ unsigned char _Py_M__importlib[] = {
99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0, 99,1,0,0,0,0,0,0,0,1,0,0,0,4,0,0,
0,19,0,0,0,115,46,0,0,0,116,0,0,124,0,0, 0,19,0,0,0,115,46,0,0,0,116,0,0,124,0,0,
131,1,0,115,33,0,116,1,0,100,1,0,100,2,0,124, 131,1,0,115,33,0,116,1,0,100,1,0,100,2,0,124,
0,0,131,1,1,130,1,0,110,0,0,136,1,0,124,0, 0,0,131,1,1,130,1,0,110,0,0,136,0,0,124,0,
0,136,0,0,140,1,0,83,40,3,0,0,0,117,45,0, 0,136,1,0,140,1,0,83,40,3,0,0,0,117,45,0,
0,0,80,97,116,104,32,104,111,111,107,32,102,111,114,32, 0,0,80,97,116,104,32,104,111,111,107,32,102,111,114,32,
105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110, 105,109,112,111,114,116,108,105,98,46,109,97,99,104,105,110,
101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,117, 101,114,121,46,70,105,108,101,70,105,110,100,101,114,46,117,
@ -3062,8 +3062,8 @@ unsigned char _Py_M__importlib[] = {
117,11,0,0,0,95,112,97,116,104,95,105,115,100,105,114, 117,11,0,0,0,95,112,97,116,104,95,105,115,100,105,114,
117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114, 117,11,0,0,0,73,109,112,111,114,116,69,114,114,111,114,
40,1,0,0,0,117,4,0,0,0,112,97,116,104,40,2, 40,1,0,0,0,117,4,0,0,0,112,97,116,104,40,2,
0,0,0,117,14,0,0,0,108,111,97,100,101,114,95,100, 0,0,0,117,3,0,0,0,99,108,115,117,14,0,0,0,
101,116,97,105,108,115,117,3,0,0,0,99,108,115,40,0, 108,111,97,100,101,114,95,100,101,116,97,105,108,115,40,0,
0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32, 0,0,0,117,29,0,0,0,60,102,114,111,122,101,110,32,
105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
116,114,97,112,62,117,24,0,0,0,112,97,116,104,95,104, 116,114,97,112,62,117,24,0,0,0,112,97,116,104,95,104,
@ -3077,9 +3077,9 @@ unsigned char _Py_M__importlib[] = {
0,0,0,108,111,97,100,101,114,95,100,101,116,97,105,108, 0,0,0,108,111,97,100,101,114,95,100,101,116,97,105,108,
115,117,24,0,0,0,112,97,116,104,95,104,111,111,107,95, 115,117,24,0,0,0,112,97,116,104,95,104,111,111,107,95,
102,111,114,95,70,105,108,101,70,105,110,100,101,114,40,0, 102,111,114,95,70,105,108,101,70,105,110,100,101,114,40,0,
0,0,0,40,2,0,0,0,117,14,0,0,0,108,111,97, 0,0,0,40,2,0,0,0,117,3,0,0,0,99,108,115,
100,101,114,95,100,101,116,97,105,108,115,117,3,0,0,0, 117,14,0,0,0,108,111,97,100,101,114,95,100,101,116,97,
99,108,115,117,29,0,0,0,60,102,114,111,122,101,110,32, 105,108,115,117,29,0,0,0,60,102,114,111,122,101,110,32,
105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115, 105,109,112,111,114,116,108,105,98,46,95,98,111,111,116,115,
116,114,97,112,62,117,9,0,0,0,112,97,116,104,95,104, 116,114,97,112,62,117,9,0,0,0,112,97,116,104,95,104,
111,111,107,134,4,0,0,115,4,0,0,0,0,10,21,6, 111,111,107,134,4,0,0,115,4,0,0,0,0,10,21,6,
@ -3635,8 +3635,8 @@ unsigned char _Py_M__importlib[] = {
124,3,0,100,22,0,116,15,0,131,0,0,131,3,0,1, 124,3,0,100,22,0,116,15,0,131,0,0,131,3,0,1,
116,8,0,124,3,0,100,23,0,124,1,0,106,16,0,131, 116,8,0,124,3,0,100,23,0,124,1,0,106,16,0,131,
0,0,131,3,0,1,116,8,0,124,3,0,100,24,0,116, 0,0,131,3,0,1,116,8,0,124,3,0,100,24,0,116,
0,0,106,17,0,131,0,0,131,3,0,1,124,7,0,100, 1,0,106,17,0,106,18,0,131,3,0,1,124,7,0,100,
8,0,107,2,0,114,120,2,116,18,0,106,19,0,100,25, 8,0,107,2,0,114,120,2,116,19,0,106,20,0,100,25,
0,131,1,0,1,110,0,0,100,26,0,83,40,28,0,0, 0,131,1,0,1,110,0,0,100,26,0,83,40,28,0,0,
0,117,250,0,0,0,83,101,116,117,112,32,105,109,112,111, 0,117,250,0,0,0,83,101,116,117,112,32,105,109,112,111,
114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105,
@ -3687,7 +3687,7 @@ unsigned char _Py_M__importlib[] = {
0,0,117,3,0,0,0,95,105,111,117,9,0,0,0,95, 0,0,117,3,0,0,0,95,105,111,117,9,0,0,0,95,
119,97,114,110,105,110,103,115,117,8,0,0,0,98,117,105, 119,97,114,110,105,110,103,115,117,8,0,0,0,98,117,105,
108,116,105,110,115,117,7,0,0,0,109,97,114,115,104,97, 108,116,105,110,115,117,7,0,0,0,109,97,114,115,104,97,
108,40,20,0,0,0,117,4,0,0,0,95,105,109,112,117, 108,40,21,0,0,0,117,4,0,0,0,95,105,109,112,117,
3,0,0,0,115,121,115,117,7,0,0,0,104,97,115,97, 3,0,0,0,115,121,115,117,7,0,0,0,104,97,115,97,
116,116,114,117,15,0,0,0,66,117,105,108,116,105,110,73, 116,116,114,117,15,0,0,0,66,117,105,108,116,105,110,73,
109,112,111,114,116,101,114,117,10,0,0,0,95,95,108,111, 109,112,111,114,116,101,114,117,10,0,0,0,95,95,108,111,
@ -3701,163 +3701,165 @@ unsigned char _Py_M__importlib[] = {
111,114,117,4,0,0,0,78,111,110,101,117,3,0,0,0, 111,114,117,4,0,0,0,78,111,110,101,117,3,0,0,0,
115,101,116,117,16,0,0,0,95,109,97,107,101,95,114,101, 115,101,116,117,16,0,0,0,95,109,97,107,101,95,114,101,
108,97,120,95,99,97,115,101,117,9,0,0,0,103,101,116, 108,97,120,95,99,97,115,101,117,9,0,0,0,103,101,116,
95,109,97,103,105,99,117,7,0,0,0,103,101,116,95,116, 95,109,97,103,105,99,117,14,0,0,0,105,109,112,108,101,
97,103,117,15,0,0,0,83,79,85,82,67,69,95,83,85, 109,101,110,116,97,116,105,111,110,117,9,0,0,0,99,97,
70,70,73,88,69,83,117,6,0,0,0,97,112,112,101,110, 99,104,101,95,116,97,103,117,15,0,0,0,83,79,85,82,
100,40,13,0,0,0,117,10,0,0,0,115,121,115,95,109, 67,69,95,83,85,70,70,73,88,69,83,117,6,0,0,0,
111,100,117,108,101,117,11,0,0,0,95,105,109,112,95,109, 97,112,112,101,110,100,40,13,0,0,0,117,10,0,0,0,
111,100,117,108,101,117,6,0,0,0,109,111,100,117,108,101, 115,121,115,95,109,111,100,117,108,101,117,11,0,0,0,95,
117,11,0,0,0,115,101,108,102,95,109,111,100,117,108,101, 105,109,112,95,109,111,100,117,108,101,117,6,0,0,0,109,
117,12,0,0,0,98,117,105,108,116,105,110,95,110,97,109, 111,100,117,108,101,117,11,0,0,0,115,101,108,102,95,109,
101,117,14,0,0,0,98,117,105,108,116,105,110,95,109,111, 111,100,117,108,101,117,12,0,0,0,98,117,105,108,116,105,
100,117,108,101,117,10,0,0,0,111,115,95,100,101,116,97, 110,95,110,97,109,101,117,14,0,0,0,98,117,105,108,116,
105,108,115,117,10,0,0,0,98,117,105,108,116,105,110,95, 105,110,95,109,111,100,117,108,101,117,10,0,0,0,111,115,
111,115,117,15,0,0,0,112,97,116,104,95,115,101,112,97, 95,100,101,116,97,105,108,115,117,10,0,0,0,98,117,105,
114,97,116,111,114,115,117,8,0,0,0,112,97,116,104,95, 108,116,105,110,95,111,115,117,15,0,0,0,112,97,116,104,
115,101,112,117,9,0,0,0,111,115,95,109,111,100,117,108, 95,115,101,112,97,114,97,116,111,114,115,117,8,0,0,0,
101,117,13,0,0,0,116,104,114,101,97,100,95,109,111,100, 112,97,116,104,95,115,101,112,117,9,0,0,0,111,115,95,
117,108,101,117,14,0,0,0,119,101,97,107,114,101,102,95, 109,111,100,117,108,101,117,13,0,0,0,116,104,114,101,97,
109,111,100,117,108,101,40,0,0,0,0,40,0,0,0,0, 100,95,109,111,100,117,108,101,117,14,0,0,0,119,101,97,
117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 107,114,101,102,95,109,111,100,117,108,101,40,0,0,0,0,
111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
112,62,117,6,0,0,0,95,115,101,116,117,112,116,5,0, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
0,115,82,0,0,0,0,9,6,1,6,2,19,1,15,1, 116,115,116,114,97,112,62,117,6,0,0,0,95,115,101,116,
16,2,13,1,13,1,15,1,18,2,13,1,20,2,48,1, 117,112,116,5,0,0,115,82,0,0,0,0,9,6,1,6,
19,2,31,1,10,1,15,1,13,1,4,2,3,1,15,2, 2,19,1,15,1,16,2,13,1,13,1,15,1,18,2,13,
27,1,13,1,5,1,13,1,12,2,12,2,3,1,19,1, 1,20,2,48,1,19,2,31,1,10,1,15,1,13,1,4,
13,2,11,1,15,2,16,1,16,1,16,1,16,1,22,2, 2,3,1,15,2,27,1,13,1,5,1,13,1,12,2,12,
19,1,22,1,22,1,12,1,117,6,0,0,0,95,115,101, 2,3,1,19,1,13,2,11,1,15,2,16,1,16,1,16,
116,117,112,99,2,0,0,0,0,0,0,0,6,0,0,0, 1,16,1,22,2,19,1,22,1,22,1,12,1,117,6,0,
4,0,0,0,67,0,0,0,115,136,0,0,0,116,0,0, 0,0,95,115,101,116,117,112,99,2,0,0,0,0,0,0,
124,0,0,124,1,0,131,2,0,1,116,1,0,124,1,0, 0,6,0,0,0,4,0,0,0,67,0,0,0,115,136,0,
106,2,0,131,0,0,100,2,0,102,3,0,125,2,0,116, 0,0,116,0,0,124,0,0,124,1,0,131,2,0,1,116,
4,0,116,5,0,100,3,0,102,3,0,125,3,0,116,7, 1,0,124,1,0,106,2,0,131,0,0,100,2,0,102,3,
0,116,8,0,100,3,0,102,3,0,125,4,0,124,2,0, 0,125,2,0,116,4,0,116,5,0,100,3,0,102,3,0,
124,3,0,124,4,0,103,3,0,125,5,0,116,9,0,106, 125,3,0,116,7,0,116,8,0,100,3,0,102,3,0,125,
10,0,106,11,0,116,12,0,106,13,0,124,5,0,140,0, 4,0,124,2,0,124,3,0,124,4,0,103,3,0,125,5,
0,103,1,0,131,1,0,1,116,9,0,106,14,0,106,11, 0,116,9,0,106,10,0,106,11,0,116,12,0,106,13,0,
0,116,15,0,116,16,0,116,17,0,103,3,0,131,1,0, 124,5,0,140,0,0,103,1,0,131,1,0,1,116,9,0,
1,100,1,0,83,40,4,0,0,0,117,50,0,0,0,73, 106,14,0,106,11,0,116,15,0,116,16,0,116,17,0,103,
110,115,116,97,108,108,32,105,109,112,111,114,116,108,105,98, 3,0,131,1,0,1,100,1,0,83,40,4,0,0,0,117,
32,97,115,32,116,104,101,32,105,109,112,108,101,109,101,110, 50,0,0,0,73,110,115,116,97,108,108,32,105,109,112,111,
116,97,116,105,111,110,32,111,102,32,105,109,112,111,114,116, 114,116,108,105,98,32,97,115,32,116,104,101,32,105,109,112,
46,78,70,84,40,18,0,0,0,117,6,0,0,0,95,115, 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,105,
101,116,117,112,117,19,0,0,0,69,120,116,101,110,115,105, 109,112,111,114,116,46,78,70,84,40,18,0,0,0,117,6,
111,110,70,105,108,101,76,111,97,100,101,114,117,18,0,0, 0,0,0,95,115,101,116,117,112,117,19,0,0,0,69,120,
0,101,120,116,101,110,115,105,111,110,95,115,117,102,102,105, 116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
120,101,115,117,5,0,0,0,70,97,108,115,101,117,16,0, 114,117,18,0,0,0,101,120,116,101,110,115,105,111,110,95,
0,0,83,111,117,114,99,101,70,105,108,101,76,111,97,100, 115,117,102,102,105,120,101,115,117,5,0,0,0,70,97,108,
101,114,117,15,0,0,0,83,79,85,82,67,69,95,83,85, 115,101,117,16,0,0,0,83,111,117,114,99,101,70,105,108,
70,70,73,88,69,83,117,4,0,0,0,84,114,117,101,117, 101,76,111,97,100,101,114,117,15,0,0,0,83,79,85,82,
20,0,0,0,83,111,117,114,99,101,108,101,115,115,70,105, 67,69,95,83,85,70,70,73,88,69,83,117,4,0,0,0,
108,101,76,111,97,100,101,114,117,17,0,0,0,66,89,84, 84,114,117,101,117,20,0,0,0,83,111,117,114,99,101,108,
69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,3, 101,115,115,70,105,108,101,76,111,97,100,101,114,117,17,0,
0,0,0,115,121,115,117,10,0,0,0,112,97,116,104,95, 0,0,66,89,84,69,67,79,68,69,95,83,85,70,70,73,
104,111,111,107,115,117,6,0,0,0,101,120,116,101,110,100, 88,69,83,117,3,0,0,0,115,121,115,117,10,0,0,0,
117,10,0,0,0,70,105,108,101,70,105,110,100,101,114,117, 112,97,116,104,95,104,111,111,107,115,117,6,0,0,0,101,
9,0,0,0,112,97,116,104,95,104,111,111,107,117,9,0, 120,116,101,110,100,117,10,0,0,0,70,105,108,101,70,105,
0,0,109,101,116,97,95,112,97,116,104,117,15,0,0,0, 110,100,101,114,117,9,0,0,0,112,97,116,104,95,104,111,
66,117,105,108,116,105,110,73,109,112,111,114,116,101,114,117, 111,107,117,9,0,0,0,109,101,116,97,95,112,97,116,104,
14,0,0,0,70,114,111,122,101,110,73,109,112,111,114,116, 117,15,0,0,0,66,117,105,108,116,105,110,73,109,112,111,
101,114,117,10,0,0,0,80,97,116,104,70,105,110,100,101, 114,116,101,114,117,14,0,0,0,70,114,111,122,101,110,73,
114,40,6,0,0,0,117,10,0,0,0,115,121,115,95,109, 109,112,111,114,116,101,114,117,10,0,0,0,80,97,116,104,
111,100,117,108,101,117,11,0,0,0,95,105,109,112,95,109, 70,105,110,100,101,114,40,6,0,0,0,117,10,0,0,0,
111,100,117,108,101,117,10,0,0,0,101,120,116,101,110,115, 115,121,115,95,109,111,100,117,108,101,117,11,0,0,0,95,
105,111,110,115,117,6,0,0,0,115,111,117,114,99,101,117, 105,109,112,95,109,111,100,117,108,101,117,10,0,0,0,101,
8,0,0,0,98,121,116,101,99,111,100,101,117,17,0,0, 120,116,101,110,115,105,111,110,115,117,6,0,0,0,115,111,
0,115,117,112,112,111,114,116,101,100,95,108,111,97,100,101, 117,114,99,101,117,8,0,0,0,98,121,116,101,99,111,100,
114,115,40,0,0,0,0,40,0,0,0,0,117,29,0,0, 101,117,17,0,0,0,115,117,112,112,111,114,116,101,100,95,
0,60,102,114,111,122,101,110,32,105,109,112,111,114,116,108, 108,111,97,100,101,114,115,40,0,0,0,0,40,0,0,0,
105,98,46,95,98,111,111,116,115,116,114,97,112,62,117,8, 0,117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,
0,0,0,95,105,110,115,116,97,108,108,180,5,0,0,115, 112,111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,
14,0,0,0,0,2,13,1,21,1,15,1,15,1,15,1, 97,112,62,117,8,0,0,0,95,105,110,115,116,97,108,108,
28,1,117,8,0,0,0,95,105,110,115,116,97,108,108,78, 180,5,0,0,115,14,0,0,0,0,2,13,1,21,1,15,
40,3,0,0,0,117,3,0,0,0,119,105,110,117,6,0, 1,15,1,15,1,28,1,117,8,0,0,0,95,105,110,115,
0,0,99,121,103,119,105,110,117,6,0,0,0,100,97,114, 116,97,108,108,78,40,3,0,0,0,117,3,0,0,0,119,
119,105,110,40,65,0,0,0,117,7,0,0,0,95,95,100, 105,110,117,6,0,0,0,99,121,103,119,105,110,117,6,0,
111,99,95,95,117,27,0,0,0,95,67,65,83,69,95,73, 0,0,100,97,114,119,105,110,40,65,0,0,0,117,7,0,
78,83,69,78,83,73,84,73,86,69,95,80,76,65,84,70, 0,0,95,95,100,111,99,95,95,117,27,0,0,0,95,67,
79,82,77,83,117,16,0,0,0,95,109,97,107,101,95,114, 65,83,69,95,73,78,83,69,78,83,73,84,73,86,69,95,
101,108,97,120,95,99,97,115,101,117,7,0,0,0,95,119, 80,76,65,84,70,79,82,77,83,117,16,0,0,0,95,109,
95,108,111,110,103,117,7,0,0,0,95,114,95,108,111,110, 97,107,101,95,114,101,108,97,120,95,99,97,115,101,117,7,
103,117,10,0,0,0,95,112,97,116,104,95,106,111,105,110, 0,0,0,95,119,95,108,111,110,103,117,7,0,0,0,95,
117,11,0,0,0,95,112,97,116,104,95,115,112,108,105,116, 114,95,108,111,110,103,117,10,0,0,0,95,112,97,116,104,
117,18,0,0,0,95,112,97,116,104,95,105,115,95,109,111, 95,106,111,105,110,117,11,0,0,0,95,112,97,116,104,95,
100,101,95,116,121,112,101,117,12,0,0,0,95,112,97,116, 115,112,108,105,116,117,18,0,0,0,95,112,97,116,104,95,
104,95,105,115,102,105,108,101,117,11,0,0,0,95,112,97, 105,115,95,109,111,100,101,95,116,121,112,101,117,12,0,0,
116,104,95,105,115,100,105,114,117,13,0,0,0,95,119,114, 0,95,112,97,116,104,95,105,115,102,105,108,101,117,11,0,
105,116,101,95,97,116,111,109,105,99,117,5,0,0,0,95, 0,0,95,112,97,116,104,95,105,115,100,105,114,117,13,0,
119,114,97,112,117,4,0,0,0,116,121,112,101,117,8,0, 0,0,95,119,114,105,116,101,95,97,116,111,109,105,99,117,
0,0,95,95,99,111,100,101,95,95,117,10,0,0,0,95, 5,0,0,0,95,119,114,97,112,117,4,0,0,0,116,121,
99,111,100,101,95,116,121,112,101,117,10,0,0,0,110,101, 112,101,117,8,0,0,0,95,95,99,111,100,101,95,95,117,
119,95,109,111,100,117,108,101,117,13,0,0,0,95,109,111, 10,0,0,0,95,99,111,100,101,95,116,121,112,101,117,10,
100,117,108,101,95,108,111,99,107,115,117,12,0,0,0,95, 0,0,0,110,101,119,95,109,111,100,117,108,101,117,13,0,
98,108,111,99,107,105,110,103,95,111,110,117,12,0,0,0, 0,0,95,109,111,100,117,108,101,95,108,111,99,107,115,117,
82,117,110,116,105,109,101,69,114,114,111,114,117,14,0,0, 12,0,0,0,95,98,108,111,99,107,105,110,103,95,111,110,
0,95,68,101,97,100,108,111,99,107,69,114,114,111,114,117, 117,12,0,0,0,82,117,110,116,105,109,101,69,114,114,111,
11,0,0,0,95,77,111,100,117,108,101,76,111,99,107,117, 114,117,14,0,0,0,95,68,101,97,100,108,111,99,107,69,
16,0,0,0,95,68,117,109,109,121,77,111,100,117,108,101, 114,114,111,114,117,11,0,0,0,95,77,111,100,117,108,101,
76,111,99,107,117,16,0,0,0,95,103,101,116,95,109,111, 76,111,99,107,117,16,0,0,0,95,68,117,109,109,121,77,
100,117,108,101,95,108,111,99,107,117,19,0,0,0,95,108, 111,100,117,108,101,76,111,99,107,117,16,0,0,0,95,103,
111,99,107,95,117,110,108,111,99,107,95,109,111,100,117,108, 101,116,95,109,111,100,117,108,101,95,108,111,99,107,117,19,
101,117,8,0,0,0,95,80,89,67,65,67,72,69,117,15, 0,0,0,95,108,111,99,107,95,117,110,108,111,99,107,95,
0,0,0,83,79,85,82,67,69,95,83,85,70,70,73,88, 109,111,100,117,108,101,117,8,0,0,0,95,80,89,67,65,
69,83,117,23,0,0,0,68,69,66,85,71,95,66,89,84, 67,72,69,117,15,0,0,0,83,79,85,82,67,69,95,83,
69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,27, 85,70,70,73,88,69,83,117,23,0,0,0,68,69,66,85,
0,0,0,79,80,84,73,77,73,90,69,68,95,66,89,84, 71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,
69,67,79,68,69,95,83,85,70,70,73,88,69,83,117,17, 88,69,83,117,27,0,0,0,79,80,84,73,77,73,90,69,
0,0,0,66,89,84,69,67,79,68,69,95,83,85,70,70, 68,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,
73,88,69,83,117,4,0,0,0,78,111,110,101,117,17,0, 88,69,83,117,17,0,0,0,66,89,84,69,67,79,68,69,
0,0,99,97,99,104,101,95,102,114,111,109,95,115,111,117, 95,83,85,70,70,73,88,69,83,117,4,0,0,0,78,111,
114,99,101,117,16,0,0,0,95,118,101,114,98,111,115,101, 110,101,117,17,0,0,0,99,97,99,104,101,95,102,114,111,
95,109,101,115,115,97,103,101,117,11,0,0,0,115,101,116, 109,95,115,111,117,114,99,101,117,16,0,0,0,95,118,101,
95,112,97,99,107,97,103,101,117,10,0,0,0,115,101,116, 114,98,111,115,101,95,109,101,115,115,97,103,101,117,11,0,
95,108,111,97,100,101,114,117,17,0,0,0,109,111,100,117, 0,0,115,101,116,95,112,97,99,107,97,103,101,117,10,0,
108,101,95,102,111,114,95,108,111,97,100,101,114,117,11,0, 0,0,115,101,116,95,108,111,97,100,101,114,117,17,0,0,
0,0,95,99,104,101,99,107,95,110,97,109,101,117,17,0, 0,109,111,100,117,108,101,95,102,111,114,95,108,111,97,100,
0,0,95,114,101,113,117,105,114,101,115,95,98,117,105,108, 101,114,117,11,0,0,0,95,99,104,101,99,107,95,110,97,
116,105,110,117,16,0,0,0,95,114,101,113,117,105,114,101, 109,101,117,17,0,0,0,95,114,101,113,117,105,114,101,115,
115,95,102,114,111,122,101,110,117,15,0,0,0,66,117,105, 95,98,117,105,108,116,105,110,117,16,0,0,0,95,114,101,
108,116,105,110,73,109,112,111,114,116,101,114,117,14,0,0, 113,117,105,114,101,115,95,102,114,111,122,101,110,117,15,0,
0,70,114,111,122,101,110,73,109,112,111,114,116,101,114,117, 0,0,66,117,105,108,116,105,110,73,109,112,111,114,116,101,
13,0,0,0,95,76,111,97,100,101,114,66,97,115,105,99, 114,117,14,0,0,0,70,114,111,122,101,110,73,109,112,111,
115,117,12,0,0,0,83,111,117,114,99,101,76,111,97,100, 114,116,101,114,117,13,0,0,0,95,76,111,97,100,101,114,
101,114,117,10,0,0,0,70,105,108,101,76,111,97,100,101, 66,97,115,105,99,115,117,12,0,0,0,83,111,117,114,99,
114,117,16,0,0,0,83,111,117,114,99,101,70,105,108,101, 101,76,111,97,100,101,114,117,10,0,0,0,70,105,108,101,
76,111,97,100,101,114,117,20,0,0,0,83,111,117,114,99, 76,111,97,100,101,114,117,16,0,0,0,83,111,117,114,99,
101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,117, 101,70,105,108,101,76,111,97,100,101,114,117,20,0,0,0,
19,0,0,0,69,120,116,101,110,115,105,111,110,70,105,108, 83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
101,76,111,97,100,101,114,117,14,0,0,0,95,78,97,109, 97,100,101,114,117,19,0,0,0,69,120,116,101,110,115,105,
101,115,112,97,99,101,80,97,116,104,117,15,0,0,0,78, 111,110,70,105,108,101,76,111,97,100,101,114,117,14,0,0,
97,109,101,115,112,97,99,101,76,111,97,100,101,114,117,10, 0,95,78,97,109,101,115,112,97,99,101,80,97,116,104,117,
0,0,0,80,97,116,104,70,105,110,100,101,114,117,10,0, 15,0,0,0,78,97,109,101,115,112,97,99,101,76,111,97,
0,0,70,105,108,101,70,105,110,100,101,114,117,18,0,0, 100,101,114,117,10,0,0,0,80,97,116,104,70,105,110,100,
0,95,73,109,112,111,114,116,76,111,99,107,67,111,110,116, 101,114,117,10,0,0,0,70,105,108,101,70,105,110,100,101,
101,120,116,117,13,0,0,0,95,114,101,115,111,108,118,101, 114,117,18,0,0,0,95,73,109,112,111,114,116,76,111,99,
95,110,97,109,101,117,12,0,0,0,95,102,105,110,100,95, 107,67,111,110,116,101,120,116,117,13,0,0,0,95,114,101,
109,111,100,117,108,101,117,13,0,0,0,95,115,97,110,105, 115,111,108,118,101,95,110,97,109,101,117,12,0,0,0,95,
116,121,95,99,104,101,99,107,117,8,0,0,0,95,69,82, 102,105,110,100,95,109,111,100,117,108,101,117,13,0,0,0,
82,95,77,83,71,117,23,0,0,0,95,102,105,110,100,95, 95,115,97,110,105,116,121,95,99,104,101,99,107,117,8,0,
97,110,100,95,108,111,97,100,95,117,110,108,111,99,107,101, 0,0,95,69,82,82,95,77,83,71,117,23,0,0,0,95,
100,117,14,0,0,0,95,102,105,110,100,95,97,110,100,95, 102,105,110,100,95,97,110,100,95,108,111,97,100,95,117,110,
108,111,97,100,117,11,0,0,0,95,103,99,100,95,105,109, 108,111,99,107,101,100,117,14,0,0,0,95,102,105,110,100,
112,111,114,116,117,16,0,0,0,95,104,97,110,100,108,101, 95,97,110,100,95,108,111,97,100,117,11,0,0,0,95,103,
95,102,114,111,109,108,105,115,116,117,17,0,0,0,95,99, 99,100,95,105,109,112,111,114,116,117,16,0,0,0,95,104,
97,108,99,95,95,95,112,97,99,107,97,103,101,95,95,117, 97,110,100,108,101,95,102,114,111,109,108,105,115,116,117,17,
10,0,0,0,95,95,105,109,112,111,114,116,95,95,117,13, 0,0,0,95,99,97,108,99,95,95,95,112,97,99,107,97,
0,0,0,95,77,65,71,73,67,95,78,85,77,66,69,82, 103,101,95,95,117,10,0,0,0,95,95,105,109,112,111,114,
117,4,0,0,0,95,84,65,71,117,6,0,0,0,95,115, 116,95,95,117,13,0,0,0,95,77,65,71,73,67,95,78,
101,116,117,112,117,8,0,0,0,95,105,110,115,116,97,108, 85,77,66,69,82,117,4,0,0,0,95,84,65,71,117,6,
108,40,0,0,0,0,40,0,0,0,0,40,0,0,0,0, 0,0,0,95,115,101,116,117,112,117,8,0,0,0,95,105,
117,29,0,0,0,60,102,114,111,122,101,110,32,105,109,112, 110,115,116,97,108,108,40,0,0,0,0,40,0,0,0,0,
111,114,116,108,105,98,46,95,98,111,111,116,115,116,114,97, 40,0,0,0,0,117,29,0,0,0,60,102,114,111,122,101,
112,62,117,8,0,0,0,60,109,111,100,117,108,101,62,8, 110,32,105,109,112,111,114,116,108,105,98,46,95,98,111,111,
0,0,0,115,120,0,0,0,6,21,6,3,12,13,12,16, 116,115,116,114,97,112,62,117,8,0,0,0,60,109,111,100,
12,13,12,12,12,12,12,10,12,6,12,7,12,21,12,8, 117,108,101,62,8,0,0,0,115,120,0,0,0,6,21,6,
15,3,12,12,6,2,6,3,22,4,19,68,19,23,12,17, 3,12,13,12,16,12,13,12,12,12,12,12,10,12,6,12,
12,21,6,2,9,2,9,1,9,2,6,4,15,22,12,8, 7,12,21,12,8,15,3,12,12,6,2,6,3,22,4,19,
12,13,12,11,12,51,12,18,12,11,12,13,19,57,19,54, 68,19,23,12,17,12,21,6,2,9,2,9,1,9,2,6,
19,79,22,111,19,29,25,38,25,24,19,40,19,55,19,18, 4,15,22,12,8,12,13,12,11,12,51,12,18,12,11,12,
19,81,19,135,19,13,12,9,12,17,12,17,6,2,12,46, 13,19,57,19,54,19,79,22,111,19,29,25,38,25,24,19,
12,13,18,25,12,23,12,15,24,30,6,1,6,3,12,64, 40,19,55,19,18,19,81,19,135,19,13,12,9,12,17,12,
17,6,2,12,46,12,13,18,25,12,23,12,15,24,30,6,
1,6,3,12,64,
}; };