bpo-36842: Implement PEP 578 (GH-12613)

Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.
diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
index 27d3f76..fd3f691 100644
--- a/Doc/c-api/code.rst
+++ b/Doc/c-api/code.rst
@@ -40,6 +40,7 @@
    :c:func:`PyCode_New` directly can bind you to a precise Python
    version since the definition of the bytecode changes often.
 
+   .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags"
 
 .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
 
diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst
index defc859..543dc60 100644
--- a/Doc/c-api/file.rst
+++ b/Doc/c-api/file.rst
@@ -60,6 +60,32 @@
    raised if the end of the file is reached immediately.
 
 
+.. c:function:: int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction handler)
+
+   Overrides the normal behavior of :func:`io.open_code` to pass its parameter
+   through the provided handler.
+
+   The handler is a function of type :c:type:`PyObject *(\*)(PyObject *path,
+   void *userData)`, where *path* is guaranteed to be :c:type:`PyUnicodeObject`.
+
+   The *userData* pointer is passed into the hook function. Since hook
+   functions may be called from different runtimes, this pointer should not
+   refer directly to Python state.
+
+   As this hook is intentionally used during import, avoid importing new modules
+   during its execution unless they are known to be frozen or available in
+   ``sys.modules``.
+
+   Once a hook has been set, it cannot be removed or replaced, and later calls to
+   :c:func:`PyFile_SetOpenCodeHook` will fail. On failure, the function returns
+   -1 and sets an exception if the interpreter has been initialized.
+
+   This function is safe to call before :c:func:`Py_Initialize`.
+
+   .. versionadded:: 3.8
+
+
+
 .. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)
 
    .. index:: single: Py_PRINT_RAW
diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst
index 04e169a..2091da6 100644
--- a/Doc/c-api/sys.rst
+++ b/Doc/c-api/sys.rst
@@ -289,6 +289,56 @@
    .. versionadded:: 3.2
 
 
+.. c:function:: int PySys_Audit(const char *event, const char *format, ...)
+
+   .. index:: single: audit events
+
+   Raises an auditing event with any active hooks. Returns zero for success
+   and non-zero with an exception set on failure.
+
+   If any hooks have been added, *format* and other arguments will be used
+   to construct a tuple to pass. Apart from ``N``, the same format characters
+   as used in :c:func:`Py_BuildValue` are available. If the built value is not
+   a tuple, it will be added into a single-element tuple. (The ``N`` format
+   option consumes a reference, but since there is no way to know whether
+   arguments to this function will be consumed, using it may cause reference
+   leaks.)
+
+   :func:`sys.audit` performs the same function from Python code.
+
+   .. versionadded:: 3.8
+
+
+.. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
+
+   .. index:: single: audit events
+
+   Adds to the collection of active auditing hooks. Returns zero for success
+   and non-zero on failure. If the runtime has been initialized, also sets an
+   error on failure. Hooks added through this API are called for all
+   interpreters created by the runtime.
+
+   This function is safe to call before :c:func:`Py_Initialize`. When called
+   after runtime initialization, existing audit hooks are notified and may
+   silently abort the operation by raising an error subclassed from
+   :class:`Exception` (other errors will not be silenced).
+
+   The hook function is of type :c:type:`int (*)(const char *event, PyObject
+   *args, void *userData)`, where *args* is guaranteed to be a
+   :c:type:`PyTupleObject`. The hook function is always called with the GIL
+   held by the Python interpreter that raised the event.
+
+   The *userData* pointer is passed into the hook function. Since hook
+   functions may be called from different runtimes, this pointer should not
+   refer directly to Python state.
+
+   See :pep:`578` for a detailed decription of auditing. Functions in the
+   runtime and standard library that raise events include the details in each
+   function's documentation.
+
+   .. versionadded:: 3.8
+
+
 .. _processcontrol:
 
 Process Control
diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst
index 50cde35..909deb5 100644
--- a/Doc/howto/instrumentation.rst
+++ b/Doc/howto/instrumentation.rst
@@ -332,6 +332,15 @@
    .. versionadded:: 3.7
 
 
+.. c:function:: audit(str event, void *tuple)
+
+   Fires when :func:`sys.audit` or :c:func:`PySys_Audit` is called.
+   ``arg0`` is the event name as C string, ``arg1`` is a :c:type:`PyObject`
+   pointer to a tuple object.
+
+   .. versionadded:: 3.8
+
+
 SystemTap Tapsets
 -----------------
 
diff --git a/Doc/library/array.rst b/Doc/library/array.rst
index 4ac7bb5..1f95dd6 100644
--- a/Doc/library/array.rst
+++ b/Doc/library/array.rst
@@ -83,6 +83,7 @@
    to add initial items to the array.  Otherwise, the iterable initializer is
    passed to the :meth:`extend` method.
 
+   .. audit-event:: array.__new__ "typecode initializer"
 
 .. data:: typecodes
 
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 1c60b4b..97172c5 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -1509,6 +1509,17 @@
    :c:type:`int`, which is of course not always the truth, so you have to assign
    the correct :attr:`restype` attribute to use these functions.
 
+.. audit-event:: ctypes.dlopen name
+
+   Loading a library through any of these objects raises an
+   :ref:`auditing event <auditing>` ``ctypes.dlopen`` with string argument
+   ``name``, the name used to load the library.
+
+.. audit-event:: ctypes.dlsym "library name"
+
+   Accessing a function on a loaded library raises an auditing event
+   ``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name``
+   (the symbol's name as a string or integer).
 
 .. _ctypes-foreign-functions:
 
@@ -2032,6 +2043,12 @@
       This method returns a ctypes type instance using the memory specified by
       *address* which must be an integer.
 
+      .. audit-event:: ctypes.cdata address
+
+         This method, and others that indirectly call this method, raises an
+         :func:`auditing event <sys.audit>` ``ctypes.cdata`` with argument
+         ``address``.
+
    .. method:: from_param(obj)
 
       This method adapts *obj* to a ctypes type.  It is called with the actual
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 1a9a8b5..7170a78 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -275,6 +275,12 @@
    If you want to parse Python code into its AST representation, see
    :func:`ast.parse`.
 
+   .. audit-event:: compile "source filename"
+
+      Raises an :func:`auditing event <sys.audit>` ``compile`` with arguments
+      ``source`` and ``filename``. This event may also be raised by implicit
+      compilation.
+
    .. note::
 
       When compiling a string with multi-line code in ``'single'`` or
@@ -473,6 +479,11 @@
    See :func:`ast.literal_eval` for a function that can safely evaluate strings
    with expressions containing only literals.
 
+   .. audit-event:: exec code_object
+
+      Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as
+      the argument. Code compilation events may also be raised.
+
 .. index:: builtin: exec
 
 .. function:: exec(object[, globals[, locals]])
@@ -502,6 +513,11 @@
    builtins are available to the executed code by inserting your own
    ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`.
 
+   .. audit-event:: exec code_object
+
+      Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as
+      the argument. Code compilation events may also be raised.
+
    .. note::
 
       The built-in functions :func:`globals` and :func:`locals` return the current
@@ -747,6 +763,16 @@
    If the :mod:`readline` module was loaded, then :func:`input` will use it
    to provide elaborate line editing and history features.
 
+   .. audit-event:: builtins.input prompt
+
+      Raises an :func:`auditing event <sys.audit>` ``builtins.input`` with
+      argument ``prompt`` before reading input
+
+   .. audit-event:: builtins.input/result result
+
+      Raises an auditing event ``builtins.input/result`` with the result after
+      successfully reading input.
+
 
 .. class:: int([x])
            int(x, base=10)
@@ -1176,6 +1202,11 @@
    (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`,
    and :mod:`shutil`.
 
+   .. audit-event:: open "file mode flags"
+
+   The ``mode`` and ``flags`` arguments may have been modified or inferred from
+   the original call.
+
    .. versionchanged::
       3.3
 
diff --git a/Doc/library/io.rst b/Doc/library/io.rst
index 0f12516..2fb27c3 100644
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -120,6 +120,27 @@
 
    This is an alias for the builtin :func:`open` function.
 
+   .. audit-event:: open "path mode flags"
+
+      This function raises an :func:`auditing event <sys.audit>` ``open`` with
+      arguments ``path``, ``mode`` and ``flags``. The ``mode`` and ``flags``
+      arguments may have been modified or inferred from the original call.
+
+
+.. function:: open_code(path)
+
+   Opens the provided file with mode ``'rb'``. This function should be used
+   when the intent is to treat the contents as executable code.
+
+   ``path`` should be an absolute path.
+
+   The behavior of this function may be overridden by an earlier call to the
+   :c:func:`PyFile_SetOpenCodeHook`, however, it should always be considered
+   interchangeable with ``open(path, 'rb')``. Overriding the behavior is
+   intended for additional validation or preprocessing of the file.
+
+   .. versionadded:: 3.8
+
 
 .. exception:: BlockingIOError
 
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst
index 0f895d7..a82caf8 100644
--- a/Doc/library/mmap.rst
+++ b/Doc/library/mmap.rst
@@ -67,6 +67,7 @@
    will be relative to the offset from the beginning of the file. *offset*
    defaults to 0.  *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`.
 
+   .. audit-event:: mmap.__new__ "fileno length access offset"
 
 .. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
    :noindex:
@@ -155,6 +156,7 @@
 
           mm.close()
 
+   .. audit-event:: mmap.__new__ "fileno length access offset"
 
    Memory-mapped file objects support the following methods:
 
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 0bbfce9..6df2b49 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -651,7 +651,7 @@
 File Object Creation
 --------------------
 
-This function creates new :term:`file objects <file object>`.  (See also
+These functions create new :term:`file objects <file object>`.  (See also
 :func:`~os.open` for opening file descriptors.)
 
 
@@ -829,11 +829,14 @@
    most *length* bytes in size.  As of Python 3.3, this is equivalent to
    ``os.truncate(fd, length)``.
 
+   .. audit-event:: os.truncate "fd length"
+
    .. availability:: Unix, Windows.
 
    .. versionchanged:: 3.5
       Added support for Windows
 
+
 .. function:: get_blocking(fd)
 
    Get the blocking mode of the file descriptor: ``False`` if the
@@ -845,6 +848,7 @@
 
    .. versionadded:: 3.5
 
+
 .. function:: isatty(fd)
 
    Return ``True`` if the file descriptor *fd* is open and connected to a
@@ -912,6 +916,8 @@
    This function can support :ref:`paths relative to directory descriptors
    <dir_fd>` with the *dir_fd* parameter.
 
+   .. audit-event:: open "path mode flags"
+
    .. versionchanged:: 3.4
       The new file descriptor is now non-inheritable.
 
@@ -2756,6 +2762,8 @@
 
    This function can support :ref:`specifying a file descriptor <path_fd>`.
 
+   .. audit-event:: os.truncate "path length"
+
    .. availability:: Unix, Windows.
 
    .. versionadded:: 3.3
@@ -3715,6 +3723,8 @@
    to using this function.  See the :ref:`subprocess-replacements` section in
    the :mod:`subprocess` documentation for some helpful recipes.
 
+   .. audit-event:: os.system command
+
    .. availability:: Unix, Windows.
 
 
diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst
index 27721e6..f4c41ac 100644
--- a/Doc/library/pickle.rst
+++ b/Doc/library/pickle.rst
@@ -427,6 +427,7 @@
       how they can be loaded, potentially reducing security risks. Refer to
       :ref:`pickle-restrict` for details.
 
+      .. audit-event:: pickle.find_class "module name"
 
 .. _pickle-picklable:
 
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 379633a..e23a4f5 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -526,6 +526,8 @@
 
    The newly created socket is :ref:`non-inheritable <fd_inheritance>`.
 
+   .. audit-event:: socket.__new__ "self family type protocol"
+
    .. versionchanged:: 3.3
       The AF_CAN family was added.
       The AF_RDS family was added.
@@ -718,6 +720,8 @@
    :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect`
    method.
 
+   .. audit-event:: socket.getaddrinfo "host port family type protocol"
+
    The following example fetches address information for a hypothetical TCP
    connection to ``example.org`` on port 80 (results may differ on your
    system if IPv6 isn't enabled)::
@@ -753,6 +757,8 @@
    interface. :func:`gethostbyname` does not support IPv6 name resolution, and
    :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support.
 
+   .. audit-event:: socket.gethostbyname hostname
+
 
 .. function:: gethostbyname_ex(hostname)
 
@@ -765,12 +771,16 @@
    resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual
    stack support.
 
+   .. audit-event:: socket.gethostbyname hostname
+
 
 .. function:: gethostname()
 
    Return a string containing the hostname of the machine where  the Python
    interpreter is currently executing.
 
+   .. audit-event:: socket.gethostname
+
    Note: :func:`gethostname` doesn't always return the fully qualified domain
    name; use :func:`getfqdn` for that.
 
@@ -785,6 +795,8 @@
    domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports
    both IPv4 and IPv6.
 
+   .. audit-event:: socket.gethostbyaddr ip_address
+
 
 .. function:: getnameinfo(sockaddr, flags)
 
@@ -798,6 +810,8 @@
 
    For more information about *flags* you can consult :manpage:`getnameinfo(3)`.
 
+   .. audit-event:: socket.getnameinfo sockaddr
+
 .. function:: getprotobyname(protocolname)
 
    Translate an Internet protocol name (for example, ``'icmp'``) to a constant
@@ -813,6 +827,8 @@
    service.  The optional protocol name, if given, should be ``'tcp'`` or
    ``'udp'``, otherwise any protocol will match.
 
+   .. audit-event:: socket.getservbyname "servicename protocolname"
+
 
 .. function:: getservbyport(port[, protocolname])
 
@@ -820,6 +836,8 @@
    service.  The optional protocol name, if given, should be ``'tcp'`` or
    ``'udp'``, otherwise any protocol will match.
 
+   .. audit-event:: socket.getservbyport "port protocolname"
+
 
 .. function:: ntohl(x)
 
@@ -1003,6 +1021,8 @@
    Set the machine's hostname to *name*.  This will raise an
    :exc:`OSError` if you don't have enough rights.
 
+   .. audit-event:: socket.sethostname name
+
    .. availability:: Unix.
 
    .. versionadded:: 3.3
@@ -1078,6 +1098,7 @@
    Bind the socket to *address*.  The socket must not already be bound. (The format
    of *address* depends on the address family --- see above.)
 
+   .. audit-event:: socket.bind "self address"
 
 .. method:: socket.close()
 
@@ -1115,6 +1136,8 @@
    :exc:`InterruptedError` exception if the connection is interrupted by a
    signal (or the exception raised by the signal handler).
 
+   .. audit-event:: socket.connect "self address"
+
    .. versionchanged:: 3.5
       The method now waits until the connection completes instead of raising an
       :exc:`InterruptedError` exception if the connection is interrupted by a
@@ -1131,6 +1154,7 @@
    :c:data:`errno` variable.  This is useful to support, for example, asynchronous
    connects.
 
+   .. audit-event:: socket.connect "self address"
 
 .. method:: socket.detach()
 
@@ -1472,6 +1496,8 @@
    bytes sent. (The format of *address* depends on the address family --- see
    above.)
 
+   .. audit-event:: socket.sendto "self address"
+
    .. versionchanged:: 3.5
       If the system call is interrupted and the signal handler does not raise
       an exception, the method now retries the system call instead of raising
@@ -1511,6 +1537,8 @@
 
    .. availability:: most Unix platforms, possibly others.
 
+   .. audit-event:: socket.sendmsg "self address"
+
    .. versionadded:: 3.3
 
    .. versionchanged:: 3.5
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 3b754bd..0294f74 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -19,6 +19,30 @@
    .. versionadded:: 3.2
 
 
+.. function:: addaudithook(hook)
+
+   Adds the callable *hook* to the collection of active auditing hooks for the
+   current interpreter.
+
+   When an auditing event is raised through the :func:`sys.audit` function, each
+   hook will be called in the order it was added with the event name and the
+   tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` are
+   called first, followed by hooks added in the current interpreter.
+
+   Calling this function will trigger an event for all existing hooks, and if
+   any raise an exception derived from :class:`Exception`, the add will be
+   silently ignored. As a result, callers cannot assume that their hook has been
+   added unless they control all existing hooks.
+
+   .. versionadded:: 3.8
+
+   .. impl-detail::
+
+      When tracing is enabled, Python hooks are only traced if the callable has
+      a ``__cantrace__`` member that is set to a true value. Otherwise, trace
+      functions will not see the hook.
+
+
 .. data:: argv
 
    The list of command line arguments passed to a Python script. ``argv[0]`` is the
@@ -37,6 +61,30 @@
       ``[os.fsencode(arg) for arg in sys.argv]``.
 
 
+.. _auditing:
+
+.. function:: audit(event, *args)
+
+   .. index:: single: auditing
+
+   Raises an auditing event with any active hooks. The event name is a string
+   identifying the event and its associated schema, which is the number and
+   types of arguments. The schema for a given event is considered public and
+   stable API and should not be modified between releases.
+
+   This function will raise the first exception raised by any hook. In general,
+   these errors should not be handled and should terminate the process as
+   quickly as possible.
+
+   Hooks are added using the :func:`sys.addaudithook` or
+   :c:func:`PySys_AddAuditHook` functions.
+
+   The native equivalent of this function is :c:func:`PySys_Audit`. Using the
+   native function is preferred when possible.
+
+   .. versionadded:: 3.8
+
+
 .. data:: base_exec_prefix
 
    Set during Python startup, before ``site.py`` is run, to the same value as
@@ -114,6 +162,8 @@
 
    This function should be used for internal and specialized purposes only.
 
+   .. audit-event:: sys._current_frames
+
 
 .. function:: breakpointhook()
 
@@ -617,6 +667,8 @@
    that is deeper than the call stack, :exc:`ValueError` is raised.  The default
    for *depth* is zero, returning the frame at the top of the call stack.
 
+   .. audit-event:: sys._getframe
+
    .. impl-detail::
 
       This function should be used for internal and specialized purposes only.
@@ -1146,6 +1198,8 @@
    ``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends
    on the event type.
 
+   .. audit-event:: sys.setprofile
+
    The events have the following meaning:
 
    ``'call'``
@@ -1266,6 +1320,8 @@
 
    For more information on code and frame objects, refer to :ref:`types`.
 
+   .. audit-event:: sys.settrace
+
    .. impl-detail::
 
       The :func:`settrace` function is intended only for implementing debuggers,
@@ -1286,6 +1342,13 @@
    first time. The *finalizer* will be called when an asynchronous generator
    is about to be garbage collected.
 
+   .. audit-event:: sys.set_asyncgen_hooks_firstiter
+
+   .. audit-event:: sys.set_asyncgen_hooks_finalizer
+
+   Two auditing events are raised because the underlying API consists of two
+   calls, each of which must raise its own event.
+
    .. versionadded:: 3.6
       See :pep:`525` for more details, and for a reference example of a
       *finalizer* method see the implementation of
diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
index 14fa27b..1895ae7 100644
--- a/Doc/library/urllib.request.rst
+++ b/Doc/library/urllib.request.rst
@@ -95,6 +95,12 @@
    parameter to ``urllib.urlopen``, can be obtained by using
    :class:`ProxyHandler` objects.
 
+   .. audit-event:: urllib.request "fullurl data headers method"
+
+      The default opener raises an :func:`auditing event <sys.audit>`
+      ``urllib.request`` with arguments ``fullurl``, ``data``, ``headers``,
+      ``method`` taken from the request object.
+
    .. versionchanged:: 3.2
       *cafile* and *capath* were added.
 
@@ -118,6 +124,7 @@
        :func:`ssl.create_default_context` select the system's trusted CA
        certificates for you.
 
+
 .. function:: install_opener(opener)
 
    Install an :class:`OpenerDirector` instance as the default global opener.
diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py
index e097c13..f79b250 100644
--- a/Doc/tools/extensions/pyspecific.py
+++ b/Doc/tools/extensions/pyspecific.py
@@ -151,6 +151,45 @@
         return [pnode]
 
 
+# Support for documenting audit event
+
+class AuditEvent(Directive):
+
+    has_content = True
+    required_arguments = 1
+    optional_arguments = 1
+    final_argument_whitespace = True
+
+    _label = [
+        "Raises an :ref:`auditing event <auditing>` {name} with no arguments.",
+        "Raises an :ref:`auditing event <auditing>` {name} with argument {args}.",
+        "Raises an :ref:`auditing event <auditing>` {name} with arguments {args}.",
+    ]
+
+    def run(self):
+        if len(self.arguments) >= 2 and self.arguments[1]:
+            args = [
+                "``{}``".format(a.strip())
+                for a in self.arguments[1].strip("'\"").split()
+                if a.strip()
+            ]
+        else:
+            args = []
+
+        label = translators['sphinx'].gettext(self._label[min(2, len(args))])
+        text = label.format(name="``{}``".format(self.arguments[0]),
+                            args=", ".join(args))
+
+        pnode = nodes.paragraph(text, classes=["audit-hook"])
+        if self.content:
+            self.state.nested_parse(self.content, self.content_offset, pnode)
+        else:
+            n, m = self.state.inline_text(text, self.lineno)
+            pnode.extend(n + m)
+
+        return [pnode]
+
+
 # Support for documenting decorators
 
 class PyDecoratorMixin(object):
@@ -424,6 +463,7 @@
     app.add_role('source', source_role)
     app.add_directive('impl-detail', ImplementationDetail)
     app.add_directive('availability', Availability)
+    app.add_directive('audit-event', AuditEvent)
     app.add_directive('deprecated-removed', DeprecatedRemoved)
     app.add_builder(PydocTopicsBuilder)
     app.add_builder(suspicious.CheckSuspiciousMarkupBuilder)
diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h
new file mode 100644
index 0000000..57eac13
--- /dev/null
+++ b/Include/cpython/fileobject.h
@@ -0,0 +1,32 @@
+#ifndef Py_CPYTHON_FILEOBJECT_H
+#  error "this header file must not be included directly"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
+
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
+PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
+#endif
+
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
+PyAPI_DATA(int) Py_UTF8Mode;
+#endif
+
+/* The std printer acts as a preliminary sys.stderr until the new io
+   infrastructure is in place. */
+PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int);
+PyAPI_DATA(PyTypeObject) PyStdPrinter_Type;
+
+typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *);
+
+PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path);
+PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path);
+PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h
new file mode 100644
index 0000000..72d8ffe
--- /dev/null
+++ b/Include/cpython/sysmodule.h
@@ -0,0 +1,21 @@
+#ifndef Py_CPYTHON_SYSMODULE_H
+#  error "this header file must not be included directly"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key);
+PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *);
+
+PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
+
+typedef int(*Py_AuditHookFunction)(const char *, PyObject *, void *);
+
+PyAPI_FUNC(int) PySys_Audit(const char*, const char *, ...);
+PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Include/fileobject.h b/Include/fileobject.h
index 89e8dd6..456887e 100644
--- a/Include/fileobject.h
+++ b/Include/fileobject.h
@@ -15,32 +15,13 @@
 PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int);
 PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *);
 PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *);
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
-#endif
 
 /* The default encoding used by the platform file system APIs
    If non-NULL, this is different than the default encoding for strings
 */
 PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
-#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
-PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
-#endif
 PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding;
 
-#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
-PyAPI_DATA(int) Py_UTF8Mode;
-#endif
-
-/* Internal API
-
-   The std printer acts as a preliminary sys.stderr until the new io
-   infrastructure is in place. */
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int);
-PyAPI_DATA(PyTypeObject) PyStdPrinter_Type;
-#endif /* Py_LIMITED_API */
-
 /* A routine to check if a file descriptor can be select()-ed. */
 #ifdef _MSC_VER
     /* On Windows, any socket fd can be select()-ed, no matter how high */
@@ -49,6 +30,12 @@
     #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE)
 #endif
 
+#ifndef Py_LIMITED_API
+#  define Py_CPYTHON_FILEOBJECT_H
+#  include  "cpython/fileobject.h"
+#  undef Py_CPYTHON_FILEOBJECT_H
+#endif
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index 1561328..ef1d8a0 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -9,8 +9,10 @@
 #endif
 
 #include "cpython/coreconfig.h"
+#include "fileobject.h"
 #include "pystate.h"
 #include "pythread.h"
+#include "sysmodule.h"
 
 #include "pycore_gil.h"   /* _gil_runtime_state  */
 #include "pycore_pathconfig.h"
@@ -131,6 +133,8 @@
     uint64_t tstate_next_unique_id;
 
     struct _warnings_runtime_state warnings;
+
+    PyObject *audit_hooks;
 };
 
 PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T);
@@ -154,6 +158,13 @@
     struct _xidregitem *next;
 };
 
+/* runtime audit hook state */
+
+typedef struct _Py_AuditHookEntry {
+    struct _Py_AuditHookEntry *next;
+    Py_AuditHookFunction hookCFunction;
+    void *userData;
+} _Py_AuditHookEntry;
 
 /* GIL state */
 
@@ -224,6 +235,11 @@
     struct _gilstate_runtime_state gilstate;
 
     _PyPreConfig preconfig;
+
+    Py_OpenCodeHookFunction open_code_hook;
+    void *open_code_userdata;
+    _Py_AuditHookEntry *audit_hook_head;
+
     // XXX Consolidate globals found via the check-c-globals script.
 } _PyRuntimeState;
 
diff --git a/Include/pydtrace.d b/Include/pydtrace.d
index a6a5e7e..5e6a626 100644
--- a/Include/pydtrace.d
+++ b/Include/pydtrace.d
@@ -12,6 +12,7 @@
     probe gc__done(long);
     probe import__find__load__start(const char *);
     probe import__find__load__done(const char *, int);
+    probe audit(const char *, void *);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider python provider
diff --git a/Include/pydtrace.h b/Include/pydtrace.h
index 7a04278..75f8e7f 100644
--- a/Include/pydtrace.h
+++ b/Include/pydtrace.h
@@ -36,6 +36,7 @@
 static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {}
 static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {}
 static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {}
+static inline void PyDTrace_AUDIT(const char *arg0, void *arg1) {}
 
 static inline int PyDTrace_LINE_ENABLED(void) { return 0; }
 static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; }
@@ -48,6 +49,7 @@
 static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; }
 static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; }
 static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; }
+static inline int PyDTrace_AUDIT_ENABLED(void) { return 0; }
 
 #endif /* !WITH_DTRACE */
 
diff --git a/Include/sysmodule.h b/Include/sysmodule.h
index c5547ff..670e5d2 100644
--- a/Include/sysmodule.h
+++ b/Include/sysmodule.h
@@ -9,10 +9,6 @@
 
 PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
 PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key);
-PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *);
-#endif
 
 PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
 PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int);
@@ -34,7 +30,9 @@
 PyAPI_FUNC(PyObject *) PySys_GetXOptions(void);
 
 #ifndef Py_LIMITED_API
-PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
+#  define Py_CPYTHON_SYSMODULE_H
+#  include  "cpython/sysmodule.h"
+#  undef Py_CPYTHON_SYSMODULE_H
 #endif
 
 #ifdef __cplusplus
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index be5e426..5baca4d 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -254,6 +254,29 @@
         result.close()
         raise
 
+# Define a default pure-Python implementation for open_code()
+# that does not allow hooks. Warn on first use. Defined for tests.
+def _open_code_with_warning(path):
+    """Opens the provided file with mode ``'rb'``. This function
+    should be used when the intent is to treat the contents as
+    executable code.
+
+    ``path`` should be an absolute path.
+
+    When supported by the runtime, this function can be hooked
+    in order to allow embedders more control over code files.
+    This functionality is not supported on the current runtime.
+    """
+    import warnings
+    warnings.warn("_pyio.open_code() may not be using hooks",
+                  RuntimeWarning, 2)
+    return open(path, "rb")
+
+try:
+    open_code = io.open_code
+except AttributeError:
+    open_code = _open_code_with_warning
+
 
 class DocDescriptor:
     """Helper for builtins.open.__doc__
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index f8ff5f4..7da0cd0 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -963,8 +963,12 @@
 
     def get_data(self, path):
         """Return the data from path as raw bytes."""
-        with _io.FileIO(path, 'r') as file:
-            return file.read()
+        if isinstance(self, (SourceLoader, ExtensionFileLoader)):
+            with _io.open_code(str(path)) as file:
+                return file.read()
+        else:
+            with _io.FileIO(path, 'r') as file:
+                return file.read()
 
     # ResourceReader ABC API.
 
diff --git a/Lib/io.py b/Lib/io.py
index 968ee50..fbce6ef 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -41,8 +41,8 @@
               "Amaury Forgeot d'Arc <amauryfa@gmail.com>, "
               "Benjamin Peterson <benjamin@python.org>")
 
-__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
-           "BytesIO", "StringIO", "BufferedIOBase",
+__all__ = ["BlockingIOError", "open", "open_code", "IOBase", "RawIOBase",
+           "FileIO", "BytesIO", "StringIO", "BufferedIOBase",
            "BufferedReader", "BufferedWriter", "BufferedRWPair",
            "BufferedRandom", "TextIOBase", "TextIOWrapper",
            "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"]
@@ -52,7 +52,7 @@
 import abc
 
 from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation,
-                 open, FileIO, BytesIO, StringIO, BufferedReader,
+                 open, open_code, FileIO, BytesIO, StringIO, BufferedReader,
                  BufferedWriter, BufferedRWPair, BufferedRandom,
                  IncrementalNewlineDecoder, TextIOWrapper)
 
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 595beda..be8e381 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -1436,6 +1436,7 @@
 
     def find_class(self, module, name):
         # Subclasses may override this.
+        sys.audit('pickle.find_class', module, name)
         if self.proto < 3 and self.fix_imports:
             if (module, name) in _compat_pickle.NAME_MAPPING:
                 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py
index 9a6585a..8493114 100644
--- a/Lib/test/libregrtest/setup.py
+++ b/Lib/test/libregrtest/setup.py
@@ -107,6 +107,12 @@
 
     support.use_resources = ns.use_resources
 
+    if hasattr(sys, 'addaudithook'):
+        # Add an auditing hook for all tests to ensure PySys_Audit is tested
+        def _test_audit_hook(name, args):
+            pass
+        sys.addaudithook(_test_audit_hook)
+
 
 def replace_stdout():
     """Set stdout encoder error handler to backslashreplace (as stderr error
diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
new file mode 100644
index 0000000..5b33d97
--- /dev/null
+++ b/Lib/test/test_audit.py
@@ -0,0 +1,260 @@
+"""Tests for sys.audit and sys.addaudithook
+"""
+
+import os
+import subprocess
+import sys
+import unittest
+from test import support
+
+if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"):
+    raise unittest.SkipTest("test only relevant when sys.audit is available")
+
+
+class TestHook:
+    """Used in standard hook tests to collect any logged events.
+
+    Should be used in a with block to ensure that it has no impact
+    after the test completes. Audit hooks cannot be removed, so the
+    best we can do for the test run is disable it by calling close().
+    """
+
+    def __init__(self, raise_on_events=None, exc_type=RuntimeError):
+        self.raise_on_events = raise_on_events or ()
+        self.exc_type = exc_type
+        self.seen = []
+        self.closed = False
+
+    def __enter__(self, *a):
+        sys.addaudithook(self)
+        return self
+
+    def __exit__(self, *a):
+        self.close()
+
+    def close(self):
+        self.closed = True
+
+    @property
+    def seen_events(self):
+        return [i[0] for i in self.seen]
+
+    def __call__(self, event, args):
+        if self.closed:
+            return
+        self.seen.append((event, args))
+        if event in self.raise_on_events:
+            raise self.exc_type("saw event " + event)
+
+
+class TestFinalizeHook:
+    """Used in the test_finalize_hooks function to ensure that hooks
+    are correctly cleaned up, that they are notified about the cleanup,
+    and are unable to prevent it.
+    """
+
+    def __init__(self):
+        print("Created", id(self), file=sys.stderr, flush=True)
+
+    def __call__(self, event, args):
+        # Avoid recursion when we call id() below
+        if event == "builtins.id":
+            return
+
+        print(event, id(self), file=sys.stderr, flush=True)
+
+        if event == "cpython._PySys_ClearAuditHooks":
+            raise RuntimeError("Should be ignored")
+        elif event == "cpython.PyInterpreterState_Clear":
+            raise RuntimeError("Should be ignored")
+
+
+def run_finalize_test():
+    """Called by test_finalize_hooks in a subprocess."""
+    sys.addaudithook(TestFinalizeHook())
+
+
+class AuditTest(unittest.TestCase):
+    def test_basic(self):
+        with TestHook() as hook:
+            sys.audit("test_event", 1, 2, 3)
+            self.assertEqual(hook.seen[0][0], "test_event")
+            self.assertEqual(hook.seen[0][1], (1, 2, 3))
+
+    def test_block_add_hook(self):
+        # Raising an exception should prevent a new hook from being added,
+        # but will not propagate out.
+        with TestHook(raise_on_events="sys.addaudithook") as hook1:
+            with TestHook() as hook2:
+                sys.audit("test_event")
+                self.assertIn("test_event", hook1.seen_events)
+                self.assertNotIn("test_event", hook2.seen_events)
+
+    def test_block_add_hook_baseexception(self):
+        # Raising BaseException will propagate out when adding a hook
+        with self.assertRaises(BaseException):
+            with TestHook(
+                raise_on_events="sys.addaudithook", exc_type=BaseException
+            ) as hook1:
+                # Adding this next hook should raise BaseException
+                with TestHook() as hook2:
+                    pass
+
+    def test_finalize_hooks(self):
+        events = []
+        with subprocess.Popen(
+            [
+                sys.executable,
+                "-c",
+                "import test.test_audit; test.test_audit.run_finalize_test()",
+            ],
+            encoding="utf-8",
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+        ) as p:
+            p.wait()
+            for line in p.stderr:
+                events.append(line.strip().partition(" "))
+        firstId = events[0][2]
+        self.assertSequenceEqual(
+            [
+                ("Created", " ", firstId),
+                ("cpython._PySys_ClearAuditHooks", " ", firstId),
+            ],
+            events,
+        )
+
+    def test_pickle(self):
+        pickle = support.import_module("pickle")
+
+        class PicklePrint:
+            def __reduce_ex__(self, p):
+                return str, ("Pwned!",)
+
+        payload_1 = pickle.dumps(PicklePrint())
+        payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3))
+
+        # Before we add the hook, ensure our malicious pickle loads
+        self.assertEqual("Pwned!", pickle.loads(payload_1))
+
+        with TestHook(raise_on_events="pickle.find_class") as hook:
+            with self.assertRaises(RuntimeError):
+                # With the hook enabled, loading globals is not allowed
+                pickle.loads(payload_1)
+            # pickles with no globals are okay
+            pickle.loads(payload_2)
+
+    def test_monkeypatch(self):
+        class A:
+            pass
+
+        class B:
+            pass
+
+        class C(A):
+            pass
+
+        a = A()
+
+        with TestHook() as hook:
+            # Catch name changes
+            C.__name__ = "X"
+            # Catch type changes
+            C.__bases__ = (B,)
+            # Ensure bypassing __setattr__ is still caught
+            type.__dict__["__bases__"].__set__(C, (B,))
+            # Catch attribute replacement
+            C.__init__ = B.__init__
+            # Catch attribute addition
+            C.new_attr = 123
+            # Catch class changes
+            a.__class__ = B
+
+        actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"]
+        self.assertSequenceEqual(
+            [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")],
+            actual,
+        )
+
+    def test_open(self):
+        # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open()
+        try:
+            import ssl
+
+            load_dh_params = ssl.create_default_context().load_dh_params
+        except ImportError:
+            load_dh_params = None
+
+        # Try a range of "open" functions.
+        # All of them should fail
+        with TestHook(raise_on_events={"open"}) as hook:
+            for fn, *args in [
+                (open, support.TESTFN, "r"),
+                (open, sys.executable, "rb"),
+                (open, 3, "wb"),
+                (open, support.TESTFN, "w", -1, None, None, None, False, lambda *a: 1),
+                (load_dh_params, support.TESTFN),
+            ]:
+                if not fn:
+                    continue
+                self.assertRaises(RuntimeError, fn, *args)
+
+        actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]]
+        actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]]
+        self.assertSequenceEqual(
+            [
+                i
+                for i in [
+                    (support.TESTFN, "r"),
+                    (sys.executable, "r"),
+                    (3, "w"),
+                    (support.TESTFN, "w"),
+                    (support.TESTFN, "rb") if load_dh_params else None,
+                ]
+                if i is not None
+            ],
+            actual_mode,
+        )
+        self.assertSequenceEqual([], actual_flag)
+
+    def test_cantrace(self):
+        traced = []
+
+        def trace(frame, event, *args):
+            if frame.f_code == TestHook.__call__.__code__:
+                traced.append(event)
+
+        old = sys.settrace(trace)
+        try:
+            with TestHook() as hook:
+                # No traced call
+                eval("1")
+
+                # No traced call
+                hook.__cantrace__ = False
+                eval("2")
+
+                # One traced call
+                hook.__cantrace__ = True
+                eval("3")
+
+                # Two traced calls (writing to private member, eval)
+                hook.__cantrace__ = 1
+                eval("4")
+
+                # One traced call (writing to private member)
+                hook.__cantrace__ = 0
+        finally:
+            sys.settrace(old)
+
+        self.assertSequenceEqual(["call"] * 4, traced)
+
+
+if __name__ == "__main__":
+    if len(sys.argv) >= 2 and sys.argv[1] == "spython_test":
+        # Doesn't matter what we add - it will be blocked
+        sys.addaudithook(None)
+
+        sys.exit(0)
+
+    unittest.main()
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index 32aabe3..87e90f7 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -927,5 +927,16 @@
                           api=API_PYTHON)
 
 
+class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
+    def test_open_code_hook(self):
+        self.run_embedded_interpreter("test_open_code_hook")
+
+    def test_audit(self):
+        self.run_embedded_interpreter("test_audit")
+
+    def test_audit_subinterpreter(self):
+        self.run_embedded_interpreter("test_audit_subinterpreter")
+
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index 57a0265..26e4500 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -565,6 +565,7 @@
         self.assertRaises(MyException, MyFileIO, fd)
         os.close(fd)  # should not raise OSError(EBADF)
 
+
 class COtherFileTests(OtherFileTests, unittest.TestCase):
     FileIO = _io.FileIO
     modulename = '_io'
@@ -576,10 +577,32 @@
         self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MAX + 1)
         self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MIN - 1)
 
+    def test_open_code(self):
+        # Check that the default behaviour of open_code matches
+        # open("rb")
+        with self.FileIO(__file__, "rb") as f:
+            expected = f.read()
+        with _io.open_code(__file__) as f:
+            actual = f.read()
+        self.assertEqual(expected, actual)
+
+
 class PyOtherFileTests(OtherFileTests, unittest.TestCase):
     FileIO = _pyio.FileIO
     modulename = '_pyio'
 
+    def test_open_code(self):
+        # Check that the default behaviour of open_code matches
+        # open("rb")
+        with self.FileIO(__file__, "rb") as f:
+            expected = f.read()
+        with check_warnings(quiet=True) as w:
+            # Always test _open_code_with_warning
+            with _pyio._open_code_with_warning(__file__) as f:
+                actual = f.read()
+            self.assertEqual(expected, actual)
+            self.assertNotEqual(w.warnings, [])
+
 
 def test_main():
     # Historically, these tests have been sloppy about removing TESTFN.
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 2c3bf89..6f22b35 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3861,7 +3861,7 @@
         for name in self.io.__all__:
             obj = getattr(self.io, name, None)
             self.assertIsNotNone(obj, name)
-            if name == "open":
+            if name in ("open", "open_code"):
                 continue
             elif "error" in name.lower() or name == "UnsupportedOperation":
                 self.assertTrue(issubclass(obj, Exception), name)
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 9b21afb..afce8eb 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -521,6 +521,7 @@
             meth = getattr(processor, meth_name)
             req = meth(req)
 
+        sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method())
         response = self._open(req, data)
 
         # post-process response
diff --git a/Lib/zipimport.py b/Lib/zipimport.py
index f430abd..fd917c1 100644
--- a/Lib/zipimport.py
+++ b/Lib/zipimport.py
@@ -351,7 +351,7 @@
 # data_size and file_offset are 0.
 def _read_directory(archive):
     try:
-        fp = _io.open(archive, 'rb')
+        fp = _io.open_code(archive)
     except OSError:
         raise ZipImportError(f"can't open Zip file: {archive!r}", path=archive)
 
@@ -533,7 +533,7 @@
     if data_size < 0:
         raise ZipImportError('negative data size')
 
-    with _io.open(archive, 'rb') as fp:
+    with _io.open_code(archive) as fp:
         # Check to make sure the local file header is correct
         try:
             fp.seek(file_offset)
diff --git a/Makefile.pre.in b/Makefile.pre.in
index d006a73..12891e9 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -1052,6 +1052,7 @@
 		$(srcdir)/Include/cpython/abstract.h \
 		$(srcdir)/Include/cpython/coreconfig.h \
 		$(srcdir)/Include/cpython/dictobject.h \
+		$(srcdir)/Include/cpython/fileobject.h \
 		$(srcdir)/Include/cpython/interpreteridobject.h \
 		$(srcdir)/Include/cpython/object.h \
 		$(srcdir)/Include/cpython/objimpl.h \
@@ -1059,6 +1060,7 @@
 		$(srcdir)/Include/cpython/pylifecycle.h \
 		$(srcdir)/Include/cpython/pymem.h \
 		$(srcdir)/Include/cpython/pystate.h \
+		$(srcdir)/Include/cpython/sysmodule.h \
 		$(srcdir)/Include/cpython/traceback.h \
 		$(srcdir)/Include/cpython/tupleobject.h \
 		$(srcdir)/Include/cpython/unicodeobject.h \
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst
new file mode 100644
index 0000000..5e23d31
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst
@@ -0,0 +1 @@
+Implement PEP 578, adding sys.audit, io.open_code and related APIs.
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 7b51153..f4eb536 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -2920,6 +2920,10 @@
     CDataObject *pd;
     StgDictObject *dict;
 
+    if (PySys_Audit("ctypes.cdata", "n", (Py_ssize_t)buf) < 0) {
+        return NULL;
+    }
+
     assert(PyType_Check(type));
     dict = PyType_stgdict(type);
     if (!dict) {
@@ -3455,6 +3459,18 @@
         return NULL;
     }
 
+#ifdef MS_WIN32
+    if (PySys_Audit("ctypes.dlsym",
+                    ((uintptr_t)name & ~0xFFFF) ? "Os" : "On",
+                    dll, name) < 0) {
+        return NULL;
+    }
+#else
+    if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) {
+        return NULL;
+    }
+#endif
+
     obj = PyObject_GetAttrString(dll, "_handle");
     if (!obj) {
         Py_DECREF(ftuple);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index a8ba84b..8682d54 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1277,6 +1277,10 @@
     if (!name)
         return NULL;
 
+    if (PySys_Audit("ctypes.dlopen", "O", nameobj) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     /* bpo-36085: Limit DLL search directories to avoid pre-loading
      * attacks and enable use of the AddDllDirectory function.
@@ -1382,6 +1386,9 @@
         name_str = NULL;
         name2 = NULL;
     }
+    if (PySys_Audit("ctypes.dlopen", "s", name_str) < 0) {
+        return NULL;
+    }
     handle = ctypes_dlopen(name_str, mode);
     Py_XDECREF(name2);
     if (!handle) {
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 590d6ce..ba8f001 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -503,6 +503,25 @@
     Py_XDECREF(modeobj);
     return NULL;
 }
+
+/*[clinic input]
+_io.open_code
+
+    path : unicode
+
+Opens the provided file with the intent to import the contents.
+
+This may perform extra validation beyond open(), but is otherwise interchangeable
+with calling open(path, 'rb').
+
+[clinic start generated code]*/
+
+static PyObject *
+_io_open_code_impl(PyObject *module, PyObject *path)
+/*[clinic end generated code: output=2fe4ecbd6f3d6844 input=f5c18e23f4b2ed9f]*/
+{
+    return PyFile_OpenCodeObject(path);
+}
 
 /*
  * Private helpers for the io module.
@@ -630,6 +649,7 @@
 
 static PyMethodDef module_methods[] = {
     _IO_OPEN_METHODDEF
+    _IO_OPEN_CODE_METHODDEF
     {NULL, NULL}
 };
 
diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h
index 990c81c..00ad616 100644
--- a/Modules/_io/clinic/_iomodule.c.h
+++ b/Modules/_io/clinic/_iomodule.c.h
@@ -281,4 +281,46 @@
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=19fc9b69a5166f63 input=a9049054013a1b77]*/
+
+PyDoc_STRVAR(_io_open_code__doc__,
+"open_code($module, /, path)\n"
+"--\n"
+"\n"
+"Opens the provided file with the intent to import the contents.\n"
+"\n"
+"This may perform extra validation beyond open(), but is otherwise interchangeable\n"
+"with calling open(path, \'rb\').");
+
+#define _IO_OPEN_CODE_METHODDEF    \
+    {"open_code", (PyCFunction)(void(*)(void))_io_open_code, METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__},
+
+static PyObject *
+_io_open_code_impl(PyObject *module, PyObject *path);
+
+static PyObject *
+_io_open_code(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+    PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"path", NULL};
+    static _PyArg_Parser _parser = {NULL, _keywords, "open_code", 0};
+    PyObject *argsbuf[1];
+    PyObject *path;
+
+    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+    if (!args) {
+        goto exit;
+    }
+    if (!PyUnicode_Check(args[0])) {
+        _PyArg_BadArgument("open_code", 1, "str", args[0]);
+        goto exit;
+    }
+    if (PyUnicode_READY(args[0]) == -1) {
+        goto exit;
+    }
+    path = args[0];
+    return_value = _io_open_code_impl(module, path);
+
+exit:
+    return return_value;
+}
+/*[clinic end generated code: output=d479285078750d68 input=a9049054013a1b77]*/
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index c502c43..52a6f49 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -358,6 +358,10 @@
     flags |= O_CLOEXEC;
 #endif
 
+    if (PySys_Audit("open", "Osi", nameobj, mode, flags) < 0) {
+        goto error;
+    }
+
     if (fd >= 0) {
         self->fd = fd;
         self->closefd = closefd;
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 87f3cf7..24a5d22 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -6659,6 +6659,11 @@
     PyObject *global;
     PyObject *module;
 
+    if (PySys_Audit("pickle.find_class", "OO",
+                    module_name, global_name) < 0) {
+        return NULL;
+    }
+
     /* Try to map the old names used in Python 2.x to the new ones used in
        Python 3.x.  We do this only with old pickle protocols and when the
        user has not disabled the feature. */
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 8873519..1317fc9 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -461,6 +461,12 @@
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.CreateFile", "uIIII",
+                    file_name, desired_access, share_mode,
+                    creation_disposition, flags_and_attributes) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     handle = CreateFile(file_name, desired_access,
                         share_mode, security_attributes,
@@ -542,6 +548,10 @@
     if (wcsncmp(src_path, L"\\??\\", prefix_len) == 0)
         return PyErr_SetFromWindowsErr(ERROR_INVALID_PARAMETER);
 
+    if (PySys_Audit("_winapi.CreateJunction", "uu", src_path, dst_path) < 0) {
+        return NULL;
+    }
+
     /* Adjust privileges to allow rewriting directory entry as a
        junction point. */
     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
@@ -670,6 +680,11 @@
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.CreateNamedPipe", "uII",
+                    name, open_mode, pipe_mode) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     handle = CreateNamedPipe(name, open_mode, pipe_mode,
                              max_instances, out_buffer_size,
@@ -704,6 +719,10 @@
     HANDLE write_pipe;
     BOOL result;
 
+    if (PySys_Audit("_winapi.CreatePipe", NULL) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     result = CreatePipe(&read_pipe, &write_pipe, NULL, size);
     Py_END_ALLOW_THREADS
@@ -1055,6 +1074,11 @@
     wchar_t *command_line_copy = NULL;
     AttributeList attribute_list = {0};
 
+    if (PySys_Audit("_winapi.CreateProcess", "uuu", application_name,
+                    command_line, current_directory) < 0) {
+        return NULL;
+    }
+
     ZeroMemory(&si, sizeof(si));
     si.StartupInfo.cb = sizeof(si);
 
@@ -1270,8 +1294,10 @@
     BOOL result;
     WCHAR filename[MAX_PATH];
 
+    Py_BEGIN_ALLOW_THREADS
     result = GetModuleFileNameW(module_handle, filename, MAX_PATH);
     filename[MAX_PATH-1] = '\0';
+    Py_END_ALLOW_THREADS
 
     if (! result)
         return PyErr_SetFromWindowsErr(GetLastError());
@@ -1402,9 +1428,16 @@
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.OpenProcess", "II",
+                    process_id, desired_access) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
+    Py_BEGIN_ALLOW_THREADS
     handle = OpenProcess(desired_access, inherit_handle, process_id);
+    Py_END_ALLOW_THREADS
     if (handle == NULL) {
-        PyErr_SetFromWindowsErr(0);
+        PyErr_SetFromWindowsErr(GetLastError());
         handle = INVALID_HANDLE_VALUE;
     }
 
@@ -1539,6 +1572,7 @@
     PyObject *oArgs[3] = {mode, max_collection_count, collect_data_timeout};
     DWORD dwArgs[3], *pArgs[3] = {NULL, NULL, NULL};
     int i;
+    BOOL b;
 
     for (i = 0 ; i < 3 ; i++) {
         if (oArgs[i] != Py_None) {
@@ -1549,7 +1583,11 @@
         }
     }
 
-    if (!SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2]))
+    Py_BEGIN_ALLOW_THREADS
+    b = SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2]);
+    Py_END_ALLOW_THREADS
+
+    if (!b)
         return PyErr_SetFromWindowsErr(0);
 
     Py_RETURN_NONE;
@@ -1573,6 +1611,11 @@
 {
     BOOL result;
 
+    if (PySys_Audit("_winapi.TerminateProcess", "nI",
+                    (Py_ssize_t)handle, exit_code) < 0) {
+        return NULL;
+    }
+
     result = TerminateProcess(handle, exit_code);
 
     if (! result)
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 523afb9..423cac9 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -2635,6 +2635,11 @@
     if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
         return NULL;
 
+    if (PySys_Audit("array.__new__", "CO",
+                    c, initial ? initial : Py_None) < 0) {
+        return NULL;
+    }
+
     if (initial && c != 'u') {
         if (PyUnicode_Check(initial)) {
             PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 917c636..fdd60bb 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -1110,6 +1110,11 @@
                             "mmap invalid access parameter.");
     }
 
+    if (PySys_Audit("mmap.__new__", "ini" _Py_PARSE_OFF_T,
+                    fileno, map_size, access, offset) < 0) {
+        return NULL;
+    }
+
 #ifdef __APPLE__
     /* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific
        fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */
@@ -1240,6 +1245,11 @@
         return NULL;
     }
 
+    if (PySys_Audit("mmap.__new__", "iniL",
+                    fileno, map_size, access, offset) < 0) {
+        return NULL;
+    }
+
     switch((access_mode)access) {
     case ACCESS_READ:
         flProtect = PAGE_READONLY;
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 9f15866..8ebe3a0 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -4264,6 +4264,11 @@
 /*[clinic end generated code: output=5b7c3599c068ca42 input=303f5ce97df606b0]*/
 {
     long result;
+
+    if (PySys_Audit("system", "(u)", command) < 0) {
+        return -1;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
     result = _wsystem(command);
@@ -4286,6 +4291,11 @@
 {
     long result;
     const char *bytes = PyBytes_AsString(command);
+
+    if (PySys_Audit("system", "(O)", command) < 0) {
+        return -1;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     result = system(bytes);
     Py_END_ALLOW_THREADS
@@ -8279,6 +8289,10 @@
     flags |= O_CLOEXEC;
 #endif
 
+    if (PySys_Audit("open", "OOi", path->object, Py_None, flags) < 0) {
+        return -1;
+    }
+
     _Py_BEGIN_SUPPRESS_IPH
     do {
         Py_BEGIN_ALLOW_THREADS
@@ -9598,6 +9612,10 @@
     int result;
     int async_err = 0;
 
+    if (PySys_Audit("os.truncate", "in", fd, length) < 0) {
+        return NULL;
+    }
+
     do {
         Py_BEGIN_ALLOW_THREADS
         _Py_BEGIN_SUPPRESS_IPH
@@ -9641,6 +9659,10 @@
     if (path->fd != -1)
         return os_ftruncate_impl(module, path->fd, length);
 
+    if (PySys_Audit("os.truncate", "On", path->object, length) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
 #ifdef MS_WINDOWS
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index c024542..74cdc0f 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -3053,6 +3053,11 @@
     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
         return NULL;
     }
+
+    if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
     Py_END_ALLOW_THREADS
@@ -3219,6 +3224,10 @@
         return NULL;
     }
 
+    if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
     if (res < 0)
         return NULL;
@@ -3246,6 +3255,10 @@
         return NULL;
     }
 
+    if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
     if (res < 0)
         return NULL;
@@ -4248,6 +4261,10 @@
         return NULL;
     }
 
+    if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     ctx.buf = pbuf.buf;
     ctx.len = pbuf.len;
     ctx.flags = flags;
@@ -4379,8 +4396,15 @@
         {
             goto finally;
         }
+        if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
+            return NULL;
+        }
         msg.msg_name = &addrbuf;
         msg.msg_namelen = addrlen;
+    } else {
+        if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
+            return NULL;
+        }
     }
 
     /* Fill in an iovec for each message part, and save the Py_buffer
@@ -5030,6 +5054,17 @@
                                      &family, &type, &proto, &fdobj))
         return -1;
 
+#ifdef MS_WINDOWS
+    /* In this case, we don't use the family, type and proto args */
+    if (fdobj != NULL && fdobj != Py_None)
+#endif
+    {
+        if (PySys_Audit("socket.__new__", "Oiii",
+                        s, family, type, proto) < 0) {
+            return -1;
+        }
+    }
+
     if (fdobj != NULL && fdobj != Py_None) {
 #ifdef MS_WINDOWS
         /* recreate a socket that was duplicated */
@@ -5042,6 +5077,12 @@
                 return -1;
             }
             memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
+
+            if (PySys_Audit("socket()", "iii", info.iAddressFamily,
+                            info.iSocketType, info.iProtocol) < 0) {
+                return -1;
+            }
+
             Py_BEGIN_ALLOW_THREADS
             fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
                      FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
@@ -5284,6 +5325,10 @@
 static PyObject *
 socket_gethostname(PyObject *self, PyObject *unused)
 {
+    if (PySys_Audit("socket.gethostname", NULL) < 0) {
+        return NULL;
+    }
+
 #ifdef MS_WINDOWS
     /* Don't use winsock's gethostname, as this returns the ANSI
        version of the hostname, whereas we need a Unicode string.
@@ -5362,6 +5407,11 @@
             return NULL;
         flag = 1;
     }
+
+    if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
+        return NULL;
+    }
+
     res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
     if (!res) {
         res = sethostname(buf.buf, buf.len);
@@ -5387,6 +5437,9 @@
 
     if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
         return NULL;
+    if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
+        goto finally;
+    }
     if (setipaddr(name, (struct sockaddr *)&addrbuf,  sizeof(addrbuf), AF_INET) < 0)
         goto finally;
     ret = make_ipv4_addr(&addrbuf);
@@ -5571,6 +5624,9 @@
 
     if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
         return NULL;
+    if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
+        goto finally;
+    }
     if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
         goto finally;
     Py_BEGIN_ALLOW_THREADS
@@ -5649,6 +5705,9 @@
 
     if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
         return NULL;
+    if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
+        goto finally;
+    }
     af = AF_UNSPEC;
     if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
         goto finally;
@@ -5720,6 +5779,11 @@
     struct servent *sp;
     if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
         return NULL;
+
+    if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     sp = getservbyname(name, proto);
     Py_END_ALLOW_THREADS
@@ -5757,6 +5821,11 @@
             "getservbyport: port must be 0-65535.");
         return NULL;
     }
+
+    if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     sp = getservbyport(htons((short)port), proto);
     Py_END_ALLOW_THREADS
@@ -6392,6 +6461,12 @@
         pptr = "00";
     }
 #endif
+
+    if (PySys_Audit("socket.getaddrinfo", "OOiii",
+                    hobj, pobj, family, socktype, protocol) < 0) {
+        return NULL;
+    }
+
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = family;
     hints.ai_socktype = socktype;
@@ -6483,6 +6558,11 @@
                         "getnameinfo(): flowinfo must be 0-1048575.");
         return NULL;
     }
+
+    if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
+        return NULL;
+    }
+
     PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = AF_UNSPEC;
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 62d7c5d..f4e48a9 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -380,6 +380,12 @@
                           &PyTuple_Type, &cellvars))
         return NULL;
 
+    if (PySys_Audit("code.__new__", "OOOiiiii",
+                    code, filename, name, argcount, kwonlyargcount,
+                    nlocals, stacksize, flags) < 0) {
+        goto cleanup;
+    }
+
     if (argcount < 0) {
         PyErr_SetString(
             PyExc_ValueError,
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 8f1a823..0db8057 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -144,6 +144,14 @@
 
     if (descr_check((PyDescrObject *)descr, obj, &res))
         return res;
+
+    if (descr->d_member->flags & READ_RESTRICTED) {
+        if (PySys_Audit("object.__getattr__", "Os",
+            obj ? obj : Py_None, descr->d_member->name) < 0) {
+            return NULL;
+        }
+    }
+
     return PyMember_GetOne((char *)obj, descr->d_member);
 }
 
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 39c7c10..3b02633 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -2,6 +2,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_pystate.h"
 
 #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER)
 /* clang MemorySanitizer doesn't yet understand getc_unlocked. */
@@ -33,7 +34,8 @@
     PyObject *io, *stream;
     _Py_IDENTIFIER(open);
 
-    io = PyImport_ImportModule("io");
+    /* import _io in case we are being used to open io.py */
+    io = PyImport_ImportModule("_io");
     if (io == NULL)
         return NULL;
     stream = _PyObject_CallMethodId(io, &PyId_open, "isisssi", fd, mode,
@@ -514,6 +516,72 @@
 };
 
 
+/* ************************** open_code hook ***************************
+ * The open_code hook allows embedders to override the method used to
+ * open files that are going to be used by the runtime to execute code
+ */
+
+int
+PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData) {
+    if (Py_IsInitialized() &&
+        PySys_Audit("setopencodehook", NULL) < 0) {
+        return -1;
+    }
+
+    if (_PyRuntime.open_code_hook) {
+        if (Py_IsInitialized()) {
+            PyErr_SetString(PyExc_SystemError,
+                "failed to change existing open_code hook");
+        }
+        return -1;
+    }
+
+    _PyRuntime.open_code_hook = hook;
+    _PyRuntime.open_code_userdata = userData;
+    return 0;
+}
+
+PyObject *
+PyFile_OpenCodeObject(PyObject *path)
+{
+    PyObject *iomod, *f = NULL;
+    _Py_IDENTIFIER(open);
+
+    if (!PyUnicode_Check(path)) {
+        PyErr_Format(PyExc_TypeError, "'path' must be 'str', not '%.200s'",
+                     Py_TYPE(path)->tp_name);
+        return NULL;
+    }
+
+    Py_OpenCodeHookFunction hook = _PyRuntime.open_code_hook;
+    if (hook) {
+        f = hook(path, _PyRuntime.open_code_userdata);
+    } else {
+        iomod = PyImport_ImportModule("_io");
+        if (iomod) {
+            f = _PyObject_CallMethodId(iomod, &PyId_open, "Os",
+                                       path, "rb");
+            Py_DECREF(iomod);
+        }
+    }
+
+    return f;
+}
+
+PyObject *
+PyFile_OpenCode(const char *utf8path)
+{
+    PyObject *pathobj = PyUnicode_FromString(utf8path);
+    PyObject *f;
+    if (!pathobj) {
+        return NULL;
+    }
+    f = PyFile_OpenCodeObject(pathobj);
+    Py_DECREF(pathobj);
+    return f;
+}
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index e8e2d2e..09b94c2 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -250,6 +250,10 @@
 static PyObject *
 func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os", op, "__code__") < 0) {
+        return NULL;
+    }
+
     Py_INCREF(op->func_code);
     return op->func_code;
 }
@@ -266,6 +270,12 @@
                         "__code__ must be set to a code object");
         return -1;
     }
+
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    op, "__code__", value) < 0) {
+        return -1;
+    }
+
     nfree = PyCode_GetNumFree((PyCodeObject *)value);
     nclosure = (op->func_closure == NULL ? 0 :
             PyTuple_GET_SIZE(op->func_closure));
@@ -329,6 +339,9 @@
 static PyObject *
 func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os", op, "__defaults__") < 0) {
+        return NULL;
+    }
     if (op->func_defaults == NULL) {
         Py_RETURN_NONE;
     }
@@ -348,6 +361,16 @@
                         "__defaults__ must be set to a tuple object");
         return -1;
     }
+    if (value) {
+        if (PySys_Audit("object.__setattr__", "OsO",
+                        op, "__defaults__", value) < 0) {
+            return -1;
+        }
+    } else if (PySys_Audit("object.__delattr__", "Os",
+                           op, "__defaults__") < 0) {
+        return -1;
+    }
+
     Py_XINCREF(value);
     Py_XSETREF(op->func_defaults, value);
     return 0;
@@ -356,6 +379,10 @@
 static PyObject *
 func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os",
+                    op, "__kwdefaults__") < 0) {
+        return NULL;
+    }
     if (op->func_kwdefaults == NULL) {
         Py_RETURN_NONE;
     }
@@ -375,6 +402,16 @@
             "__kwdefaults__ must be set to a dict object");
         return -1;
     }
+    if (value) {
+        if (PySys_Audit("object.__setattr__", "OsO",
+                        op, "__kwdefaults__", value) < 0) {
+            return -1;
+        }
+    } else if (PySys_Audit("object.__delattr__", "Os",
+                           op, "__kwdefaults__") < 0) {
+        return -1;
+    }
+
     Py_XINCREF(value);
     Py_XSETREF(op->func_kwdefaults, value);
     return 0;
@@ -507,6 +544,9 @@
             }
         }
     }
+    if (PySys_Audit("function.__new__", "O", code) < 0) {
+        return NULL;
+    }
 
     newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
                                                  globals);
diff --git a/Objects/object.c b/Objects/object.c
index 604f5e0..f842ab3 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -1366,6 +1366,14 @@
         }
     }
 
+    /* XXX [Steve Dower] These are really noisy - worth it? */
+    /*if (PyType_Check(obj) || PyModule_Check(obj)) {
+        if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0)
+            return -1;
+        if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0)
+            return -1;
+    }*/
+
     if (dict == NULL) {
         dictptr = _PyObject_GetDictPtr(obj);
         if (dictptr == NULL) {
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c086f18..49b45b8 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -392,6 +392,12 @@
                      "can't delete %s.%s", type->tp_name, name);
         return 0;
     }
+
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    type, name, value) < 0) {
+        return 0;
+    }
+
     return 1;
 }
 
@@ -3956,6 +3962,11 @@
           Py_TYPE(value)->tp_name);
         return -1;
     }
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    self, "__class__", value) < 0) {
+        return -1;
+    }
+
     newto = (PyTypeObject *)value;
     /* In versions of CPython prior to 3.5, the code in
        compatible_for_assignment was not set up to correctly check for memory
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index df57adc..681c4db 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -129,12 +129,14 @@
     <ClInclude Include="..\Include\cpython\abstract.h" />
     <ClInclude Include="..\Include\cpython\coreconfig.h" />
     <ClInclude Include="..\Include\cpython\dictobject.h" />
+    <ClInclude Include="..\Include\cpython\fileobject.h" />
     <ClInclude Include="..\Include\cpython\object.h" />
     <ClInclude Include="..\Include\cpython\objimpl.h" />
     <ClInclude Include="..\Include\cpython\pyerrors.h" />
     <ClInclude Include="..\Include\cpython\pylifecycle.h" />
     <ClInclude Include="..\Include\cpython\pymem.h" />
     <ClInclude Include="..\Include\cpython\pystate.h" />
+    <ClInclude Include="..\Include\cpython\sysmodule.h" />
     <ClInclude Include="..\Include\cpython\traceback.h" />
     <ClInclude Include="..\Include\cpython\tupleobject.h" />
     <ClInclude Include="..\Include\cpython\unicodeobject.h" />
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
index 5515d9b..32964c0 100644
--- a/PCbuild/pythoncore.vcxproj.filters
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -90,6 +90,9 @@
     <ClInclude Include="..\Include\cpython\dictobject.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\Include\cpython\fileobject.h">
+      <Filter>Include</Filter>
+    </ClInclude>
     <ClInclude Include="..\Include\cpython\object.h">
       <Filter>Include</Filter>
     </ClInclude>
@@ -108,6 +111,9 @@
     <ClInclude Include="..\Include\cpython\pystate.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\Include\cpython\sysmodule.h">
+      <Filter>Include</Filter>
+    </ClInclude>
     <ClInclude Include="..\Include\cpython\traceback.h">
       <Filter>Include</Filter>
     </ClInclude>
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index cb0e6d7..d84c1b1 100644
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -1201,6 +1201,10 @@
     char *req_name[] = {"Module", "Expression", "Interactive"};
     int isinstance;
 
+    if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
+        return NULL;
+    }
+
     req_type[0] = (PyObject*)Module_type;
     req_type[1] = (PyObject*)Expression_type;
     req_type[2] = (PyObject*)Interactive_type;
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 55fd7f7..a5d7897 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -94,6 +94,11 @@
     if (initerr(err_ret, filename) < 0)
         return NULL;
 
+    if (PySys_Audit("compile", "yO", s, err_ret->filename) < 0) {
+        err_ret->error = E_ERROR;
+        return NULL;
+    }
+
     if (*flags & PyPARSE_IGNORE_COOKIE)
         tok = PyTokenizer_FromUTF8(s, exec_input);
     else
@@ -165,6 +170,10 @@
     if (initerr(err_ret, filename) < 0)
         return NULL;
 
+    if (PySys_Audit("compile", "OO", Py_None, err_ret->filename) < 0) {
+        return NULL;
+    }
+
     if ((tok = PyTokenizer_FromFile(fp, enc, ps1, ps2)) == NULL) {
         err_ret->error = E_NOMEM;
         return NULL;
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index 6bd55de..21d3b44 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -1091,6 +1091,164 @@
     return 0;
 }
 
+static PyObject *_open_code_hook(PyObject *path, void *data)
+{
+    if (PyUnicode_CompareWithASCIIString(path, "$$test-filename") == 0) {
+        return PyLong_FromVoidPtr(data);
+    }
+    PyObject *io = PyImport_ImportModule("_io");
+    if (!io) {
+        return NULL;
+    }
+    return PyObject_CallMethod(io, "open", "Os", path, "rb");
+}
+
+static int test_open_code_hook(void)
+{
+    int result = 0;
+
+    /* Provide a hook */
+    result = PyFile_SetOpenCodeHook(_open_code_hook, &result);
+    if (result) {
+        printf("Failed to set hook\n");
+        return 1;
+    }
+    /* A second hook should fail */
+    result = PyFile_SetOpenCodeHook(_open_code_hook, &result);
+    if (!result) {
+        printf("Should have failed to set second hook\n");
+        return 2;
+    }
+
+    Py_IgnoreEnvironmentFlag = 0;
+    _testembed_Py_Initialize();
+    result = 0;
+
+    PyObject *r = PyFile_OpenCode("$$test-filename");
+    if (!r) {
+        PyErr_Print();
+        result = 3;
+    } else {
+        void *cmp = PyLong_AsVoidPtr(r);
+        Py_DECREF(r);
+        if (cmp != &result) {
+            printf("Did not get expected result from hook\n");
+            result = 4;
+        }
+    }
+
+    if (!result) {
+        PyObject *io = PyImport_ImportModule("_io");
+        PyObject *r = io
+            ? PyObject_CallMethod(io, "open_code", "s", "$$test-filename")
+            : NULL;
+        if (!r) {
+            PyErr_Print();
+            result = 5;
+        } else {
+            void *cmp = PyLong_AsVoidPtr(r);
+            Py_DECREF(r);
+            if (cmp != &result) {
+                printf("Did not get expected result from hook\n");
+                result = 6;
+            }
+        }
+        Py_XDECREF(io);
+    }
+
+    Py_Finalize();
+    return result;
+}
+
+static int _audit_hook(const char *event, PyObject *args, void *userdata)
+{
+    if (strcmp(event, "_testembed.raise") == 0) {
+        PyErr_SetString(PyExc_RuntimeError, "Intentional error");
+        return -1;
+    } else if (strcmp(event, "_testembed.set") == 0) {
+        if (!PyArg_ParseTuple(args, "n", userdata)) {
+            return -1;
+        }
+        return 0;
+    }
+    return 0;
+}
+
+static int _test_audit(Py_ssize_t setValue)
+{
+    Py_ssize_t sawSet = 0;
+
+    Py_IgnoreEnvironmentFlag = 0;
+    PySys_AddAuditHook(_audit_hook, &sawSet);
+    _testembed_Py_Initialize();
+
+    if (PySys_Audit("_testembed.raise", NULL) == 0) {
+        printf("No error raised");
+        return 1;
+    }
+    if (PySys_Audit("_testembed.nop", NULL) != 0) {
+        printf("Nop event failed");
+        /* Exception from above may still remain */
+        PyErr_Clear();
+        return 2;
+    }
+    if (!PyErr_Occurred()) {
+        printf("Exception not preserved");
+        return 3;
+    }
+    PyErr_Clear();
+
+    if (PySys_Audit("_testembed.set", "n", setValue) != 0) {
+        PyErr_Print();
+        printf("Set event failed");
+        return 4;
+    }
+
+    if (sawSet != 42) {
+        printf("Failed to see *userData change\n");
+        return 5;
+    }
+    return 0;
+}
+
+static int test_audit(void)
+{
+    int result = _test_audit(42);
+    Py_Finalize();
+    return result;
+}
+
+static volatile int _audit_subinterpreter_interpreter_count = 0;
+
+static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *userdata)
+{
+    printf("%s\n", event);
+    if (strcmp(event, "cpython.PyInterpreterState_New") == 0) {
+        _audit_subinterpreter_interpreter_count += 1;
+    }
+    return 0;
+}
+
+static int test_audit_subinterpreter(void)
+{
+    PyThreadState *ts;
+
+    Py_IgnoreEnvironmentFlag = 0;
+    PySys_AddAuditHook(_audit_subinterpreter_hook, NULL);
+    _testembed_Py_Initialize();
+
+    ts = Py_NewInterpreter();
+    ts = Py_NewInterpreter();
+    ts = Py_NewInterpreter();
+
+    Py_Finalize();
+
+    switch (_audit_subinterpreter_interpreter_count) {
+        case 3: return 0;
+        case 0: return -1;
+        default: return _audit_subinterpreter_interpreter_count;
+    }
+}
 
 static int test_init_read_set(void)
 {
@@ -1299,6 +1457,9 @@
     {"test_init_run_main", test_init_run_main},
     {"test_init_main", test_init_main},
     {"test_run_main", test_run_main},
+    {"test_open_code_hook", test_open_code_hook},
+    {"test_audit", test_audit},
+    {"test_audit_subinterpreter", test_audit_subinterpreter},
     {NULL, NULL}
 };
 
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index e84a758..39a40ee 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -9024,6 +9024,10 @@
     char *req_name[] = {"Module", "Expression", "Interactive"};
     int isinstance;
 
+    if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
+        return NULL;
+    }
+
     req_type[0] = (PyObject*)Module_type;
     req_type[1] = (PyObject*)Expression_type;
     req_type[2] = (PyObject*)Interactive_type;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 047cca0..ff5a512 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -977,9 +977,13 @@
     }
 
     if (PyCode_Check(source)) {
+        if (PySys_Audit("exec", "O", source) < 0) {
+            return NULL;
+        }
+
         if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
             PyErr_SetString(PyExc_TypeError,
-        "code object passed to eval() may not contain free variables");
+                "code object passed to eval() may not contain free variables");
             return NULL;
         }
         return PyEval_EvalCode(source, globals, locals);
@@ -1061,6 +1065,10 @@
     }
 
     if (PyCode_Check(source)) {
+        if (PySys_Audit("exec", "O", source) < 0) {
+            return NULL;
+        }
+
         if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
             PyErr_SetString(PyExc_TypeError,
                 "code object passed to exec() may not "
@@ -1207,7 +1215,14 @@
 builtin_id(PyModuleDef *self, PyObject *v)
 /*[clinic end generated code: output=0aa640785f697f65 input=5a534136419631f4]*/
 {
-    return PyLong_FromVoidPtr(v);
+    PyObject *id = PyLong_FromVoidPtr(v);
+
+    if (id && PySys_Audit("builtins.id", "O", id) < 0) {
+        Py_DECREF(id);
+        return NULL;
+    }
+
+    return id;
 }
 
 
@@ -1986,6 +2001,10 @@
         return NULL;
     }
 
+    if (PySys_Audit("builtins.input", "O", prompt ? prompt : Py_None) < 0) {
+        return NULL;
+    }
+
     /* First of all, flush stderr */
     tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
     if (tmp == NULL)
@@ -2116,6 +2135,13 @@
         Py_DECREF(stdin_errors);
         Py_XDECREF(po);
         PyMem_FREE(s);
+
+        if (result != NULL) {
+            if (PySys_Audit("builtins.input/result", "O", result) < 0) {
+                return NULL;
+            }
+        }
+
         return result;
 
     _readline_errors:
diff --git a/Python/ceval.c b/Python/ceval.c
index 1bb4704..781b10d 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4555,6 +4555,10 @@
 void
 PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
 {
+    if (PySys_Audit("sys.setprofile", NULL) < 0) {
+        return;
+    }
+
     PyThreadState *tstate = _PyThreadState_GET();
     PyObject *temp = tstate->c_profileobj;
     Py_XINCREF(arg);
@@ -4572,6 +4576,10 @@
 void
 PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
 {
+    if (PySys_Audit("sys.settrace", NULL) < 0) {
+        return;
+    }
+
     _PyRuntimeState *runtime = &_PyRuntime;
     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
     PyObject *temp = tstate->c_traceobj;
@@ -4608,6 +4616,11 @@
 _PyEval_SetCoroutineWrapper(PyObject *wrapper)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_coroutine_wrapper", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(wrapper);
     Py_XSETREF(tstate->coroutine_wrapper, wrapper);
 }
@@ -4623,6 +4636,11 @@
 _PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(firstiter);
     Py_XSETREF(tstate->async_gen_firstiter, firstiter);
 }
@@ -4638,6 +4656,11 @@
 _PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(finalizer);
     Py_XSETREF(tstate->async_gen_finalizer, finalizer);
 }
diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h
index aede60a..2a4ec72 100644
--- a/Python/clinic/sysmodule.c.h
+++ b/Python/clinic/sysmodule.c.h
@@ -2,6 +2,38 @@
 preserve
 [clinic start generated code]*/
 
+PyDoc_STRVAR(sys_addaudithook__doc__,
+"addaudithook($module, /, hook)\n"
+"--\n"
+"\n"
+"Adds a new audit hook callback.");
+
+#define SYS_ADDAUDITHOOK_METHODDEF    \
+    {"addaudithook", (PyCFunction)(void(*)(void))sys_addaudithook, METH_FASTCALL|METH_KEYWORDS, sys_addaudithook__doc__},
+
+static PyObject *
+sys_addaudithook_impl(PyObject *module, PyObject *hook);
+
+static PyObject *
+sys_addaudithook(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+    PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"hook", NULL};
+    static _PyArg_Parser _parser = {NULL, _keywords, "addaudithook", 0};
+    PyObject *argsbuf[1];
+    PyObject *hook;
+
+    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+    if (!args) {
+        goto exit;
+    }
+    hook = args[0];
+    return_value = sys_addaudithook_impl(module, hook);
+
+exit:
+    return return_value;
+}
+
 PyDoc_STRVAR(sys_displayhook__doc__,
 "displayhook($module, object, /)\n"
 "--\n"
@@ -1076,4 +1108,4 @@
 #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF
     #define SYS_GETANDROIDAPILEVEL_METHODDEF
 #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */
-/*[clinic end generated code: output=603e4d5a453dc769 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3c32bc91ec659509 input=a9049054013a1b77]*/
diff --git a/Python/fileutils.c b/Python/fileutils.c
index dfad48e..178e2f1 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -1262,6 +1262,10 @@
 #endif
 
     if (gil_held) {
+        if (PySys_Audit("open", "sOi", pathname, Py_None, flags) < 0) {
+            return -1;
+        }
+
         do {
             Py_BEGIN_ALLOW_THREADS
             fd = open(pathname, flags);
@@ -1331,6 +1335,9 @@
 _Py_wfopen(const wchar_t *path, const wchar_t *mode)
 {
     FILE *f;
+    if (PySys_Audit("open", "uui", path, mode, 0) < 0) {
+        return NULL;
+    }
 #ifndef MS_WINDOWS
     char *cpath;
     char cmode[10];
@@ -1366,6 +1373,10 @@
 FILE*
 _Py_fopen(const char *pathname, const char *mode)
 {
+    if (PySys_Audit("open", "ssi", pathname, mode, 0) < 0) {
+        return NULL;
+    }
+
     FILE *f = fopen(pathname, mode);
     if (f == NULL)
         return NULL;
@@ -1401,6 +1412,9 @@
 
     assert(PyGILState_Check());
 
+    if (PySys_Audit("open", "Osi", path, mode, 0) < 0) {
+        return NULL;
+    }
     if (!PyUnicode_Check(path)) {
         PyErr_Format(PyExc_TypeError,
                      "str file path expected under Windows, got %R",
@@ -1434,6 +1448,10 @@
         return NULL;
     path_bytes = PyBytes_AS_STRING(bytes);
 
+    if (PySys_Audit("open", "Osi", path, mode, 0) < 0) {
+        return NULL;
+    }
+
     do {
         Py_BEGIN_ALLOW_THREADS
         f = fopen(path_bytes, mode);
diff --git a/Python/import.c b/Python/import.c
index c634edb..ec172b2 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1661,6 +1661,17 @@
 
     _PyTime_t t1 = 0, accumulated_copy = accumulated;
 
+    PyObject *sys_path = PySys_GetObject("path");
+    PyObject *sys_meta_path = PySys_GetObject("meta_path");
+    PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
+    if (PySys_Audit("import", "OOOOO",
+                    abs_name, Py_None, sys_path ? sys_path : Py_None,
+                    sys_meta_path ? sys_meta_path : Py_None,
+                    sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
+        return NULL;
+    }
+
+
     /* XOptions is initialized after first some imports.
      * So we can't have negative cache before completed initialization.
      * Anyway, importlib._find_and_load is much slower than
diff --git a/Python/importdl.c b/Python/importdl.c
index 50231ff..1d0d32a 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -119,6 +119,11 @@
     if (path == NULL)
         goto error;
 
+    if (PySys_Audit("import", "OOOOO", name_unicode, path,
+                    Py_None, Py_None, Py_None) < 0) {
+        return NULL;
+    }
+
 #ifdef MS_WINDOWS
     exportfunc = _PyImport_FindSharedFuncptrWindows(hook_prefix, name_buf,
                                                     path, fp);
diff --git a/Python/importlib_external.h b/Python/importlib_external.h
index b5b4df2..36b95d9 100644
--- a/Python/importlib_external.h
+++ b/Python/importlib_external.h
@@ -1460,1235 +1460,1241 @@
     3,0,0,115,2,0,0,0,0,3,122,23,70,105,108,101,
     76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110,
     97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    3,0,0,0,10,0,0,0,67,0,0,0,115,44,0,0,
-    0,116,0,160,1,124,1,100,1,161,2,143,22,125,2,124,
-    2,160,2,161,0,87,0,2,0,53,0,81,0,82,0,163,
-    0,83,0,81,0,82,0,88,0,100,2,83,0,41,3,122,
-    39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97,
-    32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97,
-    119,32,98,121,116,101,115,46,218,1,114,78,41,3,114,64,
-    0,0,0,114,65,0,0,0,90,4,114,101,97,100,41,3,
-    114,119,0,0,0,114,44,0,0,0,114,68,0,0,0,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,227,
-    0,0,0,196,3,0,0,115,4,0,0,0,0,2,14,1,
-    122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
-    95,100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,
-    0,0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,
-    0,100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,
-    0,169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,
-    116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,
-    114,203,3,0,0,115,6,0,0,0,0,2,10,1,4,1,
-    122,30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
+    3,0,0,0,10,0,0,0,67,0,0,0,115,102,0,0,
+    0,116,0,124,0,116,1,116,2,102,2,131,2,114,58,116,
+    3,160,4,116,5,124,1,131,1,161,1,143,22,125,2,124,
+    2,160,6,161,0,87,0,2,0,53,0,81,0,82,0,163,
+    0,83,0,81,0,82,0,88,0,110,40,116,3,160,7,124,
+    1,100,1,161,2,143,22,125,2,124,2,160,6,161,0,87,
+    0,2,0,53,0,81,0,82,0,163,0,83,0,81,0,82,
+    0,88,0,100,2,83,0,41,3,122,39,82,101,116,117,114,
+    110,32,116,104,101,32,100,97,116,97,32,102,114,111,109,32,
+    112,97,116,104,32,97,115,32,114,97,119,32,98,121,116,101,
+    115,46,218,1,114,78,41,8,114,161,0,0,0,114,221,0,
+    0,0,218,19,69,120,116,101,110,115,105,111,110,70,105,108,
+    101,76,111,97,100,101,114,114,64,0,0,0,90,9,111,112,
+    101,110,95,99,111,100,101,114,85,0,0,0,90,4,114,101,
+    97,100,114,65,0,0,0,41,3,114,119,0,0,0,114,44,
+    0,0,0,114,68,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,227,0,0,0,196,3,0,0,
+    115,10,0,0,0,0,2,14,1,16,1,28,2,14,1,122,
+    19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+    100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,0,
+    0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,0,
+    100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,0,
+    169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,116,
     95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,
+    207,3,0,0,115,6,0,0,0,0,2,10,1,4,1,122,
+    30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+    114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,
+    2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
+    4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,116,
+    1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,125,
+    2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,78,
+    114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,0,
+    0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,0,
+    114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,101,
+    115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,110,
+    95,114,101,115,111,117,114,99,101,213,3,0,0,115,4,0,
+    0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,100,
+    101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,101,
     99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,
-    116,1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,
-    125,2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,
-    78,114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,
-    0,0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,
-    0,114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,
-    101,115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,
-    110,95,114,101,115,111,117,114,99,101,209,3,0,0,115,4,
-    0,0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,
-    100,101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,
-    101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
-    0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,
-    0,160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,
-    3,124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,
-    2,124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,
-    11,105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,
-    108,101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,
-    38,0,0,0,114,47,0,0,0,114,44,0,0,0,114,254,
+    0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0,
+    160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,3,
+    124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,2,
+    124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,11,
+    105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,108,
+    101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,38,
+    0,0,0,114,47,0,0,0,114,44,0,0,0,114,255,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,104,
+    217,3,0,0,115,8,0,0,0,0,1,10,1,4,1,20,
+    1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,101,
+    115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+    67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,114,
+    12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,100,
+    2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,83,
+    0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,0,
+    0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,0,
+    114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,0,
+    0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,2,1,0,0,223,3,0,0,115,8,
+    0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,108,
+    101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,117,
+    114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,0,
+    1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,
+    0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,100,
+    1,25,0,161,1,131,1,83,0,114,1,1,0,0,41,5,
+    218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,115,
+    116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,246,
     0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,
-    104,213,3,0,0,115,8,0,0,0,0,1,10,1,4,1,
-    20,1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,
-    101,115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,
-    0,67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,
-    114,12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,
-    100,2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,
-    83,0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,
-    0,0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,
-    0,114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,
-    0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,1,1,0,0,219,3,0,0,115,
-    8,0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,
-    108,101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,
-    117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,
-    0,0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,
-    100,1,25,0,161,1,131,1,83,0,114,0,1,0,0,41,
-    5,218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,
-    115,116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,
-    246,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,8,99,111,110,116,101,110,116,115,225,3,0,
-    0,115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,
-    97,100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,
-    125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,
-    0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,
-    0,0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,
-    0,114,227,0,0,0,114,253,0,0,0,114,255,0,0,0,
-    114,3,1,0,0,114,1,1,0,0,114,7,1,0,0,90,
-    13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,
-    0,0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,
-    0,0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,
-    8,2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,
-    10,4,8,7,2,1,10,5,8,4,8,6,8,6,114,239,
-    0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,
-    0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,
-    3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,
-    7,156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,
-    11,218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,
-    100,101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,
-    112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,
-    83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,
-    110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
-    101,109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    3,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,
-    0,116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,
-    2,100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,
-    110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,
-    111,114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,
-    0,0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,
-    8,115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,
-    122,101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,224,0,0,0,233,3,0,0,115,4,0,0,0,
-    0,2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,
-    76,111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,
-    115,99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,
-    0,0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,
-    0,124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,
-    4,100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,
-    111,100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,
-    5,114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,
-    114,26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,226,0,0,0,238,3,
-    0,0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,
-    114,99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,
-    97,99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,
-    0,0,114,10,1,0,0,99,3,0,0,0,0,0,0,0,
-    1,0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,
-    115,0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,
-    5,103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,
-    52,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,
-    2,124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,
-    0,93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,
-    14,116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,
-    0,116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,
-    60,89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,
-    8,1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,
-    3,1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,
-    0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,
-    0,113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,
-    0,116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,
-    48,4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,
-    18,116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,
-    0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,
-    0,100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,
-    121,116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,
-    105,108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,
-    99,114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,
-    125,78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,
-    41,12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,
-    0,114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,
-    90,5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,
-    115,116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,
-    0,0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,
-    0,0,0,114,44,0,0,0,114,26,0,0,0,114,11,1,
-    0,0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,
-    37,0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,
-    0,0,243,3,0,0,115,48,0,0,0,0,2,12,1,4,
-    2,12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,
-    2,8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,
-    1,12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,
-    114,99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,
-    116,95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,
-    0,0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,
-    0,0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,8,1,0,0,229,3,0,0,115,8,0,0,0,8,2,
-    4,2,8,5,8,5,114,8,1,0,0,99,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    64,0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,
-    2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,
-    5,132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,
-    114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,
-    114,122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,
-    104,97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,
-    115,115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
-    0,5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,
-    160,0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,
-    125,3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,
-    124,1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,
-    100,2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,
-    83,0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,
-    2,114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,
-    0,0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,
-    0,114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,
-    0,0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,213,0,0,0,22,4,0,0,115,22,0,0,0,0,1,
-    10,1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,
-    2,1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,
-    70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,
-    111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,
-    0,100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,
-    78,111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,
+    0,0,218,8,99,111,110,116,101,110,116,115,229,3,0,0,
+    115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97,
+    100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,125,
+    0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,
+    0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,0,
+    0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,0,
+    114,227,0,0,0,114,254,0,0,0,114,0,1,0,0,114,
+    4,1,0,0,114,2,1,0,0,114,8,1,0,0,90,13,
+    95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,0,
+    0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,0,
+    0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,8,
+    2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10,
+    4,8,11,2,1,10,5,8,4,8,6,8,6,114,239,0,
+    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,0,
+    101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
+    132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,
+    156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,11,
+    218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
+    101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,112,
+    108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,83,
+    111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,110,
+    103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,
+    109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,0,
+    116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,2,
+    100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,110,
+    32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,
+    114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,0,
+    0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,8,
+    115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122,
+    101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,114,224,0,0,0,237,3,0,0,115,4,0,0,0,0,
+    2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,76,
+    111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,
+    99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
+    0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0,
+    124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4,
+    100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111,
+    100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,5,
+    114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,114,
+    26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,226,0,0,0,242,3,0,
+    0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,114,
+    99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,97,
+    99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,0,
+    0,114,11,1,0,0,99,3,0,0,0,0,0,0,0,1,
+    0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115,
+    0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5,
+    103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,52,
+    116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2,
+    124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,0,
+    93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,14,
+    116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,0,
+    116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,60,
+    89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,8,
+    1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3,
+    1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,0,
+    53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0,
+    113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,0,
+    116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,48,
+    4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,18,
+    116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,0,
+    53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0,
+    100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121,
+    116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,
+    108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,
+    114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,
+    78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,
+    12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0,
+    114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,90,
+    5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,
+    116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0,
+    0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,0,
+    0,0,114,44,0,0,0,114,26,0,0,0,114,12,1,0,
+    0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,37,
+    0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,
+    0,247,3,0,0,115,48,0,0,0,0,2,12,1,4,2,
+    12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,2,
+    8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,1,
+    12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114,
+    99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116,
+    95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0,
+    0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0,
+    0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
+    9,1,0,0,233,3,0,0,115,8,0,0,0,8,2,4,
+    2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,
+    0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2,
+    100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,
+    132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114,
+    99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
+    122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104,
+    97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115,
+    115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99,
+    2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,
+    5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160,
+    0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125,
+    3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124,
+    1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100,
+    2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83,
+    0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2,
+    114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,0,
+    0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0,
+    114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,0,
+    0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,0,
+    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
+    213,0,0,0,26,4,0,0,115,22,0,0,0,0,1,10,
+    1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2,
+    1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70,
+    105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111,
+    100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
+    0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
+    100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78,
+    111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32,
+    110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,
+    114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,229,0,0,0,42,4,
+    0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99,
+    101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,
+    103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0,
+    0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,
+    0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
+    15,1,0,0,22,4,0,0,115,6,0,0,0,8,2,4,
+    2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,
+    0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1,
+    90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,
+    90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,
+    90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0,
+    90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0,
+    90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20,
+    83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101,
+    114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32,
+    109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104,
+    101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115,
+    32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114,
+    107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101,
+    114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0,
+    0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,
+    0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0,
+    95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,0,
+    114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,209,0,0,0,59,4,0,0,115,4,0,
+    0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0,
+    0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0,
+    106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,114,
+    240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,243,0,0,0,63,4,0,
+    0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120,
+    116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+    114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,
+    0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
+    0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,
+    124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,114,
+    244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,247,0,0,0,67,4,0,
+    0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115,
+    105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,
+    104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,
+    36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,
+    125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6,
+    161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97,
+    116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101,
+    100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+    108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111,
+    100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100,
+    32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0,
+    0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101,
+    97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0,
+    114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,0,
+    0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,70,
+    4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255,
+    4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101,
+    110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
+    99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0,
+    0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116,
+    2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124,
+    0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41,
+    3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110,
+    32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
+    101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100,
+    117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101,
+    100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134,
+    0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101,
+    120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0,
+    114,117,0,0,0,114,44,0,0,0,114,253,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217,
+    0,0,0,78,4,0,0,115,10,0,0,0,0,2,14,1,
+    6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,
+    95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,
+    0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,
+    115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25,
+    0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116,
+    3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116,
+    117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,
+    101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+    32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,39,
+    0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
+    2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0,
+    0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107,
+    2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0,
+    0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,218,
+    6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95,
+    110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9,
+    60,103,101,110,101,120,112,114,62,87,4,0,0,115,4,0,
+    0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,
+    97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,
+    60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,0,
+    114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,69,
+    78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219,
+    0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0,
+    0,0,114,182,0,0,0,84,4,0,0,115,8,0,0,0,
+    0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115,
+    105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,
+    95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
+    0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101,
+    116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32,
+    101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+    32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97,
+    32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3,
+    0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,213,0,0,0,90,4,0,0,
+    115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105,
+    111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
+    95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,
+    0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,114,
+    110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115,
+    105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101,
     32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,
     78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,38,
-    4,0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,
-    99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
-    46,103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,
-    0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,
-    0,0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,14,1,0,0,18,4,0,0,115,6,0,0,0,8,2,
-    4,2,8,16,114,14,1,0,0,99,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,
-    0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,
-    1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,
-    0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,
-    0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,
-    0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,
-    0,90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,
-    20,83,0,41,21,218,19,69,120,116,101,110,115,105,111,110,
-    70,105,108,101,76,111,97,100,101,114,122,93,76,111,97,100,
-    101,114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,
-    32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,
-    104,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,
-    115,32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,
-    114,107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,
-    101,114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,
-    0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,
-    0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,
-    0,95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,
-    0,114,4,1,0,0,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,209,0,0,0,55,4,0,0,115,4,
-    0,0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,
-    0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,
-    0,106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,
-    114,240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,243,0,0,0,59,4,
-    0,0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,
-    120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
-    101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,94,
+    4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101,
+    110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
+    103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
+    0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250,
+    0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0,
+    0,98,4,0,0,115,2,0,0,0,0,3,122,32,69,120,
+    116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+    114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,
+    14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,
+    114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,
+    247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182,
+    0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0,
+    0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0,
+    51,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8,
+    4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114,
+    252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0,
+    0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
+    100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,
+    100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,
+    100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14,
+    100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18,
+    100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22,
+    100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0,
+    0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97,
+    109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39,
+    115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115,
+    32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,
+    10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115,
+    32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32,
+    97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105,
+    116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112,
+    97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97,
+    116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115,
+    32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111,
+    100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32,
+    105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32,
+    32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105,
+    110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108,
+    101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104,
+    101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39,
+    115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121,
+    115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0,
+    0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,
+    115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95,
+    1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124,
+    3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,6,
+    218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,112,
+    0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116,
+    95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114,
+    101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95,
+    102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,0,
+    0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,105,
+    110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6,
+    0,0,0,114,209,0,0,0,111,4,0,0,115,8,0,0,
+    0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101,
+    115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116,
+    95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4,
+    0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,
+    124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,
+    125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,
+    100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110,
+    115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,
+    114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,
+    44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,
+    116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,0,
+    0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,8,
+    95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114,
+    41,0,0,0,41,4,114,119,0,0,0,114,14,1,0,0,
+    218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95,
+    112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,
+    115,117,4,0,0,115,8,0,0,0,0,2,18,1,8,2,
+    4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97,
+    116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,
+    112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,
+    0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,
+    125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,
+    131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,0,
+    114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117,
+    108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,101,
+    110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,
+    112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3,
+    0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1,
+    0,0,127,4,0,0,115,4,0,0,0,0,1,12,1,122,
+    31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+    95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,
+    99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+    0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0,
+    124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2,
+    107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2,
+    125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,0,
+    107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,0,
+    95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,110,
+    0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,114,
+    26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140,
+    0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114,
+    119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,
+    104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108,
+    97,116,101,131,4,0,0,115,16,0,0,0,0,2,12,1,
+    10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,
+    99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0,
     0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
-    0,0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,
-    0,124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,
-    114,244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,247,0,0,0,63,4,
-    0,0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,
-    115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,
-    95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,
-    115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,
-    2,125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,
-    6,161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,
-    97,116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,
-    101,100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
-    117,108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,
-    111,100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,
-    100,32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,
-    0,0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,
-    101,97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,
-    0,114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,
-    0,0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,
-    66,4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,
-    255,4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,
-    101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
-    46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,
-    0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,
-    116,2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,
-    124,0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,
-    41,3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,
-    110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
-    108,101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,
-    100,117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,
-    101,100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,
-    134,0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,
-    101,120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,
-    0,114,117,0,0,0,114,44,0,0,0,114,252,0,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    217,0,0,0,74,4,0,0,115,10,0,0,0,0,2,14,
-    1,6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,
-    99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,
-    0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,
-    0,115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,
-    25,0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,
-    116,3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,
-    116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,
-    32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
-    101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,
-    39,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,
-    0,0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,
-    107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,
-    0,0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,
-    218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,
-    95,110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,
-    9,60,103,101,110,101,120,112,114,62,83,4,0,0,115,4,
-    0,0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,
-    112,97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,
-    46,60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,
-    0,114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,
-    69,78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,
-    219,0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,
-    0,0,0,114,182,0,0,0,80,4,0,0,115,8,0,0,
-    0,0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,
-    115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
+    0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,
+    1,83,0,114,110,0,0,0,41,2,114,6,1,0,0,114,
+    32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114,
+    95,95,144,4,0,0,115,2,0,0,0,0,1,122,23,95,
+    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
+    105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,
+    12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0,
+    114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,119,
+    0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116,
+    105,116,101,109,95,95,147,4,0,0,115,2,0,0,0,0,
+    1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,
+    104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0,
+    0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,
+    0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106,
+    0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,1,
+    114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,0,
+    0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109,
+    95,95,150,4,0,0,115,2,0,0,0,0,1,122,26,95,
+    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
+    115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,
+    0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
+    0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,
+    1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114,
+    32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95,
+    95,153,4,0,0,115,2,0,0,0,0,1,122,22,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108,
+    101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0,
+    0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,
+    0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,
+    78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116,
+    104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,24,
+    1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95,
+    95,156,4,0,0,115,2,0,0,0,0,1,122,23,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114,
+    101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,
+    0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,114,
+    110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,0,
+    218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110,
+    115,95,95,159,4,0,0,115,2,0,0,0,0,1,122,27,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
+    95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
+    67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124,
+    1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,2,
+    114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186,
+    0,0,0,162,4,0,0,115,2,0,0,0,0,1,122,21,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97,
+    112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0,
+    0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0,
+    0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0,
+    114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114,
+    38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186,
+    0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,22,1,0,0,104,4,0,0,
+    115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8,
+    13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1,
+    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0,
+    101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,
+    101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6,
+    132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
+    132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
+    132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0,
+    41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111,
+    97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0,
+    0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0,
+    0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1,
+    100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,0,
+    114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,209,0,0,0,168,4,
+    0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101,
+    115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,
+    0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2,
+    122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111,
+    114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32,
+    32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111,
+    100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
+    32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99,
+    104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32,
+    106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32,
+    32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123,
+    33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62,
+    41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193,
+    0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95,
+    114,101,112,114,171,4,0,0,115,2,0,0,0,0,7,122,
+    28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,
+    114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
+    0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,
+    2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0,
+    0,180,4,0,0,115,2,0,0,0,0,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105,
     115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
     0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,
-    0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,
-    101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,
-    32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
-    101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,
-    97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,
-    3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,114,213,0,0,0,86,4,0,
-    0,115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,
-    105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,
-    116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
-    4,0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,
-    114,110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,
-    115,105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,
-    101,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,
-    46,78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,
-    90,4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,
-    101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
-    46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,
-    67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,
-    250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,
-    0,0,94,4,0,0,115,2,0,0,0,0,3,122,32,69,
-    120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
-    101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,
-    41,14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,
-    0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,
-    114,247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,
-    182,0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,
-    0,0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,114,15,1,0,
-    0,47,4,0,0,115,22,0,0,0,8,2,4,6,8,4,
-    8,4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,
-    114,15,1,0,0,99,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,
-    0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,
-    2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,
-    6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,
-    10,100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,
-    14,100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,
-    18,100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,
-    22,100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,
-    0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,
-    97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,
-    39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,
-    115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,
-    101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,
-    115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,
-    32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,
-    105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,
-    112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,
-    97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,
-    115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,
-    111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,
-    32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,
-    32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,
-    105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,
-    108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,
-    104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,
-    39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,
-    121,115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,
-    0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,
-    0,115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,
-    95,1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,
-    124,3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,
-    6,218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,
-    112,0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,
-    116,95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,
-    114,101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,
-    95,102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,
-    0,0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,
-    105,110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,
-    6,0,0,0,114,209,0,0,0,107,4,0,0,115,8,0,
-    0,0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,
-    101,115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,
-    116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,
-    4,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,
-    0,124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,
-    2,125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,
-    1,100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,
-    110,115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,
-    97,114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,
-    101,44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,
-    116,116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,
-    0,0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,
-    8,95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,
-    114,41,0,0,0,41,4,114,119,0,0,0,114,13,1,0,
-    0,218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,
-    95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,
-    101,115,113,4,0,0,115,8,0,0,0,0,2,18,1,8,
-    2,4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,
-    97,116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,
-    95,112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,
-    2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,
-    2,131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,
-    0,114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,
-    117,108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,
-    101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,
-    14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,
-    1,0,0,123,4,0,0,115,4,0,0,0,0,1,12,1,
-    122,31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
-    46,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,
-    104,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,
-    0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,
-    0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,
-    2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,
-    2,125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,
-    0,107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,
-    0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,
-    110,0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,
-    114,26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,
-    140,0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,
-    114,119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,
-    116,104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,
-    108,97,116,101,127,4,0,0,115,16,0,0,0,0,2,12,
-    1,10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,
-    101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,
-    0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
-    0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,
-    131,1,83,0,114,110,0,0,0,41,2,114,5,1,0,0,
-    114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,
-    114,95,95,140,4,0,0,115,2,0,0,0,0,1,122,23,
-    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
-    95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,
-    0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
-    115,12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,
-    0,114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,
-    119,0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,
-    116,105,116,101,109,95,95,143,4,0,0,115,2,0,0,0,
-    0,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,
-    0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
-    0,0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,
-    106,0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,
-    1,114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,
-    0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,
-    109,95,95,146,4,0,0,115,2,0,0,0,0,1,122,26,
-    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
-    95,115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,
-    0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
-    0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,
-    131,1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,
-    114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,
-    95,95,149,4,0,0,115,2,0,0,0,0,1,122,22,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
-    108,101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,
-    0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,
-    2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,
-    24,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,
-    95,95,152,4,0,0,115,2,0,0,0,0,1,122,23,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
-    114,101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,
-    12,0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,
-    114,110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,
-    0,218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,
-    110,115,95,95,155,4,0,0,115,2,0,0,0,0,1,122,
-    27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
-    95,95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
-    0,67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,
-    124,1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,
-    2,114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    186,0,0,0,158,4,0,0,115,2,0,0,0,0,1,122,
-    21,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
-    97,112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,
-    0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,
-    0,0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,
-    0,114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,
-    114,38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,
-    186,0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,114,22,1,0,0,100,4,0,
-    0,115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,
-    8,13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,
-    1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,
-    0,101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,
-    3,101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,
-    6,132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,
-    10,132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,
-    14,132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,
-    0,41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,
-    111,97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,
-    0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,
-    0,0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,
-    1,100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,
-    0,114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,209,0,0,0,164,
-    4,0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,
-    101,115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,
-    0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,
-    2,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,
-    111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,
-    32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,
-    111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,
-    46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,
-    99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,
-    32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,
-    32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,
-    123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,
-    62,41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,
-    193,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,
-    95,114,101,112,114,167,4,0,0,115,2,0,0,0,0,7,
+    0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40,
+    0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0,
+    0,183,4,0,0,115,2,0,0,0,0,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103,
+    101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0,
+    0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100,
+    4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,122,
+    8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41,
+    1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,114,213,0,0,0,186,4,0,0,115,2,0,0,0,0,
+    1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,
+    100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+    0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210,
+    0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0,
+    0,189,4,0,0,115,2,0,0,0,0,1,122,30,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99,
+    114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+    0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,110,
+    0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0,
+    0,192,4,0,0,115,2,0,0,0,0,1,122,28,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101,
+    120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,
+    0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0,
+    106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2,
+    83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109,
+    101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10,
+    32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,
+    104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
+    100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,
+    117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,
+    32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112,
+    97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101,
+    100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125,
+    41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0,
+    0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,195,
+    4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2,
     122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-    101,114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-    0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,
-    41,2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,
-    0,0,176,4,0,0,115,2,0,0,0,0,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
-    0,0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,
-    40,0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,
-    0,0,179,4,0,0,115,2,0,0,0,0,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,
-    0,0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,
-    100,4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,
-    122,8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,
-    41,1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,213,0,0,0,182,4,0,0,115,2,0,0,0,
-    0,1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,
-    97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
-    0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,
-    210,0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,
-    0,0,185,4,0,0,115,2,0,0,0,0,1,122,30,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
-    0,0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,
-    110,0,0,0,114,3,0,0,0,114,252,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,
-    0,0,188,4,0,0,115,2,0,0,0,0,1,122,28,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-    67,0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,
-    0,106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,
-    2,83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,
-    109,101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,
-    10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,
-    116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,
-    101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,
-    100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,
-    10,32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,
-    112,97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,
-    101,100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,
-    125,41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,
-    0,0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,
-    191,4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,
-    2,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,
-    41,12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,
-    0,114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,
-    114,182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,
-    212,0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,43,1,0,0,163,4,0,0,115,18,0,0,0,
-    8,1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,
-    8,3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,
-    115,106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,
-    3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,
-    4,100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,
-    0,131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,
-    8,101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,
-    4,100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,
-    19,100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,
-    20,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,
-    101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,
-    102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,
-    32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,
-    95,32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,
-    0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,
-    0,0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,
-    2,160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,
-    2,124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,
-    0,113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,
-    5,161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,
-    97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,
-    116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,
-    111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,
-    110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,
-    32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,
-    121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
-    95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,
-    109,112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,
-    110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
-    41,6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,
-    1,0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,
-    6,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,46,1,0,0,209,4,0,0,115,
-    10,0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,
-    80,97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,
-    105,100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,
-    0,67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,
-    107,9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,
-    116,4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,
-    122,14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,
-    4,0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,
-    113,34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,
-    122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,
-    104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,
-    110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,
-    78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,
-    115,32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,
-    0,218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,
-    0,0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,
-    0,41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,
-    111,111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,219,
-    4,0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,
-    2,1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,
-    110,100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,
-    100,1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,
-    87,0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,
-    1,0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,
-    124,1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,
-    114,98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,
-    125,2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,
-    88,0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,
-    101,32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,
-    32,112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,
-    32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,
-    101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,
-    32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,
-    110,116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,
-    104,101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,
-    104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,
-    105,110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,
-    100,32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,
-    111,32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,
-    108,97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,
-    101,46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,
-    0,78,41,7,114,2,0,0,0,114,55,0,0,0,114,2,
-    1,0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,
-    101,121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,
-    0,0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,232,4,0,0,115,22,0,0,0,0,8,8,1,2,
-    1,12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,
-    1,122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,
-    0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,
-    116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,
-    161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,
-    161,1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,
-    116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,
-    124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,
-    83,0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,
-    0,114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,
-    114,201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,
-    6,114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,
-    114,140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,
-    95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,
-    254,4,0,0,115,18,0,0,0,0,4,10,1,16,2,10,
-    1,4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,
-    104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,
-    103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,
-    0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,
-    0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,
-    134,125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,
-    28,113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,
-    1,107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,
-    6,160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,
-    6,124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,
-    92,113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,
-    0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,
-    8,114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,
-    8,161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,
-    2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,
-    63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,
-    32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,
-    116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,
-    108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,
-    78,114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,
-    115,105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,
-    0,0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,
-    1,0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,
-    0,0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,
-    0,114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,
-    41,9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,
-    0,114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,
-    101,95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,
-    0,0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,
-    116,95,115,112,101,99,13,5,0,0,115,40,0,0,0,0,
-    5,4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,
-    2,12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,
-    5,12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,
-    100,101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,
-    0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,
-    0,0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,
-    8,114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,
-    2,124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,
-    1,83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,
-    4,125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,
-    1,124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,
-    0,100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,
-    2,122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,
-    32,115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,
-    97,109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,
-    32,111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,
-    32,32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,
-    105,115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,
-    112,97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,
-    121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
-    95,99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,
-    78,41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,
-    0,0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,
-    0,114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,
-    0,0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,
-    0,114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,203,0,0,0,45,5,0,0,115,26,
-    0,0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,
-    1,6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,
-    97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,
-    112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,
-    4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,
-    0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,
-    1,107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,
-    2,122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,
-    108,101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,
-    114,32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,
-    110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,
-    32,97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,
-    46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
-    97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,
-    104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
-    112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,
-    105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,
-    97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,
-    0,0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,6,0,0,0,114,206,0,0,0,69,5,0,0,
-    115,8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,
-    97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,
-    111,100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,
+    101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41,
     12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,
-    114,127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,
-    52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,
-    1,0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,
+    114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114,
+    182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212,
+    0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0,
     0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
-    0,114,45,1,0,0,205,4,0,0,115,30,0,0,0,8,
-    2,4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,
-    1,10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,
-    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,
-    101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
-    132,0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,
-    100,6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,
-    100,19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,
-    90,11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,
-    100,18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,
-    108,101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,
-    97,115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,
-    32,32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,
-    105,116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,
-    116,101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,
-    111,114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,
-    98,101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,
-    104,101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,
-    101,99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,
-    114,32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,
-    115,32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,
-    10,10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,
-    84,0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,
-    137,0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,
-    132,8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,
-    124,0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,
-    124,0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,
-    124,0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,
-    105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,
-    112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,
-    110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,
-    32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,
-    32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,
-    97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,
-    114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,
-    117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,
-    101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,
-    110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,
-    22,0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,
-    86,0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,
-    3,0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,19,1,0,0,98,
-    5,0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,
-    108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,
-    95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,
-    120,112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,
-    7,114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,
-    114,44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,
-    109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,
-    97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,
-    97,116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,
-    114,44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,
-    116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,
-    0,0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,
-    0,0,114,209,0,0,0,92,5,0,0,115,16,0,0,0,
-    0,4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,
-    122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,
-    0,0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,
-    31,73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,
-    100,105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,
-    114,105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,
-    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
-    0,114,46,1,0,0,106,5,0,0,115,2,0,0,0,0,
-    2,122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,
-    118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,
+    0,114,43,1,0,0,167,4,0,0,115,18,0,0,0,8,
+    1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8,
+    3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,
+    106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,
+    101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4,
+    100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0,
+    131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8,
+    101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,4,
+    100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,19,
+    100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,20,
+    218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101,
+    116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,
+    111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32,
+    112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95,
+    32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,
+    0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2,
+    160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2,
+    124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,0,
+    113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5,
+    161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97,
+    108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116,
+    101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111,
+    100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110,
+    116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32,
+    32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121,
+    115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
+    99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109,
+    112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110,
+    118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41,
+    6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,1,
+    0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,6,
+    102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,46,1,0,0,213,4,0,0,115,10,
+    0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,80,
+    97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,105,
+    100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,0,
+    67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,107,
+    9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116,
+    4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,122,
+    14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4,
+    0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,113,
+    34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,122,
+    46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,
+    95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,
+    100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,
+    122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,
+    32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,0,
+    218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,0,
+    0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,0,
+    41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,111,
+    111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,218,11,95,112,97,116,104,95,104,111,111,107,115,223,4,
+    0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,2,
+    1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,110,
+    100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,99,
     2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
-    3,0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,
-    0,124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,
-    1,103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,
-    38,103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,
-    111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,
-    102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
-    100,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,
-    32,110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,
-    32,32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,
-    111,110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,
-    97,100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,
-    114,116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,
-    32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,
-    32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,
-    101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
-    115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,
-    78,41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,
-    0,0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,137,0,0,0,112,5,0,0,115,8,0,0,0,
-    0,7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,
-    110,100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,
-    99,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,
-    0,6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,
-    124,2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,
-    124,4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,
-    41,1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,
-    0,0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,
-    109,115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,
-    0,124,5,0,0,115,8,0,0,0,0,1,10,1,8,1,
-    2,255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,
-    103,101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,
-    0,0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,
-    0,0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,
-    2,161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,
-    2,112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,
-    0,110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,
-    0,100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,
-    7,107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,
-    0,95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,
-    4,160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,
-    4,125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,
-    2,124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,
-    2,125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,
-    8,124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,
-    0,160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,
-    5,2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,
-    3,124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,
-    13,124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,
-    18,106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,
-    7,124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,
-    12,131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,
-    12,100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,
-    3,144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,
-    0,116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,
-    1,124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,
-    111,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,
-    112,101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,
-    105,102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,
-    32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,
-    104,101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,
-    44,32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,
-    32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,
-    70,114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,
-    114,209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,
-    41,1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,
-    112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,
-    99,101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,
-    114,49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,
-    55,0,0,0,114,9,1,0,0,114,50,0,0,0,114,62,
-    1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,
-    114,7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,
-    64,1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,
-    0,0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,
-    0,0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,
-    0,41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,
-    0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,
-    90,11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,
-    0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,
-    95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,
-    116,104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,
-    105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,
-    108,95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,129,
-    5,0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,
-    24,1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,
-    10,2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,
-    8,1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,
-    10,1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,
-    4,1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,
-    105,110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,
-    0,0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,
-    0,115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,
-    160,2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,
-    87,0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,
-    114,58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,
-    88,0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,
-    124,2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,
-    124,2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,
-    92,3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,
-    124,5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,
-    125,8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,
-    124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,
-    100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,
-    100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,
-    32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,
-    105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,
-    112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,
-    115,32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,
-    0,114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-    83,0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,
-    1,124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,
-    0,0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,
-    90,2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,9,60,115,101,116,99,111,109,112,62,206,5,
-    0,0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,
-    101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,
-    99,104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,
-    116,99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,
-    0,0,0,114,6,1,0,0,114,55,0,0,0,114,2,1,
-    0,0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,
-    114,111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,
-    114,121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,
-    0,114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,
-    114,101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,
-    3,97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,
-    114,119,0,0,0,114,44,0,0,0,114,7,1,0,0,90,
-    21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,
-    110,116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,
-    114,29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,
-    110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,114,67,1,0,0,177,5,0,0,115,34,0,0,
-    0,0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,
-    7,6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,
-    1,12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,
-    95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,
-    1,100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,
-    0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,
-    32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,
-    32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,
-    111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,
-    10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,
-    105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,
-    115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,
-    32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,
-    114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,
-    32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,
-    110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,
-    32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,
-    97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,
-    101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,
-    32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,
-    112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,
-    32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,
-    32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,
-    0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,
-    34,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,
-    124,0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,
-    158,2,142,0,83,0,41,3,122,45,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,101,114,121,46,70,105,108,101,
-    70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,
-    114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,
-    112,112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,
-    0,0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,
-    193,0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,
-    111,114,95,70,105,108,101,70,105,110,100,101,114,218,5,0,
-    0,115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,
-    108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,
-    111,107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,
-    95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,
-    110,100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,
-    114,66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,
-    72,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,
-    104,111,111,107,208,5,0,0,115,4,0,0,0,0,10,14,
-    6,122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,
-    116,104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,
-    0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,
-    115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,
-    0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,
-    40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,
-    0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,39,1,0,0,226,5,0,0,115,
-    2,0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,
-    101,114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,
+    8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,100,
+    1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,87,
+    0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,1,
+    0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,124,
+    1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,114,
+    98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,
+    2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,88,
+    0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,101,
+    32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,32,
+    112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,32,
+    115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,
+    114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32,
+    32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,110,
+    116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,104,
+    101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,104,
+    101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,105,
+    110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,100,
+    32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,111,
+    32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,108,
+    97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,101,
+    46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,0,
+    78,41,7,114,2,0,0,0,114,55,0,0,0,114,3,1,
+    0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,101,
+    121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,0,
+    0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,236,4,0,0,115,22,0,0,0,0,8,8,1,2,1,
+    12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,1,
+    122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,
+    0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,116,
+    0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,161,
+    1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,161,
+    1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,116,
+    3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,124,
+    1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,83,
+    0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,0,
+    114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,114,
+    201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,6,
+    114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,114,
+    140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,3,
+    0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,
+    108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,2,
+    5,0,0,115,18,0,0,0,0,4,10,1,16,2,10,1,
+    4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,104,
+    70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103,
+    101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0,
+    0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0,
+    0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134,
+    125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28,
+    113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1,
+    107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,6,
+    160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6,
+    124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,92,
+    113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,0,
+    1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,8,
+    114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8,
+    161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2,
+    125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63,
+    70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32,
+    111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116,
+    104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,
+    101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78,
+    114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115,
+    105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0,
+    0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,1,
+    0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,0,
+    0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,0,
+    114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41,
+    9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0,
+    114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101,
+    95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,0,
+    0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,116,
+    95,115,112,101,99,17,5,0,0,115,40,0,0,0,0,5,
+    4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,2,
+    12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,5,
+    12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,100,
+    101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,
+    0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,
+    0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,8,
+    114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,2,
+    124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,1,
+    83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,4,
+    125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,1,
+    124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,
+    100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,2,
+    122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,32,
+    115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,97,
+    109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,32,
+    111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,32,
+    32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,105,
+    115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,
+    97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,
+    115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
+    99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,
+    41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,0,
+    0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,0,
+    114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,0,
+    0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,0,
+    114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,203,0,0,0,49,5,0,0,115,26,0,
+    0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,1,
+    6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,97,
+    116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,112,
+    101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4,
+    0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0,
+    124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1,
+    107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,2,
+    122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,108,
+    101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,
+    32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110,
+    32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,
+    97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46,
+    112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
+    99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,104,
+    105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,
+    114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,
+    110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,
+    100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,0,
+    0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,6,0,0,0,114,206,0,0,0,73,5,0,0,115,
+    8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,97,
+    116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111,
+    100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,12,
     114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,
-    127,0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,
-    0,0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,
-    0,0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,
-    0,114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    59,1,0,0,83,5,0,0,115,22,0,0,0,8,2,4,
-    7,8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,
-    1,10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,
-    0,0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,
-    0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,
-    124,0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,
-    114,36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,
-    114,56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,
-    124,1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,
-    124,2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,
-    100,2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,
-    100,4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,
-    4,0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,
-    110,2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,
-    111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,
-    95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,
-    90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,
-    103,101,116,114,140,0,0,0,114,14,1,0,0,114,8,1,
-    0,0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,
-    111,110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,
-    97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,
-    109,101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,
-    120,95,117,112,95,109,111,100,117,108,101,232,5,0,0,115,
-    34,0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,
-    8,1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,
-    8,1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,
-    0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,
-    6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,
-    1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,
-    116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,
-    109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,
-    10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,
-    115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,
-    114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,
-    32,32,41,7,114,15,1,0,0,114,163,0,0,0,218,18,
-    101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,
-    101,115,114,8,1,0,0,114,102,0,0,0,114,14,1,0,
-    0,114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,
-    105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,
-    116,101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,184,0,0,0,255,5,0,0,115,8,
-    0,0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,
-    99,1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,
-    0,9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,
-    97,0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,
-    106,3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,
-    124,2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,
-    161,1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,
-    116,6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,
-    100,3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,
-    102,2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,
-    116,7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,
-    115,136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,
-    116,1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,
-    125,8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,
-    161,1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,
-    116,9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,
-    89,0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,
-    116,6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,
-    100,11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,
-    160,10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,
-    100,15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,
-    116,0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,
-    124,9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,
-    116,6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,
-    107,2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,
-    116,6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,
-    100,21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,
-    160,14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,
-    114,174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,
-    107,6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,
-    41,26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,
-    116,104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,
-    114,115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,
-    32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,
-    101,100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,
-    110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,
-    106,101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,
-    111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,
-    101,115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,
-    101,114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,
-    101,32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,
-    32,116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,
-    114,97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,
-    32,41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,
-    117,105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,
-    115,105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,
-    0,0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,
-    1,116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,
-    2,100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,
-    22,0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    19,1,0,0,35,6,0,0,115,4,0,0,0,4,0,2,
-    0,122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,
-    115,62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,
-    0,122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,
-    117,105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,
-    116,114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,
-    114,40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,
+    127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,52,
+    1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,1,
+    0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
+    114,45,1,0,0,209,4,0,0,115,30,0,0,0,8,2,
+    4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,1,
+    10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,0,
+    0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,
+    0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
+    0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,
+    6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,
+    19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,
+    11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,
+    18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,
+    101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,
+    115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,
+    32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,
+    116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
+    101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,
+    114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,
+    101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,
+    101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,
+    99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,
+    32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,
+    32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,
+    10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84,
+    0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137,
+    0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,
+    8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124,
+    0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124,
+    0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124,
+    0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105,
+    97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,
+    97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,
+    32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,
+    110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,
+    32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,
+    105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,
+    32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,
+    102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,
+    114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,
+    105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,
+    0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,
+    0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,3,
+    0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,19,1,0,0,102,5,
+    0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,108,
+    101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,
+    46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,
+    112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,7,
+    114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,
+    44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,
+    101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,
+    99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,
+    116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,114,
+    44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,
+    97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,
+    0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,0,
+    0,114,209,0,0,0,96,5,0,0,115,16,0,0,0,0,
+    4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,122,
+    19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,
+    0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0,
+    0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31,
+    73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,
+    105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,
+    105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,0,
+    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
+    114,46,1,0,0,110,5,0,0,115,2,0,0,0,0,2,
+    122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118,
+    97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
+    0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0,
+    124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,1,
+    103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38,
+    103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,111,
+    32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,
+    111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,
+    32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,
+    110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,
+    32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,
+    110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,
+    100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,
+    116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,
+    32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,
+    100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,
+    32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,
+    116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,
+    41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,0,
+    0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,114,137,0,0,0,116,5,0,0,115,8,0,0,0,0,
+    7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,110,
+    100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,
+    6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,
+    6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,
+    2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,
+    4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,41,
+    1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,0,
+    0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,109,
+    115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,0,
+    128,5,0,0,115,8,0,0,0,0,1,10,1,8,1,2,
+    255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,
+    101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,
+    0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,
+    0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,2,
+    161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2,
+    112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0,
+    110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,0,
+    100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,7,
+    107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,0,
+    95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,4,
+    160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4,
+    125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,2,
+    124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2,
+    125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8,
+    124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,0,
+    160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5,
+    2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,3,
+    124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13,
+    124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18,
+    106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7,
+    124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,12,
+    131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,12,
+    100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,3,
+    144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,0,
+    116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1,
+    124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111,
+    84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,
+    101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,
+    102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,
+    32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,
+    101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,
+    32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,
+    102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,
+    114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,114,
+    209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41,
+    1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112,
+    111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,
+    101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114,
+    49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,55,
+    0,0,0,114,10,1,0,0,114,50,0,0,0,114,62,1,
+    0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,
+    7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,64,
+    1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,0,
+    0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,0,
+    0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0,
+    41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,0,
+    0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90,
+    11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0,
+    0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95,
+    109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116,
+    104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,105,
+    116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108,
+    95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,203,0,0,0,133,5,
+    0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,24,
+    1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,10,
+    2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8,
+    1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,10,
+    1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,4,
+    1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105,
+    110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0,
+    0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0,
+    115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,160,
+    2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87,
+    0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,114,
+    58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,88,
+    0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,124,
+    2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124,
+    2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92,
+    3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,124,
+    5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125,
+    8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,124,
+    0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,100,
+    4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100,
+    6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32,
+    99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105,
+    97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112,
+    97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115,
+    32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0,
+    114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,0,
     0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,
-    0,0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,
-    100,0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,
-    114,74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,
-    0,218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,114,68,1,0,0,51,6,0,0,115,4,0,0,
-    0,6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,
-    111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,
-    90,7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,
-    114,101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,
-    114,7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,
-    112,121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,
-    0,114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,
-    90,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,
-    110,97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,
-    0,0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,
-    0,0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,
-    0,114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,
-    114,195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,
-    114,97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,
-    95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,
-    95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,
-    111,100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,
-    115,90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,
-    0,0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,
-    108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,
-    101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,
-    101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,
-    6,95,115,101,116,117,112,10,6,0,0,115,78,0,0,0,
-    0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,
-    10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,
-    6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,
-    12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,
-    10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,
-    1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
-    2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,
-    0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,
-    2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,
-    1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,
-    1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,
-    104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,
-    112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,
-    78,41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,
-    0,0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,
-    0,114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,
-    104,114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,
-    0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,
-    97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,
-    6,0,0,0,218,8,95,105,110,115,116,97,108,108,75,6,
-    0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,
-    89,1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,
-    90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,
-    73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,
-    84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,
-    0,114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,
-    114,38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,
-    53,0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,
-    0,0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,
-    95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,
-    0,0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,
-    0,114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,
-    114,102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,
-    71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,
-    88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,
-    89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,
-    114,98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,
-    113,0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,
-    0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,
-    0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,
-    0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,
-    0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,
-    0,0,114,221,0,0,0,114,239,0,0,0,114,8,1,0,
-    0,114,14,1,0,0,114,21,1,0,0,114,15,1,0,0,
-    114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,
-    59,1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,
-    1,0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,
-    111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,
-    22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,
-    5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,
-    9,12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,
-    2,6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,
-    28,8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,
-    14,6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,
-    17,14,68,18,45,18,26,4,3,18,53,14,63,14,42,14,
-    127,0,7,14,127,0,22,12,23,8,11,8,65,
+    0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1,
+    124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,0,
+    0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,90,
+    2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,218,9,60,115,101,116,99,111,109,112,62,210,5,0,
+    0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,101,
+    70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,
+    104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,116,
+    99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,0,
+    0,0,114,7,1,0,0,114,55,0,0,0,114,3,1,0,
+    0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114,
+    111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114,
+    121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,0,
+    114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,114,
+    101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,3,
+    97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,114,
+    119,0,0,0,114,44,0,0,0,114,8,1,0,0,90,21,
+    108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110,
+    116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,114,
+    29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110,
+    97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,114,67,1,0,0,181,5,0,0,115,34,0,0,0,
+    0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,7,
+    6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,1,
+    12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,95,
+    102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,
+    0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,
+    100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,0,
+    0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,
+    119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,
+    99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,
+    110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,
+    32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,
+    108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,
+    116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,
+    115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,
+    115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,
+    32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,
+    32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,
+    32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,
+    116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,
+    32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,
+    97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,
+    111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,
+    32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,
+    32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,
+    0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,34,
+    0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,
+    0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,158,
+    2,142,0,83,0,41,3,122,45,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,101,114,121,46,70,105,108,101,70,
+    105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,
+    101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,
+    112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,0,
+    0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,193,
+    0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,0,
+    0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,
+    114,95,70,105,108,101,70,105,110,100,101,114,222,5,0,0,
+    115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,108,
+    101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111,
+    107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,95,
+    104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,
+    100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,114,
+    66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,72,
+    1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,104,
+    111,111,107,212,5,0,0,115,4,0,0,0,0,10,14,6,
+    122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,116,
+    104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,0,
+    0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,
+    12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,
+    41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,40,
+    123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,0,
+    0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,39,1,0,0,230,5,0,0,115,2,
+    0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,101,
+    114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,
+    125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,
+    0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,0,
+    0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,0,
+    0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,0,
+    114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,59,
+    1,0,0,87,5,0,0,115,22,0,0,0,8,2,4,7,
+    8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,1,
+    10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,0,
+    0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,
+    115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,124,
+    0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,114,
+    36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,114,
+    56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,124,
+    1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,124,
+    2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,100,
+    2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,
+    4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,4,
+    0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,110,
+    2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,111,
+    97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95,
+    114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,90,
+    10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103,
+    101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0,
+    0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111,
+    110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,97,
+    116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,
+    101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120,
+    95,117,112,95,109,111,100,117,108,101,236,5,0,0,115,34,
+    0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8,
+    1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8,
+    1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,
+    0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,
+    102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,
+    102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1,
+    122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,
+    32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,
+    111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,
+    32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,
+    32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,
+    44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,
+    32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101,
+    120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,
+    115,114,9,1,0,0,114,102,0,0,0,114,15,1,0,0,
+    114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,105,
+    111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116,
+    101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,184,0,0,0,3,6,0,0,115,8,0,
+    0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99,
+    1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,
+    9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,97,
+    0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106,
+    3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124,
+    2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,161,
+    1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116,
+    6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100,
+    3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102,
+    2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,116,
+    7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115,
+    136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,116,
+    1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,125,
+    8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,161,
+    1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,116,
+    9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,89,
+    0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,116,
+    6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,100,
+    11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,160,
+    10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,100,
+    15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,116,
+    0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,124,
+    9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,116,
+    6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,107,
+    2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,116,
+    6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,100,
+    21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,160,
+    14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,114,
+    174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,107,
+    6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,41,
+    26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,116,
+    104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,114,
+    115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,32,
+    98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,
+    100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,110,
+    32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,
+    101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,111,
+    32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,
+    115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,101,
+    114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,101,
+    32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,32,
+    116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,114,
+    97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,32,
+    41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,117,
+    105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,115,
+    105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
+    0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1,
+    116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2,
+    100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,22,
+    0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,19,
+    1,0,0,39,6,0,0,115,4,0,0,0,4,0,2,0,
+    122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115,
+    62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,0,
+    122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,117,
+    105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,116,
+    114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,114,
+    40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,
+    0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,100,
+    0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,114,
+    74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,0,
+    218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,114,68,1,0,0,55,6,0,0,115,4,0,0,0,
+    6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,111,
+    99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,90,
+    7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,114,
+    101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,114,
+    7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,112,
+    121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,0,
+    114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,90,
+    18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110,
+    97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,0,
+    0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,0,
+    0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,0,
+    114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,114,
+    195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,114,
+    97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,95,
+    109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,
+    110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,
+    100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,115,
+    90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,0,
+    0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,108,
+    101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,101,
+    90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,101,
+    90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,6,
+    95,115,101,116,117,112,14,6,0,0,115,78,0,0,0,0,
+    8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,10,
+    1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,6,
+    2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,12,
+    1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,10,
+    1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,1,
+    0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,
+    0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0,
+    116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2,
+    106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1,
+    1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1,
+    83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104,
+    101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112,
+    111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78,
+    41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,0,
+    0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,0,
+    114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,104,
+    114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,0,
+    0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97,
+    100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,6,
+    0,0,0,218,8,95,105,110,115,116,97,108,108,79,6,0,
+    0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,89,
+    1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,90,
+    37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73,
+    86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84,
+    69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,0,
+    114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,114,
+    38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,53,
+    0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,0,
+    0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,95,
+    95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,0,
+    0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,0,
+    114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,114,
+    102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,71,
+    95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+    69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,89,
+    84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,114,
+    98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,113,
+    0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,0,
+    0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,0,
+    0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,0,
+    114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,0,
+    0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,0,
+    0,114,221,0,0,0,114,239,0,0,0,114,9,1,0,0,
+    114,15,1,0,0,114,21,1,0,0,114,252,0,0,0,114,
+    22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,59,
+    1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,1,
+    0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,111,
+    100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22,
+    4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5,
+    8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9,
+    12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,2,
+    6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,28,
+    8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,14,
+    6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,17,
+    14,72,18,45,18,26,4,3,18,53,14,63,14,42,14,127,
+    0,7,14,127,0,22,12,23,8,11,8,65,
 };
diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h
index b796894..cbb3d90 100644
--- a/Python/importlib_zipimport.h
+++ b/Python/importlib_zipimport.h
@@ -522,563 +522,562 @@
     0,0,0,114,35,0,0,0,65,1,0,0,115,12,0,0,
     0,0,1,10,1,14,1,8,1,10,1,10,1,114,35,0,
     0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,
-    0,0,0,9,0,0,0,67,0,0,0,115,254,4,0,0,
-    122,16,116,0,160,1,124,0,100,1,161,2,125,1,87,0,
-    110,38,4,0,116,2,107,10,114,54,1,0,1,0,1,0,
-    116,3,100,2,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,1,144,4,143,168,1,0,
-    122,36,124,1,160,4,116,5,11,0,100,4,161,2,1,0,
-    124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1,
-    125,3,87,0,110,38,4,0,116,2,107,10,114,138,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,3,
-    131,1,116,5,107,3,114,170,116,3,100,5,124,0,155,2,
-    157,2,124,0,100,3,141,2,130,1,124,3,100,0,100,6,
-    133,2,25,0,116,9,107,3,144,1,114,180,122,24,124,1,
-    160,4,100,7,100,4,161,2,1,0,124,1,160,6,161,0,
-    125,4,87,0,110,38,4,0,116,2,107,10,114,250,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,10,124,4,
-    116,11,24,0,116,5,24,0,100,7,131,2,125,5,122,22,
-    124,1,160,4,124,5,161,1,1,0,124,1,160,7,161,0,
-    125,6,87,0,110,40,4,0,116,2,107,10,144,1,114,76,
-    1,0,1,0,1,0,116,3,100,5,124,0,155,2,157,2,
-    124,0,100,3,141,2,130,1,89,0,110,2,88,0,124,6,
-    160,12,116,9,161,1,125,7,124,7,100,7,107,0,144,1,
-    114,116,116,3,100,8,124,0,155,2,157,2,124,0,100,3,
-    141,2,130,1,124,6,124,7,124,7,116,5,23,0,133,2,
-    25,0,125,3,116,8,124,3,131,1,116,5,107,3,144,1,
-    114,164,116,3,100,9,124,0,155,2,157,2,124,0,100,3,
-    141,2,130,1,124,4,116,8,124,6,131,1,24,0,124,7,
-    23,0,125,2,116,13,124,3,100,10,100,11,133,2,25,0,
-    131,1,125,8,116,13,124,3,100,11,100,12,133,2,25,0,
-    131,1,125,9,124,2,124,8,107,0,144,1,114,240,116,3,
-    100,13,124,0,155,2,157,2,124,0,100,3,141,2,130,1,
-    124,2,124,9,107,0,144,2,114,12,116,3,100,14,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,124,2,124,8,
-    56,0,125,2,124,2,124,9,24,0,125,10,124,10,100,7,
-    107,0,144,2,114,56,116,3,100,15,124,0,155,2,157,2,
-    124,0,100,3,141,2,130,1,105,0,125,11,100,7,125,12,
-    122,14,124,1,160,4,124,2,161,1,1,0,87,0,110,40,
-    4,0,116,2,107,10,144,2,114,118,1,0,1,0,1,0,
-    116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,1,160,7,100,16,161,1,
-    125,3,116,8,124,3,131,1,100,6,107,0,144,2,114,152,
-    116,14,100,17,131,1,130,1,124,3,100,0,100,6,133,2,
-    25,0,100,18,107,3,144,2,114,174,144,4,113,226,116,8,
-    124,3,131,1,100,16,107,3,144,2,114,196,116,14,100,17,
-    131,1,130,1,116,15,124,3,100,19,100,20,133,2,25,0,
-    131,1,125,13,116,15,124,3,100,20,100,10,133,2,25,0,
-    131,1,125,14,116,15,124,3,100,10,100,21,133,2,25,0,
-    131,1,125,15,116,15,124,3,100,21,100,11,133,2,25,0,
-    131,1,125,16,116,13,124,3,100,11,100,12,133,2,25,0,
-    131,1,125,17,116,13,124,3,100,12,100,22,133,2,25,0,
-    131,1,125,18,116,13,124,3,100,22,100,23,133,2,25,0,
-    131,1,125,4,116,15,124,3,100,23,100,24,133,2,25,0,
-    131,1,125,19,116,15,124,3,100,24,100,25,133,2,25,0,
-    131,1,125,20,116,15,124,3,100,25,100,26,133,2,25,0,
-    131,1,125,21,116,13,124,3,100,27,100,16,133,2,25,0,
-    131,1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,
-    124,22,124,9,107,4,144,3,114,156,116,3,100,28,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,124,22,124,10,
-    55,0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,
-    87,0,110,40,4,0,116,2,107,10,144,3,114,218,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,23,
-    131,1,124,19,107,3,144,3,114,252,116,3,100,5,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,122,50,116,8,
-    124,1,160,7,124,8,124,19,24,0,161,1,131,1,124,8,
-    124,19,24,0,107,3,144,4,114,44,116,3,100,5,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,87,0,110,40,
-    4,0,116,2,107,10,144,4,114,86,1,0,1,0,1,0,
-    116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,13,100,29,64,0,144,4,
-    114,108,124,23,160,16,161,0,125,23,110,54,122,14,124,23,
-    160,16,100,30,161,1,125,23,87,0,110,38,4,0,116,17,
-    107,10,144,4,114,160,1,0,1,0,1,0,124,23,160,16,
-    100,31,161,1,160,18,116,19,161,1,125,23,89,0,110,2,
-    88,0,124,23,160,20,100,32,116,21,161,2,125,23,116,22,
-    160,23,124,0,124,23,161,2,125,24,124,24,124,14,124,18,
-    124,4,124,22,124,15,124,16,124,17,102,8,125,25,124,25,
-    124,11,124,23,60,0,124,12,100,33,55,0,125,12,144,2,
-    113,120,87,0,53,0,81,0,82,0,88,0,116,24,160,25,
-    100,34,124,12,124,0,161,3,1,0,124,11,83,0,41,35,
-    78,218,2,114,98,122,21,99,97,110,39,116,32,111,112,101,
-    110,32,90,105,112,32,102,105,108,101,58,32,114,12,0,0,
-    0,114,86,0,0,0,250,21,99,97,110,39,116,32,114,101,
-    97,100,32,90,105,112,32,102,105,108,101,58,32,233,4,0,
-    0,0,114,0,0,0,0,122,16,110,111,116,32,97,32,90,
-    105,112,32,102,105,108,101,58,32,122,18,99,111,114,114,117,
-    112,116,32,90,105,112,32,102,105,108,101,58,32,233,12,0,
-    0,0,233,16,0,0,0,233,20,0,0,0,122,28,98,97,
-    100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116,
-    111,114,121,32,115,105,122,101,58,32,122,30,98,97,100,32,
-    99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,
-    121,32,111,102,102,115,101,116,58,32,122,38,98,97,100,32,
-    99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,
-    121,32,115,105,122,101,32,111,114,32,111,102,102,115,101,116,
-    58,32,233,46,0,0,0,250,27,69,79,70,32,114,101,97,
-    100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101,
-    99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0,
-    0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0,
-    0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0,
-    233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32,
-    108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102,
-    115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105,
-    105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0,
-    0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111,
-    117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32,
-    123,33,114,125,41,26,218,3,95,105,111,218,4,111,112,101,
-    110,114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,
-    107,218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,
-    73,82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,
-    101,97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,
-    95,69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,
-    120,218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,
-    69,78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,
-    69,79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,
-    0,0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,
-    101,69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,
-    101,218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,
-    0,0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,
-    0,0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,
-    0,0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,
-    112,111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,
-    218,9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,
-    95,99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,
-    100,97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,
-    114,95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,
-    102,102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,
-    116,114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,
-    108,97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,
-    116,105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,
-    9,100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,
-    95,115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,
-    101,90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,
-    11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,
-    0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,
-    0,0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,
-    0,115,212,0,0,0,0,1,2,1,16,1,14,1,24,2,
-    8,1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,
-    18,1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,
-    12,2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,
-    12,1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,
-    2,255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,
-    16,1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,
-    10,1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,
-    10,1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,
-    16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,
-    16,1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,
-    16,1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,
-    24,2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,
-    12,1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,
-    190,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,
-    12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,
-    28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,
-    44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
-    60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,
-    76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,
-    92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,
-    108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,
-    124,125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,
-    195,165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,
-    195,132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,
-    195,187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,
-    226,130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,
-    145,194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,
-    194,161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,
-    148,130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,
-    149,226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,
-    226,149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,
-    148,156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,
-    154,226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,
-    226,149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,
-    149,153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,
-    170,226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,
-    226,150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,
-    207,131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,
-    158,207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,
-    226,137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,
-    226,136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,
-    194,160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,
-    0,0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,
-    116,0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,
-    100,2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,
-    100,5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,
-    116,6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,
-    100,1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,
-    110,2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,
-    160,2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,
-    27,122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,
-    32,85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,
-    110,39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,
-    97,116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,
-    97,105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,
-    10,100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,
-    112,105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,
-    97,105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,
-    114,116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,
-    77,0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,
-    142,0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,
-    141,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,
-    114,101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,
-    0,0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,
-    14,1,10,1,18,2,6,2,10,1,114,145,0,0,0,99,
-    2,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,
-    9,0,0,0,67,0,0,0,115,130,1,0,0,124,1,92,
-    8,125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,
-    9,124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,
-    1,116,1,160,2,124,0,100,3,161,2,144,1,143,8,125,
-    10,122,14,124,10,160,3,124,6,161,1,1,0,87,0,110,
-    38,4,0,116,4,107,10,114,104,1,0,1,0,1,0,116,
-    0,100,4,124,0,155,2,157,2,124,0,100,5,141,2,130,
-    1,89,0,110,2,88,0,124,10,160,5,100,6,161,1,125,
-    11,116,6,124,11,131,1,100,6,107,3,114,136,116,7,100,
-    7,131,1,130,1,124,11,100,0,100,8,133,2,25,0,100,
-    9,107,3,114,170,116,0,100,10,124,0,155,2,157,2,124,
-    0,100,5,141,2,130,1,116,8,124,11,100,11,100,12,133,
-    2,25,0,131,1,125,12,116,8,124,11,100,12,100,6,133,
-    2,25,0,131,1,125,13,100,6,124,12,23,0,124,13,23,
-    0,125,14,124,6,124,14,55,0,125,6,122,14,124,10,160,
-    3,124,6,161,1,1,0,87,0,110,40,4,0,116,4,107,
-    10,144,1,114,20,1,0,1,0,1,0,116,0,100,4,124,
-    0,155,2,157,2,124,0,100,5,141,2,130,1,89,0,110,
-    2,88,0,124,10,160,5,124,4,161,1,125,15,116,6,124,
-    15,131,1,124,4,107,3,144,1,114,54,116,4,100,13,131,
-    1,130,1,87,0,53,0,81,0,82,0,88,0,124,3,100,
-    1,107,2,144,1,114,78,124,15,83,0,122,10,116,9,131,
-    0,125,16,87,0,110,30,4,0,116,10,107,10,144,1,114,
-    118,1,0,1,0,1,0,116,0,100,14,131,1,130,1,89,
-    0,110,2,88,0,124,16,124,15,100,15,131,2,83,0,41,
-    16,78,114,0,0,0,0,122,18,110,101,103,97,116,105,118,
-    101,32,100,97,116,97,32,115,105,122,101,114,92,0,0,0,
-    114,93,0,0,0,114,12,0,0,0,114,105,0,0,0,114,
-    99,0,0,0,114,94,0,0,0,115,4,0,0,0,80,75,
-    3,4,122,23,98,97,100,32,108,111,99,97,108,32,102,105,
-    108,101,32,104,101,97,100,101,114,58,32,233,26,0,0,0,
-    114,104,0,0,0,122,26,122,105,112,105,109,112,111,114,116,
-    58,32,99,97,110,39,116,32,114,101,97,100,32,100,97,116,
-    97,114,140,0,0,0,105,241,255,255,255,41,11,114,3,0,
-    0,0,114,111,0,0,0,114,112,0,0,0,114,113,0,0,
-    0,114,22,0,0,0,114,115,0,0,0,114,51,0,0,0,
-    114,120,0,0,0,114,1,0,0,0,114,145,0,0,0,114,
-    144,0,0,0,41,17,114,29,0,0,0,114,54,0,0,0,
-    90,8,100,97,116,97,112,97,116,104,114,131,0,0,0,114,
-    135,0,0,0,114,126,0,0,0,114,138,0,0,0,114,132,
-    0,0,0,114,133,0,0,0,114,134,0,0,0,114,124,0,
-    0,0,114,125,0,0,0,114,136,0,0,0,114,137,0,0,
-    0,114,128,0,0,0,90,8,114,97,119,95,100,97,116,97,
-    114,142,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
-    10,0,0,0,114,52,0,0,0,19,2,0,0,115,62,0,
-    0,0,0,1,20,1,8,1,8,2,16,2,2,1,14,1,
-    14,1,24,1,10,1,12,1,8,2,16,2,18,2,16,1,
-    16,1,12,1,8,1,2,1,14,1,16,1,24,1,10,1,
-    14,1,18,2,10,2,4,3,2,1,10,1,16,1,14,1,
-    114,52,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16,
-    0,0,0,116,0,124,0,124,1,24,0,131,1,100,1,107,
-    1,83,0,41,2,78,114,5,0,0,0,41,1,218,3,97,
-    98,115,41,2,90,2,116,49,90,2,116,50,114,9,0,0,
-    0,114,9,0,0,0,114,10,0,0,0,218,9,95,101,113,
-    95,109,116,105,109,101,65,2,0,0,115,2,0,0,0,0,
-    2,114,148,0,0,0,99,5,0,0,0,0,0,0,0,0,
-    0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115,
-    68,1,0,0,124,3,124,2,100,1,156,2,125,5,122,18,
-    116,0,160,1,124,4,124,3,124,5,161,3,125,6,87,0,
-    110,26,4,0,116,2,107,10,114,54,1,0,1,0,1,0,
-    89,0,100,0,83,0,89,0,110,2,88,0,124,6,100,2,
-    64,0,100,3,107,3,125,7,124,7,114,190,124,6,100,4,
-    64,0,100,3,107,3,125,8,116,3,106,4,100,5,107,3,
-    114,188,124,8,115,108,116,3,106,4,100,6,107,2,114,188,
-    116,5,124,0,124,2,131,2,125,9,124,9,100,0,107,9,
-    114,188,116,3,160,6,116,0,106,7,124,9,161,2,125,10,
-    122,20,116,8,160,9,124,4,124,10,124,3,124,5,161,4,
-    1,0,87,0,110,26,4,0,116,2,107,10,114,186,1,0,
-    1,0,1,0,89,0,100,0,83,0,89,0,110,2,88,0,
-    110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12,
-    124,11,144,1,114,18,116,11,116,12,124,4,100,7,100,8,
-    133,2,25,0,131,1,124,11,131,2,114,254,116,12,124,4,
-    100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1,
-    114,18,116,13,160,14,100,10,124,3,155,2,157,2,161,1,
-    1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0,
-    133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2,
-    144,1,115,64,116,19,100,11,124,1,155,2,100,12,157,3,
-    131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0,
-    0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0,
-    0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97,
-    108,119,97,121,115,114,100,0,0,0,114,95,0,0,0,114,
-    96,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105,
-    115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111,
-    109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21,
-    32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111,
-    98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99,
-    108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0,
-    218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97,
-    115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95,
-    103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11,
-    115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65,
-    87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18,
-    95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110,
-    97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97,
-    115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105,
-    109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115,
-    111,117,114,99,101,114,148,0,0,0,114,2,0,0,0,114,
-    76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104,
-    97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10,
-    95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101,
-    69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0,
-    0,114,63,0,0,0,114,38,0,0,0,114,127,0,0,0,
-    90,11,101,120,99,95,100,101,116,97,105,108,115,114,130,0,
-    0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12,
-    99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111,
-    117,114,99,101,95,98,121,116,101,115,114,151,0,0,0,90,
-    12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115,
-    111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114,
-    9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15,
-    95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75,
-    2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5,
-    2,1,18,1,14,1,12,2,12,1,4,1,12,1,10,1,
-    2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1,
-    2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255,
-    8,2,14,1,14,3,8,255,6,3,6,3,22,1,18,255,
-    4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1,
-    114,156,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28,
-    0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124,
-    0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41,
-    4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243,
-    1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6,
-    115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0,
-    114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122,
-    101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2,
-    0,0,115,6,0,0,0,0,1,12,1,12,1,114,160,0,
-    0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-    0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,
-    116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,
-    100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0,
-    84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,
-    116,41,2,114,160,0,0,0,218,7,99,111,109,112,105,108,
-    101,41,2,114,53,0,0,0,114,159,0,0,0,114,9,0,
-    0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,
-    111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0,
-    0,115,4,0,0,0,0,1,8,1,114,162,0,0,0,99,
-    2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160,
-    1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63,
-    0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63,
-    0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64,
-    0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83,
-    0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5,
-    0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0,
-    0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0,
-    0,41,2,114,132,0,0,0,90,6,109,107,116,105,109,101,
-    41,2,218,1,100,114,139,0,0,0,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115,
-    101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0,
-    0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1,
-    10,1,2,0,2,0,2,249,114,170,0,0,0,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,
-    0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100,
-    1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130,
-    1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,
-    1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,
-    2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,
-    2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,
-    0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1,
-    0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41,
-    7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114,
-    164,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2,
-    114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115,
-    115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0,
-    0,114,170,0,0,0,114,26,0,0,0,218,10,73,110,100,
-    101,120,69,114,114,111,114,114,155,0,0,0,41,6,114,32,
-    0,0,0,114,13,0,0,0,114,54,0,0,0,114,132,0,
-    0,0,114,133,0,0,0,90,17,117,110,99,111,109,112,114,
-    101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,114,152,0,0,0,152,2,
-    0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10,
-    3,8,1,8,1,8,1,16,1,20,1,114,152,0,0,0,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1,
-    100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0,
-    130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14,
-    124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0,
-    116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0,
-    83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0,
-    100,0,83,0,41,3,78,114,14,0,0,0,114,171,0,0,
-    0,41,5,114,176,0,0,0,114,28,0,0,0,114,26,0,
-    0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32,
-    0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0,
-    0,0,114,9,0,0,0,114,10,0,0,0,114,150,0,0,
-    0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2,
-    2,1,14,1,14,1,8,2,114,150,0,0,0,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,
-    0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124,
-    1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125,
-    4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100,
-    1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1,
-    0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110,
-    20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89,
-    0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124,
-    0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124,
-    0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116,
-    10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114,
-    152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124,
-    8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124,
-    1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83,
-    0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123,
-    125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98,
-    111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114,
-    58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0,
-    114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114,
-    20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52,
-    0,0,0,114,156,0,0,0,114,162,0,0,0,114,3,0,
-    0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13,
-    0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0,
-    0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0,
-    0,114,127,0,0,0,114,46,0,0,0,114,9,0,0,0,
-    114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186,
-    2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1,
-    22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1,
-    18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0,
-    0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101,
-    0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100,
-    3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100,
-    7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100,
-    11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0,
-    0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115,
-    115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114,
-    116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95,
-    114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40,
-    41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97,
-    115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,
-    32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116,
-    104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112,
-    114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10,
-    32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114,
-    116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0,
-    0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,
-    0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,
-    124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114,
-    4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0,
-    114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2,
-    0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105,
-    112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82,
-    101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8,
-    0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0,
-    160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,
-    124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3,
-    125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3,
-    161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86,
-    1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0,
-    110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0,
-    114,110,0,0,0,114,0,0,0,0,41,1,218,7,66,121,
-    116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0,
-    0,90,2,105,111,114,178,0,0,0,114,4,0,0,0,114,
-    55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78,
-    111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32,
-    0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102,
-    117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114,
-    13,0,0,0,114,178,0,0,0,114,9,0,0,0,114,9,
-    0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114,
-    101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0,
-    0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38,
-    95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,
-    99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101,
-    115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
-    8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0,
-    0,41,1,114,179,0,0,0,41,2,114,32,0,0,0,114,
-    180,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97,
-    116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95,
-    90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99,
-    101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101,
-    95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72,
-    0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125,
-    2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122,
-    16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110,
-    22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89,
-    0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85,
-    0,0,0,114,110,0,0,0,70,84,41,5,114,38,0,0,
-    0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0,
-    114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0,
-    0,114,181,0,0,0,114,13,0,0,0,114,9,0,0,0,
-    114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114,
-    101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0,
-    0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36,
-    95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,
-    99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111,
-    117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0,
-    0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1,
-    124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2,
-    124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3,
-    106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9,
-    125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0,
-    93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4,
-    161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124,
-    1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0,
-    124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1,
-    107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8,
-    124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0,
-    124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114,
-    0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0,
-    0,41,15,90,7,112,97,116,104,108,105,98,114,185,0,0,
-    0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0,
-    90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0,
-    0,0,114,59,0,0,0,114,176,0,0,0,90,6,112,97,
-    114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23,
-    0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114,
-    32,0,0,0,114,185,0,0,0,90,13,102,117,108,108,110,
-    97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105,
-    118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101,
-    95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115,
-    101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114,
-    101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95,
-    110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0,
-    0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1,
-    6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1,
-    12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109,
-    112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,
-    101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6,
-    0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0,
-    0,0,114,81,0,0,0,114,34,0,0,0,114,182,0,0,
-    0,114,183,0,0,0,114,184,0,0,0,114,189,0,0,0,
-    114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
-    10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0,
-    0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11,
-    114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102,
-    114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,
-    101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0,
-    0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110,
-    95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114,
-    149,0,0,0,114,111,0,0,0,114,153,0,0,0,114,67,
-    0,0,0,114,132,0,0,0,90,7,95,95,97,108,108,95,
-    95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112,
-    97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0,
-    0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112,
-    101,114,70,0,0,0,114,114,0,0,0,114,116,0,0,0,
-    114,118,0,0,0,114,4,0,0,0,114,89,0,0,0,114,
-    36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27,
-    0,0,0,114,123,0,0,0,114,143,0,0,0,114,145,0,
-    0,0,114,52,0,0,0,114,148,0,0,0,114,156,0,0,
-    0,218,8,95,95,99,111,100,101,95,95,114,154,0,0,0,
-    114,160,0,0,0,114,162,0,0,0,114,170,0,0,0,114,
-    152,0,0,0,114,150,0,0,0,114,44,0,0,0,114,80,
-    0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,
-    0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,
-    62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1,
-    8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1,
-    14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127,
-    0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4,
-    8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46,
-    8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15,
-    8,26,
+    0,0,0,9,0,0,0,67,0,0,0,115,252,4,0,0,
+    122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38,
+    4,0,116,2,107,10,114,52,1,0,1,0,1,0,116,3,
+    100,1,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,1,144,4,143,168,1,0,122,36,
+    124,1,160,4,116,5,11,0,100,3,161,2,1,0,124,1,
+    160,6,161,0,125,2,124,1,160,7,116,5,161,1,125,3,
+    87,0,110,38,4,0,116,2,107,10,114,136,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,8,124,3,131,1,
+    116,5,107,3,114,168,116,3,100,4,124,0,155,2,157,2,
+    124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,2,
+    25,0,116,9,107,3,144,1,114,178,122,24,124,1,160,4,
+    100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,4,
+    87,0,110,38,4,0,116,2,107,10,114,248,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,10,124,4,116,11,
+    24,0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,
+    160,4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,
+    87,0,110,40,4,0,116,2,107,10,144,1,114,74,1,0,
+    1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,
+    100,2,141,2,130,1,89,0,110,2,88,0,124,6,160,12,
+    116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114,
+    116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2,
+    130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0,
+    125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,162,
+    116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2,
+    130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0,
+    125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1,
+    125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1,
+    125,9,124,2,124,8,107,0,144,1,114,238,116,3,100,12,
+    124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,
+    124,9,107,0,144,2,114,10,116,3,100,13,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0,
+    125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0,
+    144,2,114,54,116,3,100,14,124,0,155,2,157,2,124,0,
+    100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14,
+    124,1,160,4,124,2,161,1,1,0,87,0,110,40,4,0,
+    116,2,107,10,144,2,114,116,1,0,1,0,1,0,116,3,
+    100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,1,160,7,100,15,161,1,125,3,
+    116,8,124,3,131,1,100,5,107,0,144,2,114,150,116,14,
+    100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0,
+    100,17,107,3,144,2,114,172,144,4,113,224,116,8,124,3,
+    131,1,100,15,107,3,144,2,114,194,116,14,100,16,131,1,
+    130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1,
+    125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1,
+    125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1,
+    125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1,
+    125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1,
+    125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1,
+    125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1,
+    125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1,
+    125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1,
+    125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1,
+    125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1,
+    125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22,
+    124,9,107,4,144,3,114,154,116,3,100,27,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0,
+    125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0,
+    110,40,4,0,116,2,107,10,144,3,114,216,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,8,124,23,131,1,
+    124,19,107,3,144,3,114,250,116,3,100,4,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,122,50,116,8,124,1,
+    160,7,124,8,124,19,24,0,161,1,131,1,124,8,124,19,
+    24,0,107,3,144,4,114,42,116,3,100,4,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0,
+    116,2,107,10,144,4,114,84,1,0,1,0,1,0,116,3,
+    100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,13,100,28,64,0,144,4,114,106,
+    124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16,
+    100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10,
+    144,4,114,158,1,0,1,0,1,0,124,23,160,16,100,30,
+    161,1,160,18,116,19,161,1,125,23,89,0,110,2,88,0,
+    124,23,160,20,100,31,116,21,161,2,125,23,116,22,160,23,
+    124,0,124,23,161,2,125,24,124,24,124,14,124,18,124,4,
+    124,22,124,15,124,16,124,17,102,8,125,25,124,25,124,11,
+    124,23,60,0,124,12,100,32,55,0,125,12,144,2,113,118,
+    87,0,53,0,81,0,82,0,88,0,116,24,160,25,100,33,
+    124,12,124,0,161,3,1,0,124,11,83,0,41,34,78,122,
+    21,99,97,110,39,116,32,111,112,101,110,32,90,105,112,32,
+    102,105,108,101,58,32,114,12,0,0,0,114,86,0,0,0,
+    250,21,99,97,110,39,116,32,114,101,97,100,32,90,105,112,
+    32,102,105,108,101,58,32,233,4,0,0,0,114,0,0,0,
+    0,122,16,110,111,116,32,97,32,90,105,112,32,102,105,108,
+    101,58,32,122,18,99,111,114,114,117,112,116,32,90,105,112,
+    32,102,105,108,101,58,32,233,12,0,0,0,233,16,0,0,
+    0,233,20,0,0,0,122,28,98,97,100,32,99,101,110,116,
+    114,97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,
+    122,101,58,32,122,30,98,97,100,32,99,101,110,116,114,97,
+    108,32,100,105,114,101,99,116,111,114,121,32,111,102,102,115,
+    101,116,58,32,122,38,98,97,100,32,99,101,110,116,114,97,
+    108,32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,
+    32,111,114,32,111,102,102,115,101,116,58,32,233,46,0,0,
+    0,250,27,69,79,70,32,114,101,97,100,32,119,104,101,114,
+    101,32,110,111,116,32,101,120,112,101,99,116,101,100,115,4,
+    0,0,0,80,75,1,2,233,8,0,0,0,233,10,0,0,
+    0,233,14,0,0,0,233,24,0,0,0,233,28,0,0,0,
+    233,30,0,0,0,233,32,0,0,0,233,34,0,0,0,233,
+    42,0,0,0,122,25,98,97,100,32,108,111,99,97,108,32,
+    104,101,97,100,101,114,32,111,102,102,115,101,116,58,32,105,
+    0,8,0,0,218,5,97,115,99,105,105,90,6,108,97,116,
+    105,110,49,250,1,47,114,5,0,0,0,122,33,122,105,112,
+    105,109,112,111,114,116,58,32,102,111,117,110,100,32,123,125,
+    32,110,97,109,101,115,32,105,110,32,123,33,114,125,41,26,
+    218,3,95,105,111,218,9,111,112,101,110,95,99,111,100,101,
+    114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,107,
+    218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,73,
+    82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,101,
+    97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,95,
+    69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,120,
+    218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,69,
+    78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,69,
+    79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,0,
+    0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,101,
+    69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,101,
+    218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,0,
+    0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,0,
+    0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,0,
+    0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,112,
+    111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,218,
+    9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,95,
+    99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,100,
+    97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,114,
+    95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,102,
+    102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,116,
+    114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,108,
+    97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,116,
+    105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,9,
+    100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,95,
+    115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,101,
+    90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,11,
+    102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,0,
+    114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,0,
+    0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,0,
+    115,212,0,0,0,0,1,2,1,14,1,14,1,24,2,8,
+    1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,18,
+    1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,12,
+    2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,12,
+    1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,2,
+    255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,16,
+    1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,10,
+    1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,10,
+    1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,16,
+    1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,
+    1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,16,
+    1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,24,
+    2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,12,
+    1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,190,
+    1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,
+    13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,
+    29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,
+    45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+    61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+    77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+    93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,
+    109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,
+    125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,195,
+    165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,195,
+    132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,195,
+    187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,226,
+    130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,145,
+    194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,194,
+    161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,148,
+    130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,149,
+    226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,226,
+    149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,148,
+    156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,154,
+    226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,226,
+    149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,149,
+    153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,170,
+    226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,226,
+    150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,207,
+    131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,158,
+    207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,226,
+    137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,226,
+    136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,194,
+    160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+    0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116,
+    0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100,
+    2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,100,
+    5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116,
+    6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100,
+    1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110,
+    2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,160,
+    2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,
+    122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,
+    85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,
+    39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,
+    116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,
+    105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10,
+    100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112,
+    105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,
+    105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,
+    116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77,
+    0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,141,
+    0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,140,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114,
+    101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,0,
+    0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,14,
+    1,10,1,18,2,6,2,10,1,114,144,0,0,0,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9,
+    0,0,0,67,0,0,0,115,128,1,0,0,124,1,92,8,
+    125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,9,
+    124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,1,
+    116,1,160,2,124,0,161,1,144,1,143,8,125,10,122,14,
+    124,10,160,3,124,6,161,1,1,0,87,0,110,38,4,0,
+    116,4,107,10,114,102,1,0,1,0,1,0,116,0,100,3,
+    124,0,155,2,157,2,124,0,100,4,141,2,130,1,89,0,
+    110,2,88,0,124,10,160,5,100,5,161,1,125,11,116,6,
+    124,11,131,1,100,5,107,3,114,134,116,7,100,6,131,1,
+    130,1,124,11,100,0,100,7,133,2,25,0,100,8,107,3,
+    114,168,116,0,100,9,124,0,155,2,157,2,124,0,100,4,
+    141,2,130,1,116,8,124,11,100,10,100,11,133,2,25,0,
+    131,1,125,12,116,8,124,11,100,11,100,5,133,2,25,0,
+    131,1,125,13,100,5,124,12,23,0,124,13,23,0,125,14,
+    124,6,124,14,55,0,125,6,122,14,124,10,160,3,124,6,
+    161,1,1,0,87,0,110,40,4,0,116,4,107,10,144,1,
+    114,18,1,0,1,0,1,0,116,0,100,3,124,0,155,2,
+    157,2,124,0,100,4,141,2,130,1,89,0,110,2,88,0,
+    124,10,160,5,124,4,161,1,125,15,116,6,124,15,131,1,
+    124,4,107,3,144,1,114,52,116,4,100,12,131,1,130,1,
+    87,0,53,0,81,0,82,0,88,0,124,3,100,1,107,2,
+    144,1,114,76,124,15,83,0,122,10,116,9,131,0,125,16,
+    87,0,110,30,4,0,116,10,107,10,144,1,114,116,1,0,
+    1,0,1,0,116,0,100,13,131,1,130,1,89,0,110,2,
+    88,0,124,16,124,15,100,14,131,2,83,0,41,15,78,114,
+    0,0,0,0,122,18,110,101,103,97,116,105,118,101,32,100,
+    97,116,97,32,115,105,122,101,114,92,0,0,0,114,12,0,
+    0,0,114,104,0,0,0,114,98,0,0,0,114,93,0,0,
+    0,115,4,0,0,0,80,75,3,4,122,23,98,97,100,32,
+    108,111,99,97,108,32,102,105,108,101,32,104,101,97,100,101,
+    114,58,32,233,26,0,0,0,114,103,0,0,0,122,26,122,
+    105,112,105,109,112,111,114,116,58,32,99,97,110,39,116,32,
+    114,101,97,100,32,100,97,116,97,114,139,0,0,0,105,241,
+    255,255,255,41,11,114,3,0,0,0,114,110,0,0,0,114,
+    111,0,0,0,114,112,0,0,0,114,22,0,0,0,114,114,
+    0,0,0,114,51,0,0,0,114,119,0,0,0,114,1,0,
+    0,0,114,144,0,0,0,114,143,0,0,0,41,17,114,29,
+    0,0,0,114,54,0,0,0,90,8,100,97,116,97,112,97,
+    116,104,114,130,0,0,0,114,134,0,0,0,114,125,0,0,
+    0,114,137,0,0,0,114,131,0,0,0,114,132,0,0,0,
+    114,133,0,0,0,114,123,0,0,0,114,124,0,0,0,114,
+    135,0,0,0,114,136,0,0,0,114,127,0,0,0,90,8,
+    114,97,119,95,100,97,116,97,114,141,0,0,0,114,9,0,
+    0,0,114,9,0,0,0,114,10,0,0,0,114,52,0,0,
+    0,19,2,0,0,115,62,0,0,0,0,1,20,1,8,1,
+    8,2,14,2,2,1,14,1,14,1,24,1,10,1,12,1,
+    8,2,16,2,18,2,16,1,16,1,12,1,8,1,2,1,
+    14,1,16,1,24,1,10,1,14,1,18,2,10,2,4,3,
+    2,1,10,1,16,1,14,1,114,52,0,0,0,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,
+    0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124,
+    1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5,
+    0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49,
+    90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10,
+    0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2,
+    0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5,
+    0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8,
+    0,0,0,67,0,0,0,115,68,1,0,0,124,3,124,2,
+    100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3,
+    124,5,161,3,125,6,87,0,110,26,4,0,116,2,107,10,
+    114,54,1,0,1,0,1,0,89,0,100,0,83,0,89,0,
+    110,2,88,0,124,6,100,2,64,0,100,3,107,3,125,7,
+    124,7,114,190,124,6,100,4,64,0,100,3,107,3,125,8,
+    116,3,106,4,100,5,107,3,114,188,124,8,115,108,116,3,
+    106,4,100,6,107,2,114,188,116,5,124,0,124,2,131,2,
+    125,9,124,9,100,0,107,9,114,188,116,3,160,6,116,0,
+    106,7,124,9,161,2,125,10,122,20,116,8,160,9,124,4,
+    124,10,124,3,124,5,161,4,1,0,87,0,110,26,4,0,
+    116,2,107,10,114,186,1,0,1,0,1,0,89,0,100,0,
+    83,0,89,0,110,2,88,0,110,84,116,10,124,0,124,2,
+    131,2,92,2,125,11,125,12,124,11,144,1,114,18,116,11,
+    116,12,124,4,100,7,100,8,133,2,25,0,131,1,124,11,
+    131,2,114,254,116,12,124,4,100,8,100,9,133,2,25,0,
+    131,1,124,12,107,3,144,1,114,18,116,13,160,14,100,10,
+    124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,15,
+    160,16,124,4,100,9,100,0,133,2,25,0,161,1,125,13,
+    116,17,124,13,116,18,131,2,144,1,115,64,116,19,100,11,
+    124,1,155,2,100,12,157,3,131,1,130,1,124,13,83,0,
+    41,13,78,41,2,114,59,0,0,0,114,13,0,0,0,114,
+    5,0,0,0,114,0,0,0,0,114,86,0,0,0,90,5,
+    110,101,118,101,114,90,6,97,108,119,97,121,115,114,99,0,
+    0,0,114,94,0,0,0,114,95,0,0,0,122,22,98,121,
+    116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32,
+    102,111,114,32,122,16,99,111,109,112,105,108,101,100,32,109,
+    111,100,117,108,101,32,122,21,32,105,115,32,110,111,116,32,
+    97,32,99,111,100,101,32,111,98,106,101,99,116,41,20,114,
+    21,0,0,0,90,13,95,99,108,97,115,115,105,102,121,95,
+    112,121,99,114,75,0,0,0,218,4,95,105,109,112,90,21,
+    99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100,
+    95,112,121,99,115,218,15,95,103,101,116,95,112,121,99,95,
+    115,111,117,114,99,101,218,11,115,111,117,114,99,101,95,104,
+    97,115,104,90,17,95,82,65,87,95,77,65,71,73,67,95,
+    78,85,77,66,69,82,90,18,95,98,111,111,115,116,114,97,
+    112,95,101,120,116,101,114,110,97,108,90,18,95,118,97,108,
+    105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,29,
+    95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,115,
+    105,122,101,95,111,102,95,115,111,117,114,99,101,114,147,0,
+    0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,0,
+    0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,
+    115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,121,
+    112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,114,
+    32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,38,
+    0,0,0,114,126,0,0,0,90,11,101,120,99,95,100,101,
+    116,97,105,108,115,114,129,0,0,0,90,10,104,97,115,104,
+    95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,
+    117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,116,
+    101,115,114,150,0,0,0,90,12,115,111,117,114,99,101,95,
+    109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,105,
+    122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,0,
+    0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,104,
+    97,108,95,99,111,100,101,75,2,0,0,115,88,0,0,0,
+    0,2,2,1,2,254,6,5,2,1,18,1,14,1,12,2,
+    12,1,4,1,12,1,10,1,2,255,2,1,8,255,2,2,
+    10,1,8,1,4,1,4,1,2,254,4,5,2,1,4,1,
+    2,0,2,0,2,0,2,255,8,2,14,1,14,3,8,255,
+    6,3,6,3,22,1,18,255,4,2,4,1,8,255,4,2,
+    4,2,18,1,12,1,16,1,114,155,0,0,0,99,1,0,
+    0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,
+    0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,100,
+    1,100,2,161,2,125,0,124,0,160,0,100,3,100,2,161,
+    2,125,0,124,0,83,0,41,4,78,115,2,0,0,0,13,
+    10,243,1,0,0,0,10,243,1,0,0,0,13,41,1,114,
+    19,0,0,0,41,1,218,6,115,111,117,114,99,101,114,9,
+    0,0,0,114,9,0,0,0,114,10,0,0,0,218,23,95,
+    110,111,114,109,97,108,105,122,101,95,108,105,110,101,95,101,
+    110,100,105,110,103,115,126,2,0,0,115,6,0,0,0,0,
+    1,12,1,12,1,114,159,0,0,0,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,
+    0,0,0,115,24,0,0,0,116,0,124,1,131,1,125,1,
+    116,1,124,1,124,0,100,1,100,2,100,3,141,4,83,0,
+    41,4,78,114,74,0,0,0,84,41,1,90,12,100,111,110,
+    116,95,105,110,104,101,114,105,116,41,2,114,159,0,0,0,
+    218,7,99,111,109,112,105,108,101,41,2,114,53,0,0,0,
+    114,158,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
+    10,0,0,0,218,15,95,99,111,109,112,105,108,101,95,115,
+    111,117,114,99,101,133,2,0,0,115,4,0,0,0,0,1,
+    8,1,114,161,0,0,0,99,2,0,0,0,0,0,0,0,
+    0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,
+    115,68,0,0,0,116,0,160,1,124,0,100,1,63,0,100,
+    2,23,0,124,0,100,3,63,0,100,4,64,0,124,0,100,
+    5,64,0,124,1,100,6,63,0,124,1,100,3,63,0,100,
+    7,64,0,124,1,100,5,64,0,100,8,20,0,100,9,100,
+    9,100,9,102,9,161,1,83,0,41,10,78,233,9,0,0,
+    0,105,188,7,0,0,233,5,0,0,0,233,15,0,0,0,
+    233,31,0,0,0,233,11,0,0,0,233,63,0,0,0,114,
+    86,0,0,0,114,14,0,0,0,41,2,114,131,0,0,0,
+    90,6,109,107,116,105,109,101,41,2,218,1,100,114,138,0,
+    0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,218,14,95,112,97,114,115,101,95,100,111,115,116,105,109,
+    101,139,2,0,0,115,22,0,0,0,0,1,4,1,10,1,
+    10,1,6,1,6,1,10,1,10,1,2,0,2,0,2,249,
+    114,169,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,6,0,0,0,10,0,0,0,67,0,0,0,115,116,
+    0,0,0,122,82,124,1,100,1,100,0,133,2,25,0,100,
+    2,107,6,115,22,116,0,130,1,124,1,100,0,100,1,133,
+    2,25,0,125,1,124,0,106,1,124,1,25,0,125,2,124,
+    2,100,3,25,0,125,3,124,2,100,4,25,0,125,4,124,
+    2,100,5,25,0,125,5,116,2,124,4,124,3,131,2,124,
+    5,102,2,87,0,83,0,4,0,116,3,116,4,116,5,102,
+    3,107,10,114,110,1,0,1,0,1,0,89,0,100,6,83,
+    0,88,0,100,0,83,0,41,7,78,114,14,0,0,0,169,
+    2,218,1,99,218,1,111,114,163,0,0,0,233,6,0,0,
+    0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,0,
+    0,0,41,6,218,14,65,115,115,101,114,116,105,111,110,69,
+    114,114,111,114,114,28,0,0,0,114,169,0,0,0,114,26,
+    0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,114,
+    154,0,0,0,41,6,114,32,0,0,0,114,13,0,0,0,
+    114,54,0,0,0,114,131,0,0,0,114,132,0,0,0,90,
+    17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,105,
+    122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,114,151,0,0,0,152,2,0,0,115,20,0,0,0,0,
+    1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,16,
+    1,20,1,114,151,0,0,0,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,
+    0,115,86,0,0,0,124,1,100,1,100,0,133,2,25,0,
+    100,2,107,6,115,20,116,0,130,1,124,1,100,0,100,1,
+    133,2,25,0,125,1,122,14,124,0,106,1,124,1,25,0,
+    125,2,87,0,110,22,4,0,116,2,107,10,114,68,1,0,
+    1,0,1,0,89,0,100,0,83,0,88,0,116,3,124,0,
+    106,4,124,2,131,2,83,0,100,0,83,0,41,3,78,114,
+    14,0,0,0,114,170,0,0,0,41,5,114,175,0,0,0,
+    114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114,
+    29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0,
+    114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
+    10,0,0,0,114,149,0,0,0,171,2,0,0,115,14,0,
+    0,0,0,2,20,1,12,2,2,1,14,1,14,1,8,2,
+    114,149,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,198,
+    0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68,
+    0,93,160,92,3,125,3,125,4,125,5,124,2,124,3,23,
+    0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124,
+    6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124,
+    6,25,0,125,7,87,0,110,20,4,0,116,7,107,10,114,
+    88,1,0,1,0,1,0,89,0,113,14,88,0,124,7,100,
+    4,25,0,125,8,116,8,124,0,106,4,124,7,131,2,125,
+    9,124,4,114,132,116,9,124,0,124,8,124,6,124,1,124,
+    9,131,5,125,10,110,10,116,10,124,8,124,9,131,2,125,
+    10,124,10,100,0,107,8,114,152,113,14,124,7,100,4,25,
+    0,125,8,124,10,124,5,124,8,102,3,2,0,1,0,83,
+    0,113,14,116,11,100,5,124,1,155,2,157,2,124,1,100,
+    6,141,2,130,1,100,0,83,0,41,7,78,122,13,116,114,
+    121,105,110,103,32,123,125,123,125,123,125,114,86,0,0,0,
+    41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0,
+    0,0,114,57,0,0,0,114,58,0,0,0,41,12,114,36,
+    0,0,0,114,89,0,0,0,114,76,0,0,0,114,77,0,
+    0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0,
+    0,114,26,0,0,0,114,52,0,0,0,114,155,0,0,0,
+    114,161,0,0,0,114,3,0,0,0,41,11,114,32,0,0,
+    0,114,38,0,0,0,114,13,0,0,0,114,90,0,0,0,
+    114,91,0,0,0,114,47,0,0,0,114,63,0,0,0,114,
+    54,0,0,0,114,40,0,0,0,114,126,0,0,0,114,46,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,114,44,0,0,0,186,2,0,0,115,36,0,0,0,
+    0,1,10,1,14,1,8,1,22,1,2,1,14,1,14,1,
+    6,2,8,1,12,1,4,1,18,2,10,1,8,3,2,1,
+    8,1,16,2,114,44,0,0,0,99,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,
+    0,0,115,60,0,0,0,101,0,90,1,100,0,90,2,100,
+    1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100,
+    5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100,
+    9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100,
+    13,83,0,41,14,114,80,0,0,0,122,165,80,114,105,118,
+    97,116,101,32,99,108,97,115,115,32,117,115,101,100,32,116,
+    111,32,115,117,112,112,111,114,116,32,90,105,112,73,109,112,
+    111,114,116,46,103,101,116,95,114,101,115,111,117,114,99,101,
+    95,114,101,97,100,101,114,40,41,46,10,10,32,32,32,32,
+    84,104,105,115,32,99,108,97,115,115,32,105,115,32,97,108,
+    108,111,119,101,100,32,116,111,32,114,101,102,101,114,101,110,
+    99,101,32,97,108,108,32,116,104,101,32,105,110,110,97,114,
+    100,115,32,97,110,100,32,112,114,105,118,97,116,101,32,112,
+    97,114,116,115,32,111,102,10,32,32,32,32,116,104,101,32,
+    122,105,112,105,109,112,111,114,116,101,114,46,10,32,32,32,
+    32,70,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
+    124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0,
+    114,88,0,0,0,41,2,114,4,0,0,0,114,38,0,0,
+    0,41,3,114,32,0,0,0,114,4,0,0,0,114,38,0,
+    0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,114,34,0,0,0,220,2,0,0,115,4,0,0,0,0,
+    1,6,1,122,33,95,90,105,112,73,109,112,111,114,116,82,
+    101,115,111,117,114,99,101,82,101,97,100,101,114,46,95,95,
+    105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115,
+    92,0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,
+    125,2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,
+    100,3,100,4,108,2,109,3,125,4,1,0,122,18,124,4,
+    124,0,106,4,160,5,124,3,161,1,131,1,87,0,83,0,
+    4,0,116,6,107,10,114,86,1,0,1,0,1,0,116,7,
+    124,3,131,1,130,1,89,0,110,2,88,0,100,0,83,0,
+    41,5,78,114,85,0,0,0,114,109,0,0,0,114,0,0,
+    0,0,41,1,218,7,66,121,116,101,115,73,79,41,8,114,
+    38,0,0,0,114,19,0,0,0,90,2,105,111,114,177,0,
+    0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0,
+    0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69,
+    114,114,111,114,41,5,114,32,0,0,0,218,8,114,101,115,
+    111,117,114,99,101,218,16,102,117,108,108,110,97,109,101,95,
+    97,115,95,112,97,116,104,114,13,0,0,0,114,177,0,0,
+    0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,
+    218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,224,
+    2,0,0,115,14,0,0,0,0,1,14,1,14,1,12,1,
+    2,1,18,1,14,1,122,38,95,90,105,112,73,109,112,111,
+    114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,
+    46,111,112,101,110,95,114,101,115,111,117,114,99,101,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
+    0,0,0,67,0,0,0,115,8,0,0,0,116,0,130,1,
+    100,0,83,0,114,88,0,0,0,41,1,114,178,0,0,0,
+    41,2,114,32,0,0,0,114,179,0,0,0,114,9,0,0,
+    0,114,9,0,0,0,114,10,0,0,0,218,13,114,101,115,
+    111,117,114,99,101,95,112,97,116,104,233,2,0,0,115,2,
+    0,0,0,0,4,122,38,95,90,105,112,73,109,112,111,114,
+    116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46,
+    114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,
+    0,0,67,0,0,0,115,72,0,0,0,124,0,106,0,160,
+    1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,124,
+    1,155,0,157,3,125,3,122,16,124,0,106,2,160,3,124,
+    3,161,1,1,0,87,0,110,22,4,0,116,4,107,10,114,
+    66,1,0,1,0,1,0,89,0,100,3,83,0,88,0,100,
+    4,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0,
+    70,84,41,5,114,38,0,0,0,114,19,0,0,0,114,4,
+    0,0,0,114,55,0,0,0,114,22,0,0,0,41,4,114,
+    32,0,0,0,114,59,0,0,0,114,180,0,0,0,114,13,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,218,11,105,115,95,114,101,115,111,117,114,99,101,239,
+    2,0,0,115,14,0,0,0,0,3,14,1,14,1,2,1,
+    16,1,14,1,8,1,122,36,95,90,105,112,73,109,112,111,
+    114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,
+    46,105,115,95,114,101,115,111,117,114,99,101,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0,
+    0,99,0,0,0,115,186,0,0,0,100,1,100,2,108,0,
+    109,1,125,1,1,0,124,1,124,0,106,2,160,3,124,0,
+    106,4,161,1,131,1,125,2,124,2,160,5,124,0,106,2,
+    106,6,161,1,125,3,124,3,106,7,100,3,107,2,115,58,
+    116,8,130,1,124,3,106,9,125,4,116,10,131,0,125,5,
+    124,0,106,2,106,11,68,0,93,102,125,6,122,18,124,1,
+    124,6,131,1,160,5,124,4,161,1,125,7,87,0,110,24,
+    4,0,116,12,107,10,114,124,1,0,1,0,1,0,89,0,
+    113,78,89,0,110,2,88,0,124,7,106,9,106,7,125,8,
+    116,13,124,8,131,1,100,1,107,2,114,156,124,7,106,7,
+    86,0,1,0,113,78,124,8,124,5,107,7,114,78,124,5,
+    160,14,124,8,161,1,1,0,124,8,86,0,1,0,113,78,
+    100,0,83,0,41,4,78,114,0,0,0,0,41,1,218,4,
+    80,97,116,104,114,60,0,0,0,41,15,90,7,112,97,116,
+    104,108,105,98,114,184,0,0,0,114,4,0,0,0,114,56,
+    0,0,0,114,38,0,0,0,90,11,114,101,108,97,116,105,
+    118,101,95,116,111,114,29,0,0,0,114,59,0,0,0,114,
+    175,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101,
+    116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0,
+    218,3,97,100,100,41,9,114,32,0,0,0,114,184,0,0,
+    0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104,
+    90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90,
+    12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115,
+    117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108,
+    101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90,
+    11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0,
+    0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110,
+    116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8,
+    12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1,
+    18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1,
+    122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111,
+    117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101,
+    110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114,
+    34,0,0,0,114,181,0,0,0,114,182,0,0,0,114,183,
+    0,0,0,114,188,0,0,0,114,9,0,0,0,114,9,0,
+    0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0,
+    0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2,
+    8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114,
+    84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109,
+    112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108,
+    114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90,
+    17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108,
+    105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0,
+    0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0,
+    90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15,
+    112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114,
+    18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25,
+    0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113,
+    0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0,
+    0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0,
+    0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0,
+    114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114,
+    147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100,
+    101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0,
+    0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0,
+    0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0,
+    114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,
+    8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0,
+    0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1,
+    8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2,
+    4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1,
+    2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254,
+    2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7,
+    8,6,8,13,8,19,8,15,8,26,
 };
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 1084def..9880c0d 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1250,6 +1250,13 @@
         /* nothing */;
 #endif
 
+    /* Clear all loghooks */
+    /* We want minimal exposure of this function, so define the extern
+     * here. The linker should discover the correct function without
+     * exporting a symbol. */
+    extern void _PySys_ClearAuditHooks(void);
+    _PySys_ClearAuditHooks();
+
     /* Destroy all modules */
     PyImport_Cleanup();
 
diff --git a/Python/pystate.c b/Python/pystate.c
index 879a5a9..41c6622 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -45,8 +45,19 @@
 static _PyInitError
 _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
 {
+    /* We preserve the hook across init, because there is
+       currently no public API to set it between runtime
+       initialization and interpreter initialization. */
+    void *open_code_hook = runtime->open_code_hook;
+    void *open_code_userdata = runtime->open_code_userdata;
+    _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
+
     memset(runtime, 0, sizeof(*runtime));
 
+    runtime->open_code_hook = open_code_hook;
+    runtime->open_code_userdata = open_code_userdata;
+    runtime->audit_hook_head = audit_hook_head;
+
     _PyGC_Initialize(&runtime->gc);
     _PyEval_Initialize(&runtime->ceval);
     _PyPreConfig_InitPythonConfig(&runtime->preconfig);
@@ -181,6 +192,10 @@
 PyInterpreterState *
 PyInterpreterState_New(void)
 {
+    if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) {
+        return NULL;
+    }
+
     PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState));
     if (interp == NULL) {
         return NULL;
@@ -233,6 +248,8 @@
 
     interp->tstate_next_unique_id = 0;
 
+    interp->audit_hooks = NULL;
+
     return interp;
 }
 
@@ -240,11 +257,18 @@
 static void
 _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp)
 {
+    if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) {
+        PyErr_Clear();
+    }
+
     HEAD_LOCK(runtime);
     for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
         PyThreadState_Clear(p);
     }
     HEAD_UNLOCK(runtime);
+
+    Py_CLEAR(interp->audit_hooks);
+
     _PyCoreConfig_Clear(&interp->core_config);
     Py_CLEAR(interp->codec_search_path);
     Py_CLEAR(interp->codec_search_cache);
@@ -1057,6 +1081,10 @@
     PyObject *result;
     PyInterpreterState *i;
 
+    if (PySys_Audit("sys._current_frames", NULL) < 0) {
+        return NULL;
+    }
+
     result = PyDict_New();
     if (result == NULL)
         return NULL;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index d2b2761..7219f54 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1091,6 +1091,12 @@
     co = PyAST_CompileObject(mod, filename, flags, -1, arena);
     if (co == NULL)
         return NULL;
+
+    if (PySys_Audit("exec", "O", co) < 0) {
+        Py_DECREF(co);
+        return NULL;
+    }
+
     v = run_eval_code_obj(co, globals, locals);
     Py_DECREF(co);
     return v;
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 1735b90..5ebeacf 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -22,7 +22,9 @@
 #include "pycore_pymem.h"
 #include "pycore_pathconfig.h"
 #include "pycore_pystate.h"
+#include "pycore_tupleobject.h"
 #include "pythread.h"
+#include "pydtrace.h"
 
 #include "osdefs.h"
 #include <locale.h>
@@ -111,6 +113,308 @@
     }
 }
 
+static int
+should_audit(void)
+{
+    PyThreadState *ts = _PyThreadState_GET();
+    if (!ts) {
+        return 0;
+    }
+    PyInterpreterState *is = ts ? ts->interp : NULL;
+    return _PyRuntime.audit_hook_head
+        || (is && is->audit_hooks)
+        || PyDTrace_AUDIT_ENABLED();
+}
+
+int
+PySys_Audit(const char *event, const char *argFormat, ...)
+{
+    PyObject *eventName = NULL;
+    PyObject *eventArgs = NULL;
+    PyObject *hooks = NULL;
+    PyObject *hook = NULL;
+    int res = -1;
+
+    /* N format is inappropriate, because you do not know
+       whether the reference is consumed by the call.
+       Assert rather than exception for perf reasons */
+    assert(!argFormat || !strchr(argFormat, 'N'));
+
+    /* Early exit when no hooks are registered */
+    if (!should_audit()) {
+        return 0;
+    }
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
+    PyThreadState *ts = _PyThreadState_GET();
+    PyInterpreterState *is = ts ? ts->interp : NULL;
+    int dtrace = PyDTrace_AUDIT_ENABLED();
+
+    PyObject *exc_type, *exc_value, *exc_tb;
+    if (ts) {
+        PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
+    }
+
+    /* Initialize event args now */
+    if (argFormat && argFormat[0]) {
+        va_list args;
+        va_start(args, argFormat);
+        eventArgs = Py_VaBuildValue(argFormat, args);
+        if (eventArgs && !PyTuple_Check(eventArgs)) {
+            PyObject *argTuple = PyTuple_Pack(1, eventArgs);
+            Py_DECREF(eventArgs);
+            eventArgs = argTuple;
+        }
+    } else {
+        eventArgs = PyTuple_New(0);
+    }
+    if (!eventArgs) {
+        goto exit;
+    }
+
+    /* Call global hooks */
+    for (; e; e = e->next) {
+        if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
+            goto exit;
+        }
+    }
+
+    /* Dtrace USDT point */
+    if (dtrace) {
+        PyDTrace_AUDIT(event, (void *)eventArgs);
+    }
+
+    /* Call interpreter hooks */
+    if (is && is->audit_hooks) {
+        eventName = PyUnicode_FromString(event);
+        if (!eventName) {
+            goto exit;
+        }
+
+        hooks = PyObject_GetIter(is->audit_hooks);
+        if (!hooks) {
+            goto exit;
+        }
+
+        /* Disallow tracing in hooks unless explicitly enabled */
+        ts->tracing++;
+        ts->use_tracing = 0;
+        while ((hook = PyIter_Next(hooks)) != NULL) {
+            PyObject *o;
+            int canTrace = -1;
+            o = PyObject_GetAttrString(hook, "__cantrace__");
+            if (o) {
+                canTrace = PyObject_IsTrue(o);
+                Py_DECREF(o);
+            } else if (PyErr_Occurred() &&
+                       PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_Clear();
+                canTrace = 0;
+            }
+            if (canTrace < 0) {
+                break;
+            }
+            if (canTrace) {
+                ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
+                ts->tracing--;
+            }
+            o = PyObject_CallFunctionObjArgs(hook, eventName,
+                                             eventArgs, NULL);
+            if (canTrace) {
+                ts->tracing++;
+                ts->use_tracing = 0;
+            }
+            if (!o) {
+                break;
+            }
+            Py_DECREF(o);
+            Py_CLEAR(hook);
+        }
+        ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
+        ts->tracing--;
+        if (PyErr_Occurred()) {
+            goto exit;
+        }
+    }
+
+    res = 0;
+
+exit:
+    Py_XDECREF(hook);
+    Py_XDECREF(hooks);
+    Py_XDECREF(eventName);
+    Py_XDECREF(eventArgs);
+
+    if (ts) {
+        if (!res) {
+            PyErr_Restore(exc_type, exc_value, exc_tb);
+        } else {
+            assert(PyErr_Occurred());
+            Py_XDECREF(exc_type);
+            Py_XDECREF(exc_value);
+            Py_XDECREF(exc_tb);
+        }
+    }
+
+    return res;
+}
+
+/* We expose this function primarily for our own cleanup during
+ * finalization. In general, it should not need to be called,
+ * and as such it is not defined in any header files.
+ */
+void _PySys_ClearAuditHooks(void) {
+    /* Must be finalizing to clear hooks */
+    _PyRuntimeState *runtime = &_PyRuntime;
+    PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime);
+    assert(!ts || _Py_CURRENTLY_FINALIZING(runtime, ts));
+    if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts))
+        return;
+
+    if (Py_VerboseFlag) {
+        PySys_WriteStderr("# clear sys.audit hooks\n");
+    }
+
+    /* Hooks can abort later hooks for this event, but cannot
+       abort the clear operation itself. */
+    PySys_Audit("cpython._PySys_ClearAuditHooks", NULL);
+    PyErr_Clear();
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n;
+    _PyRuntime.audit_hook_head = NULL;
+    while (e) {
+        n = e->next;
+        PyMem_RawFree(e);
+        e = n;
+    }
+}
+
+int
+PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
+{
+    /* Invoke existing audit hooks to allow them an opportunity to abort. */
+    /* Cannot invoke hooks until we are initialized */
+    if (Py_IsInitialized()) {
+        if (PySys_Audit("sys.addaudithook", NULL) < 0) {
+            if (PyErr_ExceptionMatches(PyExc_Exception)) {
+                /* We do not report errors derived from Exception */
+                PyErr_Clear();
+                return 0;
+            }
+            return -1;
+        }
+    }
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
+    if (!e) {
+        e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
+        _PyRuntime.audit_hook_head = e;
+    } else {
+        while (e->next)
+            e = e->next;
+        e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
+            sizeof(_Py_AuditHookEntry));
+    }
+
+    if (!e) {
+        if (Py_IsInitialized())
+            PyErr_NoMemory();
+        return -1;
+    }
+
+    e->next = NULL;
+    e->hookCFunction = (Py_AuditHookFunction)hook;
+    e->userData = userData;
+
+    return 0;
+}
+
+/*[clinic input]
+sys.addaudithook
+
+    hook: object
+
+Adds a new audit hook callback.
+[clinic start generated code]*/
+
+static PyObject *
+sys_addaudithook_impl(PyObject *module, PyObject *hook)
+/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
+{
+    /* Invoke existing audit hooks to allow them an opportunity to abort. */
+    if (PySys_Audit("sys.addaudithook", NULL) < 0) {
+        if (PyErr_ExceptionMatches(PyExc_Exception)) {
+            /* We do not report errors derived from Exception */
+            PyErr_Clear();
+            Py_RETURN_NONE;
+        }
+        return NULL;
+    }
+
+    PyInterpreterState *is = _PyInterpreterState_Get();
+
+    if (is->audit_hooks == NULL) {
+        is->audit_hooks = PyList_New(0);
+        if (is->audit_hooks == NULL) {
+            return NULL;
+        }
+    }
+
+    if (PyList_Append(is->audit_hooks, hook) < 0) {
+        return NULL;
+    }
+
+    Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(audit_doc,
+"audit(event, *args)\n\
+\n\
+Passes the event to any audit hooks that are attached.");
+
+static PyObject *
+sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
+{
+    if (argc == 0) {
+        PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'");
+        return NULL;
+    }
+
+    if (!should_audit()) {
+        Py_RETURN_NONE;
+    }
+
+    PyObject *auditEvent = args[0];
+    if (!auditEvent) {
+        PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'");
+        return NULL;
+    }
+    if (!PyUnicode_Check(auditEvent)) {
+        PyErr_Format(PyExc_TypeError, "expected str for argument 'event', not %.200s",
+            Py_TYPE(auditEvent)->tp_name);
+        return NULL;
+    }
+    const char *event = PyUnicode_AsUTF8(auditEvent);
+    if (!event) {
+        return NULL;
+    }
+
+    PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
+    if (!auditArgs) {
+        return NULL;
+    }
+
+    int res = PySys_Audit(event, "O", auditArgs);
+    Py_DECREF(auditArgs);
+
+    if (res < 0) {
+        return NULL;
+    }
+
+    Py_RETURN_NONE;
+}
+
+
 static PyObject *
 sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
 {
@@ -1469,6 +1773,10 @@
 {
     PyFrameObject *f = _PyThreadState_GET()->frame;
 
+    if (PySys_Audit("sys._getframe", "O", f) < 0) {
+        return NULL;
+    }
+
     while (depth > 0 && f != NULL) {
         f = f->f_back;
         --depth;
@@ -1642,8 +1950,11 @@
 #endif   /* ANDROID_API_LEVEL */
 
 
+
 static PyMethodDef sys_methods[] = {
     /* Might as well keep this in alphabetic order */
+    SYS_ADDAUDITHOOK_METHODDEF
+    {"audit",           (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
     {"breakpointhook",  (PyCFunction)(void(*)(void))sys_breakpointhook,
      METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
     SYS_CALLSTATS_METHODDEF